标准文档流
元素排版布局过程中,元素会默认自动从左往右,从上往下的流式排列方式。前面内容发生了变化,后面的内容位置也会随着发生变化。
HTML就是一种标准文档流文件。
HTML中的标准文档流特点通过两种方式体现:微观现象和元素等级
- 微观现象
①空白折叠现象。
②文字类的元素如果排在一行会出现一种高低不齐、底边对齐效果。(图片以基线对齐)
③自动换行,元素内一行内容写满元素的 width 时会自动进行换行。
![2eec62e309f2a30f61ed1fe0644e274b.png](https://i-blog.csdnimg.cn/blog_migrate/3d8a66f31c11ff426035a9365993c35f.png)
img
![655384e03f63182093cd7ec4e6abde5e.png](https://i-blog.csdnimg.cn/blog_migrate/3aaeb7cba036c615ef07aebe2311a0a4.png)
img
- 元素等级
在标准流中,大部分元素是区分等级的,习惯将元素划分为几种常见的加载级别:块级元素、行内元素、行内块元素等。
块级元素:大部分容器级标签包括p标签都是块级元素,比如 <div> 、<h1> 等。
特点:
- 块级元素可以设置宽高,在浏览器中正常加载。
- 块级元素必须独占一行,不能与其他任何标签并排一行。
- 块级元素如果不设置宽度,会自动撑满父级的 width 区域;高度不设置,会被内容自动撑开高度。
行内元素:大部分的文本级标签,比如 <span>、<a>、<b> 等。
特点:
- 行内元素不能正常加载宽度和高度属性,其他的盒模型属性虽然能设置,但易有加载问题。
- 行内元素可以与其他的行内或行内块元素并排一行显示。
- 行内元素不论是否设置宽高,宽度和高度都只能被内容自动撑开。
![f2b883dc8aeafbefedcb684adb3dceb4.png](https://i-blog.csdnimg.cn/blog_migrate/98ce52714668bd4385cc3249bd47cd2b.png)
![f3ae400d027e02def2b9418e98a06229.png](https://i-blog.csdnimg.cn/blog_migrate/c0a4df1ef5bab11679a58018b40cc2c8.png)
![bb22846470eaf88e92919d8f1ca32aa3.png](https://i-blog.csdnimg.cn/blog_migrate/a91bb83e34f7db7d8b9b52a72cd5b908.png)
span 设置padding属性30px 但是padding是以它原来的位置向四周扩散30px 并不是让span 下移再添加 因此盖住了原来的内容 border也相同
行内块元素:比如 <img>、<input> 等。
- 行内块元素可以设置宽度和高度。
- 行内块元素可以与其他的行内或行内块并排一行显示。
- 行内块元素如果不设置宽高,要么以原始尺寸加载要么被内容自动撑开。
- 行内块依旧具有标准流的微观性质,例如空白折叠现象。
显示模式 display
标准流中的元素有自己默认的浏览器加载模式,但是加载模式不是一成不变的,后期可以通过 display 属性更改一个标签的显示模式。
元素根据属性值不同,可以加载对应元素等级的显示模式的特点
![6b715d51337fc0d7e82dd9ba40cf26c3.png](https://i-blog.csdnimg.cn/blog_migrate/9a463ad371ae1684fd8d07050a5fb841.png)
脱离标准流
display 属性更改的显示模式并没有改变标准流本质性质,页面还是只能从上往下加载,存在空白折叠现象等微观性质。要想实现更多的界面布局效果需要脱离标准流的限制。
标签元素脱离标准流的方法包括:浮动、绝对定位、固定定位。
浮动
浮动让元素脱离标准流,同一级的浮动的元素可以并排在一排显示。
属性值: left 左浮动 right 右浮动
- 浮动的性质:
1.浮动的元素脱离标准流
浮动的元素脱离了标准流的限制,具备行块二象性,浮动的元素可以设置宽高,还可以并排一行,而且不会有空白折叠现象,如果元素不设置宽高,可以被元素内容自动撑开。
2.浮动的元素依次贴边
浮动方向设置不同,进行布局时,加载位置方向不同。
以 left 为例:父元素宽度足够,所有子元素会按照HTML书写顺序,依次向左进行贴边
父元素左边←子元素1←子元素2← 子元素3←子元素4。
!父元素宽度如果不够,例如不能放下一个子元素4,那么子元素4在贴边时,会跳过上一个子元素3,向更上一个子元素2进行贴边,如果子元素2后面位置不够,继续跳过子元素2向前面的子元素1进行贴边。
![76b0e0bfaf6dd0532dabca67addab1ef.png](https://i-blog.csdnimg.cn/blog_migrate/fa5e86d40fc08e7915d7a7f577fe3a8e.png)
![7dfee46d27118471a659ddca454a015e.png](https://i-blog.csdnimg.cn/blog_migrate/277921da11b5413858ee835e346ec9b9.png)
![54c36795cf759730d9b1a67ae6cb42c4.png](https://i-blog.csdnimg.cn/blog_migrate/529f2180724d9abc249dad2b713ac2a6.png)
![7002b545cb2e56af088300997bc9bca3.png](https://i-blog.csdnimg.cn/blog_migrate/51bbad07fdcca991b96f1c9e747aa156.jpeg)
![6ed2db7b65c4bc3c4e5c4ef56383046a.png](https://i-blog.csdnimg.cn/blog_migrate/e9b207e39f29fce328a960888a416116.jpeg)
![3894d26451f9505691076d49de04e8fb.png](https://i-blog.csdnimg.cn/blog_migrate/f2fa1110b6a0e1c53551828889db6b18.png)
浮动依次贴边的应用 ---做表格
![0090e1faf9d7ec9443273d74376e268d.png](https://i-blog.csdnimg.cn/blog_migrate/b238a8aee04610fd037cc9ab7a0abdcb.png)
表格边框线 不是border 而是用 padding和margin 模拟出来的
!!一定要注意 是li的背景色覆盖ul的背景色 从而让边框露出 所以浅色的是ul
同一个盒子中,可以有左浮动和右浮动的子盒子并存,子盒子会根据浮动方向,向上一个同方向的子盒子进行贴边,如果空间不够,也会发生之前依次贴边的各种情况。
![247e9d9c511491d7ccf2649d3ee51d03.png](https://i-blog.csdnimg.cn/blog_migrate/c82d9dcc8ee5cef746085453f3137dbb.png)
![b2dd8a54fb8e3f7e6110bc511ecbdfb8.png](https://i-blog.csdnimg.cn/blog_migrate/4f971fbe2c3ce768842b759553b0502d.jpeg)
!!! 这种布局 只需要一个父盒子 里面再装子元素即可 不需要再分别套盒子
![7df3e68142e82abb65317d699b212486.png](https://i-blog.csdnimg.cn/blog_migrate/896a8e0dc3980ecaa8a00a3b86ae0ba3.jpeg)
3.浮动的元素没有margin塌陷
4.浮动的元素让出标准流位置
元素浮动之后,脱离了标准流,会将原来占有的标准流位置让给后面的一个同级元素。
![79a2b048090800aa95c39a1af456a931.png](https://i-blog.csdnimg.cn/blog_migrate/76e99fc230f44b449363931fea4fc002.png)
!在 IE6 , 7浏览器中有兼容问题 IE7 没有压盖住而是水平排列 IE5 不仅水平排列还会有空隙
因此这种效果用定位来实现 另外如果没有特殊需求,不允许一个父元素中的子元素有的浮动有的不浮动,同级元素中有一个浮动其他的也要浮动。
![179041efda659fe74d14430769b53f7a.png](https://i-blog.csdnimg.cn/blog_migrate/bd3cc44502eb0dea86d8bb940e858581.png)
5.字围现象
与压盖效果结构类似,同级元素中前面的元素浮动,后面的元素不浮动,不浮动的元素内部还有一些文字,浮动的蓝盒子会压盖住粉盒子的一部分,但是文字内容不会被盖住,粉盒子中的文字会让开蓝盒子位置,围绕它进行加载。
可利用字围现象制作一些特殊的图文混排布局效果 这存在 IE兼容问题
![7491971eba6c502d91ee80020de2a3fb.png](https://i-blog.csdnimg.cn/blog_migrate/f9e2e3ceb0e46c8ba5810a8340bb9cae.png)
- 浮动的问题
标准流中的元素若不设置高度,会被内部的标准流元素自动撑高。如果内部的子元素进行了浮动,浮动的子元素是撑不高标准流中父元素的。
![2e9fb76962acc65d5c6d725eaa8b9fb6.png](https://i-blog.csdnimg.cn/blog_migrate/a8bc799f08c440bdf5c37632c22d94b6.png)
父元素没有高度,会影响后面元素的标准流位置,如果浮动的子元素足够高时,有可能影响到后面浮动元素的贴边。
![223504fbebe053668ab62284bb12b5a2.png](https://i-blog.csdnimg.cn/blog_migrate/6301f9866e398823ab4cc692d0db1c49.png)
以上问题解决方法就是清除浮动带来的影响
- 清除浮动
- 给标准流的父元素一个合适的高度 但父元素高度不是自适应
![98c6c66b636285cddb97f19b5a419593.png](https://i-blog.csdnimg.cn/blog_migrate/98b11c7186864908c64edc07c4cd9d68.png)
2.给标准流父元素添加 clear 属性,父元素不受前面浮动影响,不会再占有浮动让出的位置。
属性: left 清除前面左浮动带来的影响 right 右浮动 both 清除前面所有浮动带来的影响
问题:父元素不能高度自适应,两个父元素之间如果有 margin 效果不正确
![53832dbfc407b32f540afeaeabbba218.png](https://i-blog.csdnimg.cn/blog_migrate/e86a01ac7c58e6bdb926bfa12cb45db6.png)
![5249519733f51cf1714ad2072ecdb691.png](https://i-blog.csdnimg.cn/blog_migrate/f3d39748b3b0bb68149e39a2046cbf7f.jpeg)
3.隔墙法
外墙法:
在两个大的父盒子之间,添加一个空的 <div> 标签,标签上带有 clear:both 属性。
![526d6f88f967352b4258645317242836.png](https://i-blog.csdnimg.cn/blog_migrate/22c2cd05fdd29183ad46ca1b97e52477.png)
问题:父元素没有高度自适应
内墙法:
在父元素内 所有浮动子元素后添加一个空的 <div> 元素,标签高度为 0,添加 clear属性。
![293a5d410f98aaae571a00dde4009066.png](https://i-blog.csdnimg.cn/blog_migrate/f02a88c43ef64abe3c503825f018003d.png)
![c79350d7f4b7874941f46383d1c896aa.png](https://i-blog.csdnimg.cn/blog_migrate/7282eeaf1ad2fd9da112d1e0b868f90c.png)
!!原理: 在父元素中 (红色边框内) 前面4个元素都是浮动的(蓝色) 都不能撑开父元素,但是在他们的后面我们添加了一个标准流元素.cl 由于其已经设置了clear 属性,已经清除了前后浮动元素所带来的影响,(它不会占有因浮动而让出的位置)它按标准流的方式排列,虽然他没有高度,但因为他位置在浮动元素的下面,所以他撑起了父元素的高度
缺点:浮动是 css 样式属性带来的问题,内墙法使用 HTML 结构去辅助解决问题,如果页面中浮动元素很多,需要添加多个没有语义的空标签,造成 HTML 结构的冗余。
4.伪类
本质是使用伪类方法利用css代码书写一堵内墙。
伪类选择器:通过选中的标签添加伪类,去选中标签的某个状态或位置。
:after:这个伪类表示选中的是某个标签内部的最后的位置。
书写方法:前面必须加普通的选择器,后面连续书写伪类名称。
将伪类添加给一个选中父盒子的选择器后面,一般给需要清除浮动的父盒子设置一个clearfix的类名。
![f9cccf119478517ecf07852fbb5ee293.png](https://i-blog.csdnimg.cn/blog_migrate/0a2815c3767514b5912df8efc81531d8.png)
5.溢出隐藏
给内部有浮动子元素的父元素添加overflow: hidden; 属性,可解决浮动的所有问题。
但该方法实际和清除浮动无关,但有用
!!原理:
元素高度设置后,overflow:hidden;效果是将超过高度的部分直接隐藏。
元素高度没设置,若元素同时设置了overflow:hidden属性,元素会自适应内容的高度。
![4f75496c5ede3b9f36072cef3c38f54a.png](https://i-blog.csdnimg.cn/blog_migrate/a465c55efbe59b5008dcf2c76d88d27c.jpeg)
高度自适应原因:一个元素没有设置高度,同时设置了溢出隐藏,浏览器在加载盒子尺寸时,遇到溢出隐藏浏览器会强制性去检索内部的子元素的高度,不论子元素是标准流还是浮动,都会将最高的高度作为父盒子高度加载。
浮动影响后面的元素:父元素有了高度后,可以管理住内部所有的浮动元素,不会延伸到后面标签中影响贴边。