前端开发总是要先看设计稿的🐶看完设计稿你要想好用什么CSS样式完成合适且灵活的布局——甚至不止一种布局方法。
布局的发展
面试官:CSS3新增了哪些新特性?
最开始靠HTML
CSS3
按时间顺序,有链接的是相关阅读。
- 自适应网页设计(Responsive Web Design)
- 媒体查询(Media Query):根据视口大小调整
- Flex Box
- Grid
- 内在Web设计(intrinsic web design)| 还有一篇中文的相关文章
- 容器查询(Container Queries): 根据父组件大小调整
Flexbox
适用于一维布局。
给父元素设置
.parent {display: flex;}
此时子元素就都被设置为了flex item。这意味着你可以很方便地控制他们的主轴和交叉轴的对齐方式、展示顺序、收缩或舒展程度。
.parent div {flex-grow: 1;flex-shrink: 0;flex-basis: auto;//或是直接flex:1 0 auto;}
Grid
利用网格,方便地进行二维布局。
.parent {display: grid;grid-template-columns: repeat(12, 1fr);gap: 1rem;}
这里1fr就是空间的1/2,gap就是间隙宽度。
在单项中还能通过设置grid-row``gird-column,设置某一个块的始末位置,用/隔开。
.parent :first-child {grid-row: 1/3;grid-column: 1/4;}
普通流布局
如果你没有使用上面的两种布局方法,文档中的元素则会处在正常布局流(normal flow)。
block
- block 元素独占一行,多个 block各自新起一行
- 元素宽度默认自动填满其父元素宽度。
- 可以设置 width、height
-
inline
不会新起一行,多个相邻的行内元素会排列在同一行里——默认情况下,排不下话则会换行
- 宽度随元素内容变化
- width、height设置无效
-
inline-block
将对象呈现为 inline 对象,但是对象内容作为 block 对象。
内联对象会被排列在同一行内
- 前后无换行符
-
Float
img {float: right;}
设置 float 后会使得兄弟元素“环绕”它,也就可以实现报纸上的文字围绕图片的效果。
注意:
浮动元素后的任何元素都有可能改变布局,并且可能带来一些不想要的效果。此时可以设置清除浮动,
这里写两个简短的方法:
给浮动元素后面的元素设置**clear: both**img+p{clear: both;}
给父元素设置
**display: flow-root**.parent{display: flow-root;}
多列布局
如果你设置了一个非常长的列表,里面就会有很多个
<li>。这会消耗掉用户的很多滚动空间,以及一侧大量的留白。而在ul或是ol设置多列布局就可以解决这个恼人的问题。.list{column-count: 3;column-gap: 1em;}
比如上面这样设置就会将所有
li分为三列,并设置列间距为1em。
也可以直接设置列宽.list{width: 100%;column-width: 130px;column-gap: 1em;}
这样列数就会随着页面可用空间宽度而变化,越宽列数自然也就越多。又是一个响应式设计的妙招呢
定位
通过设置 position改变元素在正常流中的行为以及与其他元素的关系。
相对定位(relative)
元素一开始将出现在本该出现的位置
- 通过设置垂直水平方向上的位移,该元素就会相对于一开始的起点进行移动
- 不论如何,元素都会占据原来的空间
-
绝对定位(absolute)
位置相对于最近的已经定位了的元素,如果没有那就是
<html>- 常与相对定位配合使用:子绝父相
- 元素位置与文档流无关,因此不占据空间
-
固定定位(fixed)
相对于浏览器窗口是固定位置,窗口滚动它也不会移动
- 大概就是父元素锁定为 html 的绝对定位
- 与文档流无关,不占据空间
-
粘性定位(sticky)
一开始先按照普通文档流定位
- 然后相对于该元素在流中的
flow root(BFC)和containing block(最近的块级祖先元素)定位 元素定位表现为跨越特定阈值前为相对定位,之后为固定定位
出现在正常的流中
- 忽略 top、bottom、left、righ、z-index 的设置。
继承 (inherit)
从父元素中继承 position 属性的值。none
从文档流中消失
