position: sticky粘性定位
Sticky positioning is a hybrid of relative and fixed positioning. The element is treated as relative positioned until it crosses a specified threshold, at which point it is treated as fixed positioned.
Sticky positioning is commonly used for the headings in an alphabetized listing. The B heading will appear just below the items that begin with A until they are scrolled offscreen. Rather than sliding offscreen with the rest of the content, the B heading will then remain fixed to the top of the viewport until all the B items have scrolled offscreen, at which point it will be covered up by the C heading.
12 > #one { position: sticky; top: 10px; }>
- 通俗点说
position: sticky
就像是相对定位和固定定位的结合体,设置了该属性的元素:- 不会脱离普通流,并保留元素在普通流中占位的大小
- 若元素的的位置超出了容器的可视区域,元素在容器内固定在指定位置
- 当祖先元素整体超出了容器的可视区域后,position由
fixed
转为relative
- 激活条件:至少设置
top
,bottom
,left
,right
中的一个 一种应用场景——单词字母表。比如字母B下有3个单词
boy
、body
、beauty
,然后是字母C,依次下去。当B字母下的单词还在显示屏上的时候,字母B的position
属性为fixed
固定显示在屏幕上,当以B开头的单词在屏幕上消失后,字母B的position
属性变为relative
1234567891011121314151617181920212223242526<div><dl><dt>A</dt><dd>apple</dd><dd>app</dd><dd>age</dd><dd>add</dd></dl><dl><dt>B</dt><dd>boy</dd><dd>body</dd><dd>beauty</dd><dd>before</dd><dd>bcz</dd></dl><dl><dt>C</dt><dd>cat</dd><dd>cat</dd><dd>cat</dd><dd>cat</dd><dd>cat</dd><dd>cat</dd></dl></div>12345678910* {margin: 0;}dt {background-color: #999;position: -webkit-sticky;position: sticky;top: 0; /* 设置固定的位置*/}
在线demo:由于兼容性原因请在Firefox或者Safari里打开,同时缩放浏览器至出现垂直滚动条
参考资料:
4种方式实现左右定宽中间自适应的三栏布局
NO.1 创建BFC,利用BFC不和浮动元素重叠的特性
HTML核心部分
- 三栏的顺序分别为
左-右-中
- 左右两栏分别设置宽度以及左浮动和右浮动,脱离普通流,这时如果让中间栏高度大于2个边栏会发现两边栏实际上是叠在
main
上面的,因为main
是块状元素,独占一行,浮动元素向相应的方法浮动,直到遇到容器的边框 - 中间栏设置
overflow:hidden
创建BFC,这样就可以利用BFC不和浮动元素重叠的特性,让main
的宽度自适应 - 具体有关BFC的内容可以参考下面的链接123<div class="left">左边定宽</div><div class="right">右边定宽</div><div class="main">中间自适应</div>
CSS核心部分
在线demo
参考资料:关于Block Formatting Context
NO.2 圣杯布局
HTML核心部分
- 三栏的顺序为
中-左-右
,并包裹在warp
容器内 - 三栏同时设置
float:left
,左右两栏定宽、中间宽度100% - 利用负边距分别把
left
和right
,这时视觉上left
和right
是叠在main
上面的 - 设置
warp
的左右padding分别为左右栏的宽度 - 利用相对定位让
left
和right
回到合适的位置12345<div class="warp"><div class="main">中间自适应</div><div class="left">左边定宽</div><div class="right">右边定宽</div></div>
CSS核心部分
left
与main
之间的20px间隔,可以利用相对定位时多加20个像素实现,同时warp
设置padding的时候把这20px加进去left
与warp
之间的20间隔,直接加20px的padding-left到warp
上123456789101112131415161718192021222324252627.main {width:100%;float:left;background-color: red;height:300px;}.left {float: left;background-color: blue;height: 200px;width: 200px;margin-left: -100%;position: relative;left: -200px;}.right {float: left;background-color: yellow;height: 400px;width: 120px;margin-left: -120px;position: relative;right: -120px;}.warp {padding: 0 120px 0 200px;}
在线demo
参考资料:
NO.3 双飞翼布局
- 双飞翼布局跟圣杯很像,区别在于圣杯利用padding控制
main
的位置,双飞翼用margin
控制main
的位置 - 需要额外在main里面加一层
div
,用于margin控制,但是可以免去左右两栏的相对定位
HTML核心部分
CSS核心部分
NO.4 flex布局
HTML核心部分
- 三栏的顺序为
左-中-右
,并包裹在warp
容器内 warp
设置display: flex
,如果三栏高度自适应又希望顶部对齐,需要添加align-items: flex-start
- 左右栏各自设置定宽12345<div class="warp"><div class="left">左边定宽</div><div class="main">中间自适应</div><div class="right">右边定宽</div></div>
CSS核心部分
在线demo
参考资料:
关于兼容性
- 前三种方法支持IE8及以上浏览器和各种现代浏览器,demo里用了1个css3伪元素
last-child
,所以在IE8下面右边栏最后一个logo会有问题 - flex布局部分支持IE10+和现代浏览器,具体参见CAN I USE
关于浮动清除
关于浮动清除,推荐几个资料
- 那些年我们一起清除过的浮动由于原链接打不开了,这里贴个转载的,感谢一丝冰凉大神
- The very latest clearfix reloaded
目前最优雅的打开清除浮动方式应该是这样的(具体理由参考上面第二篇)