前端开发总是要先看设计稿的🐶看完设计稿你要想好用什么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
从文档流中消失