Flex布局
弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。容器存在两根轴:水平主轴(main axis)和垂直交叉轴(crosss axis)
默认情况
flex-direction: row; flex-wrap: nowrap; flex-item子元素沿水平主轴由左向右排列,nowrap的意思是让子元素排一行,假如宽度不够的时候全部子元素缩小。
1 | <div class="flex-container" style="display: flex;"> |
容器属性
1、flex-direction: 改变主轴1
2flex-direction: row | row-reverse | column | column-reverse;
// row(默认)沿水平主轴由左向右排列、row-reverse沿水平主轴由右向左排列、column沿垂直主轴右上到下和column-reverse。
2、flex-wrap: 是否让子元素一行显示1
2flex-wrap: nowrap | wrap | wrap-reverse;
// nowrap(默认)不换行,让项目一行展示;wrap:宽度不够换行展示;wrap-reverse:换行且反向展示。
3、flex-flow:将flex-direction和flex-wrap一起设置1
flex-flow: <flex-direction> || <flex-wrap>;
4、justify-content: 项目在主轴上的对齐方式(看flex-direction的设置)1
2
3
4
5
6
7
8
9justify-content: flex-start | flex-end | center | space-between | space-around;
// flex-start:在主轴上由左或者上开始排列。flex-end:在主轴上由右或者下开始排列。
// center:在主轴上居中排列。space-between:在主轴上左右两端或者上下两端开始排列。
// space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
<div class="flex-container" style="width: 100%; height: 300px; display: flex; flex-direction: column; justify-content: center;">
<p class="flex-item">我是第一个项目</p>
<p class="flex-item">我是第二个项目</p>
</div>
5、align-items: 项目在非主轴上的对齐方式1
2
3align-items: flex-start | flex-end | center | baseline | stretch;
// baseline: 文字在水平一条线上
// stretch: 让项目在非主轴上撑满
项目属性
1、order: 项目在主轴上的排列顺序。数值越小,排列越靠前,默认为0。1
order: <integer>
2、flex-grow:项目的放大比例,默认为0,即如果存在剩余空间,也不放大。1
flex-grow: <number>;
3、flex-shrink:项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。1
flex-shrink: <number>;
响应式布局
视口
移动前端中常说的 viewport (视口)就是浏览器中用于呈现网页的区域。手机端与 PC 端视口存在差异,电脑端的视口宽度等于分辨率,而移动端的视口宽度跟分辨率没有关系,iOS, Android 基本都将这个视口分辨率设置为 980px。乔布斯设置成980px因为是绝大多数 PC 网页的版心宽度。不过网页基本会缩放,页面缩放后文字会变得非常小,用户需要手动放大缩小才能看清楚,体验非常差。
1 | // 解决方案: |
约束后的视口
手机厂商会设置约束视口,宽度大概在320~480 之间。能够保证我们的文字比如 16px,在自己的这个视口下清晰、大小刚刚合适。
流式布局
百分比布局也叫作流式布局、弹性盒布局。百分比能够设置的属性是 width、height、padding、margin。其他属性比如 border、font-size 不能用百分比设置的。
1 | 如果用百分比写 width,那么指的是父元素 width 的百分之多少。 |
媒体查询
我们在媒体查询外面写的第一条规则,是“基本的”样式,它适用于任何设备。在此基础上,我们再为不同视口、不同能力的设备,渐进增加不同的视觉效果和功能。
1 | body { |
rem响应式布局
一般不要给元素设置具体的宽度,但是对于一些小图标可以设定具体宽度值
高度值可以设置固定值,设计稿有多大,我们就严格写多大
所有设置的固定值都用 REM 做单位
1 | // 实现方式 |
BFC
什么是BFC
BFC: 块级格式化上下文 (Block Fromatting Context)。他提供了一个环境,在这个环境中的元素不会影响到其它环境中的布局。
如何创建BFC:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-block、table-cell、flex、table-caption、inline-flex),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。
BFC是一个容器,用于管理块级元素。并规定了内如如何布局,与外面毫不相干。
BFC特性
1、BFC会阻止垂直外边距折叠1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 按照BFC的定义,只有同属于一个BFC时,两个元素才有可能发生垂直margin的重叠,这个包括相邻元素或者嵌套元素,只要他们之间没有阻挡(比如边框、非空内容、padding等)就会发生margin重叠。
<div>
<p>1</p>
<p>2</p>
</div>
div{ background: #ddd; overflow: hidden; }
p{ margin: 20px; background:red; } // p会合并
// 解决方案
<div>
<p>1</p>
<div class="wrap">
<p>2</p>
</div>
</div>
.wrap{
overflow:hidden;
} // 只需要在p外面包裹一层容器,并触发该容器生成一个BFC。那么两个P便不属于同一个BFC,就不会发生margin重叠了。
2、父子元素margin重叠1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<p>first p</p>
<div class="wrap">
<h1>h1</h1>
</div>
<p>second p</p>
.wrap {
background:yellow;
}
.wrap h1{
height:20px;
background:pink;
margin:40px;
} // .wrap只有20px,并没有margin高度
// 解决方案
.wrap {
background:yellow;
overflow: hidden; // 转为BFC
}
3、清除浮动(另一种方法:伪元素clear:both;清除浮动)1
2
3
4
5
6
7
8
9
10
11
12
13
14<div>
<p></p>
<p></p>
</div>
div{
background: #ddd;
overflow: hidden; // 由于容器内两个div元素浮动,脱离了文档流,父容器内容宽度为零(即发生高度塌陷)
}
p{
width: 20px;
height: 20px;
border: 1px solid blue;
float: left;
}
页面布局
css实现省略号
单行省略号
1 | overflow: hidden; |
实现多行省略
因使用了WebKit的CSS扩展属性,该方法适用于WebKit浏览器及移动端;1
2
3
4display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
字母自动换行
1 | word-break: normal|break-all|keep-all; |
伪类和伪元素
伪类
:focus, :hover, :actived, :visted, :first-child, :last-child, :first-of-type, :last-of-type, :nth-child(n), :nth-child(odd), :nth-child(even)等
易错题
1 | <div> |
伪元素
::after, ::before, ::first-letter, ::first-line, ::selection, ::backdrop
水平垂直居中
行内元素水平居中
1 | .parent{ |
块级元素水平居中
1 | // margin |
浮动元素水平居中
1 | <div class="parent"> |
绝对定位元素水平居中
1 | // margin: 0 auto; left: 0; right: 0; |
垂直居中
1 | // line-height + height |
水平垂直居中
1 | // margin+absolute |