CSS可见格式化模型
1.盒模型
1.1 盒子大小
盒模型描述了元素如何显示,以及如何相互作用、相互影响。
页面中的所有元素都被看作一个矩形盒子,这个盒子包含元素的内容、内边距、边框和外边距。
给元素应用的背景会作用于元素内部和内边距。
外边距用于在页面中控制元素之间的距离。
对元素盒子而言,内边距、边框和外边距不是必需的,因此它们的默认值都为0。
默认情况下,元素盒子的width
和height
属性指的是内容盒子,也就是元素可渲染内容区的宽度和高度。
通过修改box-sizing
属性可以改变计算盒子大小的方式。box-sizing
的默认值为content-box
。
内边距、边框和外边距可以应用于元素的四边,也可以应用于具体某一边。
外边距甚至可以使用负值,使得元素可以在页面中移动。
内边距和外边距的值可以是CSS规范中规定的任意长度单位(px、em或百分比)。
内、外边距的值使用百分比是基于包含块(containing block)的宽度来计算。包含块就是其父元素,但有时候则不一定。
1.2 最大值和最小值
有时候,特别是在响应式布局中,给一个元素应用min-width
和max-width
值很有用。因为块级盒子可以默认自动填充父元素的宽度,但不会收缩到比min-width
指定的值更窄,或者扩展到比max-width
指定的值更宽。
与此类似的是min-height
和max-height
属性。
在CSS中,设置任何高度值的时候都应该慎重。因为元素的高度通常应该取决于所包含的内容,不需要我们明确设定。否则,万一内容增多,或者文本字号变大,内容就可能跑到高度固定的盒子之外去。即使出于种种原因,需要明确设定默认高度,也最好使用min-height
,因为这个属性允许盒子随内容扩展。
2.可见格式化模型
块级盒子会沿垂直方向堆叠,盒子在垂直方向上的间距由它们的上、下外边距决定。
行内盒子是沿文本流水平排列的,也会随文本换行而换行。它们之间的水平间距可以通过水平方向的内边距、边框和外边距来调节。但行内盒子的高度不受其垂直方向上的内边距、边框和外边距的影响。此外,给行内盒子明确设置高度和宽度也不会起作用。
我们常说的块级元素(p
、h1
和article
等)显示为块级盒子的形式,而行内元素(strong
、span
和time
等)显示为行内盒子的形式。
由一行文本形成的水平盒子叫行盒子,而行盒子的高度由所包含的行内盒子决定。修改行盒子大小的唯一途径就是修改行高(line-height
)。
我们使用display
属性改变生成的盒子类型。
把display
属性设置为block
,让span
变得跟块级元素一样;而把display
属性设置为inline-block
,该元素就会像行内盒子一样水平排列。
如果把display
属性设置为none
,还可以让浏览器不为相应的元素生成盒子。如果不生成盒子,那么元素及其包含的内容就不会显示出来,也不会占用文档中的空间。
CSS中有几种不同的定位模型,包括浮动、绝对定位和相对定位。
除非特别指定,否则所有元素盒子都会在常规文档流中生成,即position
属性的默认值为static
。
常规文档流中元素盒子的位置,由元素在HTML中的位置决定。
2.1 匿名盒子
HTML元素可以嵌套,元素盒子当然也可以嵌套。
多数盒子都是基于明确定义的元素生成的。
<section>
some text
<p>Some more text</p>
</section>
上面的 some text
被称为匿名块盒子。
事实上,你在屏幕上看到的一切,都会从属于某个盒子。
2.2 外边距折叠
常规块盒子有一种机制叫作外边距折叠。
垂直方向上的两个外边距相遇时,会折叠成一个外边距。折叠后外边距的高度等于两者中较大的那一个高度。
在一个元素嵌套着另一个元素的情况下,假设没有内边距或边框来分隔外边距,它们的上、下外边距也会折叠。
假设有一个空元素,只有外边距而没有边框或内边距。此时,上外边距与下外边距接触,结果也会折叠。(即同一个元素的外边距也会折叠)
如果折叠后的外边距又碰到了其他元素的外边距,还会继续折叠。
外边距折叠只发生在文档常规文本流中块级盒子的垂直方向上。行内盒子、浮动盒子或绝对定位盒子的外边距不会折叠。
2.3 包含块
确定元素的包含块,要看元素是如何定位的。
如果元素的定位方式为静态定位(即不指定position
属性的值)或相对定位,则其包含块的边界就计算到一个最近的父元素,该元素的display
属性值必须能够提供类似块级的上下文。
默认情况下,width
、height
、margin
和padding
的值为百分比时,就以该父元素的尺寸为计算依据。
2.4 相对定位
把一个元素的display
属性设置为relative
,该元素仍然会呆在原来的地方。但此后,可以通过设置top
、right
、bottom
和left
属性,使该元素相对于初始位置平移一定距离。
无论是否位移,相对定位的元素仍然会在文档流中占用初始的空间。因此,这样平移元素会导致它遮挡其他元素。
2.4 绝对定位
绝对定位会把元素拿出文档流,因此也就不会再占用原来的空间。与此同时,文档流中的其他元素会各自重新定位,仿佛绝对定位的那个元素没有存在过一样。
绝对定位元素的包含块是距离它最近的定位祖先,也就是display
属性设置为static
之外任意值的祖先元素。如果没有这么一个定位祖先,那么它就相对于文档的根元素即html
元素定位。文档的根元素也叫作起始包含块(initial containing block)。
绝对定位的盒子也可以相对于其包含块向上、下、左、右方向平移。
绝对定位的盒子是脱离了常规文档流的,因此可能会遮挡页面上的其他元素。为了控制这些盒子层叠的次序,可以设置一个叫z-index
的属性。z-index
属性值越大,盒子在层叠中的次序就越靠近用户的眼睛。
使用绝对定位很难创建自适应或者响应式布局。
2.4 固定定位
固定定位元素的包含块是视口(viewport)。
固定定位可用来创建始终停留在窗口相同位置的浮动元素。
很多网站都使用这个技术让导航区始终保持可见。
2.5 浮动
浮动盒子可以向左或向右移动,直到其外边沿接触包含块的外边沿,或接触另一个浮动盒子的外边沿。
浮动盒子也会脱离常规文档流,因此常规流中的其他块级盒子的表现,几乎当浮动盒子根本不存在一样。
为什么说“几乎”?因为其他元素盒子中的文本内容会记住浮动元素的大小,并在排布时避开它,为其留出相应的空间。从技术角度来讲,就是跟在浮动元素后面的行盒子会缩短,从而为浮动元素留空,造成文本环绕浮动盒子的效果。
事实上,浮动就是为了在网页中实现文本环绕图片的效果而引入的一种布局模型。
要阻止行盒子环绕在浮动盒子外面,需要给包含行盒子的元素应用clear
属性。clear
属性的值有left
、right
、both
和none
,用于指定盒子的哪一侧不应该紧挨着浮动盒子。
使用浮动可以实现“媒体对象”(media object)的布局模式。
2.6 格式化上下文
元素在页面上水平或垂直排布时的一套规则叫作格式化上下文。
- 行内格式化上下文
- 块级格式化上下文
.media-block {
background-color: gray;
border: solid 1px black;
}
.media-fig {
float: left;
margin-right: 5%;
}
.media-block, .media-fig {
overflow: auto; /* 创建新的块级格式化上下文 */
}
<div class="media-block">
<img class="media-fig" src="/img/pic.jpg" alt="The pic" />
<div class="media-body">
<h3>Title of this</h3>
<p>Brief description of this</p>
</div>
</div>
当一个元素具备了触发新块级格式上下文的条件,并且挨着一个浮动元素时,它就会忽略自己的边界必须接触自己的包含块边界的规则。此时,这个元素会收缩到适当大小。
尽量基于简单且可预测的行为来创建布局,这样可以降低代码复杂度,并提高布局稳健性。
2.7 内在大小与外在大小
CSS的Intrinsic and Extrinsic Sizing Level 3模块定义了一组可以应用给width
和height
属性的关键字,而非像素或百分比这种长度值。
这些关键字代表了明确的长度,要么继承自周围的上下文(外在大小),要么源于元素自身的内容(内在大小),具体数值由浏览器决定。
3.其他CSS布局模块
弹性盒布局模块(Flexible Box Layout Module),常被称为Flexbox。
Flexbox支持对子元素水平或垂直布局,以及设置这些子元素的大小、间距和对齐方式。
网格布局(grid layout)是CSS中最早成熟的高层布局工具,目标是取代浮动和定位元素的布局方式。
多栏布局模块(Multi-column Layout Module)用于实现内容的多栏布局。
参考资料:
- 《精通CSS》— [英] 安迪·巴德、[瑞典] 埃米尔·比约克隆德
CSS可见格式化模型的更多相关文章
- CSS视觉格式化模型
CSS视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.这是CSS 2.1的一个基础概念.视觉格式化模型根据CSS盒模型为文档的每个元素生成0 ...
- 大前端学习笔记整理【二】CSS视觉格式化模型
1. 概念 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树中其他元素的关系 ...
- CSS - 视觉格式化模型(Visual formatting model)
几个概念 块:block,一个抽象的概念,块与块之间在垂直方向上按照顺序依次堆叠. 行内:inline,一个抽象的概念,行内与行内之间在水平方向上按照顺序依次堆叠(会有换行). 元素:element, ...
- CSS学习笔记——视觉格式化模型 visual formatting model
CSS 视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.他有一套既定的规则(也就是W3C规范),规定了浏览器该怎么处理每一个盒子.以下内容翻 ...
- CSS2.1SPEC:视觉格式化模型之width属性详解(下)
本文承接CSS2.1SPEC:视觉格式化模型之width属性详解(上),继续分析CSS视觉格式化模型中width以及相关值的计算问题: 注:与上节不同,本节的demo中由于出现了float,absol ...
- CSS2.1SPEC:视觉格式化模型之包含块
原汁原味的才是最有味道的,在阅读CSS标准时对这一点的体会更加深刻了,阅读文档后的一大感觉就是很多看上去理所应当的样式表现也都有了对应的支持机制.本文首先从包含块写起,一方面总结标准中相应的阐述,并且 ...
- #CSS的盒子模型、元素类型
CSS的盒子模型.元素类型 本文首先介绍了CSS元素的统一内部结构模型,盒子模型:然后介绍了CSS元素基于不同分类标准定义的元素类型,包括基于不同内容设置方式定义的replaced元素和non-r ...
- CSS中的视觉格式化模型
视觉格式化模型 1. 简介 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树 ...
- * CSS 视觉格式化(基本框、包含块、盒模型、水平格式化、垂直格式化、行布局、em框、内容区、行间距、行内框、行框)
前言 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应该显示的 ...
随机推荐
- 数据可视化之PowerQuery篇(十四)产品关联度分析
https://zhuanlan.zhihu.com/p/64510355 逛超市的时候,面对货架上琳琅满目的商品,你会觉得这些商品的摆放,或者不同品类的货架分布是随机排列的吗,当然不是. 应该都听说 ...
- CSS 三大特性 层叠 继承 优先级
css三大特性 层叠性: 如果一个属性通过两个相同选择器设置到同一个元素上,相同的属性就会出现冲突,那么这个时候一个属性就会将另一个属性层叠掉,采用的是就近原则 继承性: 子标签会继承父标签的某些样式 ...
- JavaScript 对象的创建和操作
<script> // 对象是属性的无序集合,每个属性都是一个名/值对. 属性名称是一个字符串. // 对象种类 // 内置对象(nativ ...
- Swift开发笔记
Swift开发笔记(一) 刚开始接触XCode时,整个操作逻辑与Android Studio.Visual Studio等是完全不同的,因此本文围绕IOS中控件的设置.事件的注册来简单的了解IOS开发 ...
- JavaScript 基础 学习 (四)
JavaScript 基础 学习 (四) 解绑事件 dom级 事件解绑 元素.on事件类型 = null 因为赋值的关系,所以给事件赋值为 null 的时候 事件触发的时候,就没有事件处理 ...
- day1 python计算器底层运作,注释及变量
每日一记 utf-8 国际标准编码(可变长的unicode编码)中文3字节,英文数字特殊字符1字节 gbk 中国标准编码 中文2字节,英文数字特殊字符1字节 1.原码,反码,补码 "&quo ...
- 【高性能Mysql 】读书笔记(二)
第4章 Schema 与数据类型优化 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 选择优化的数据类型 选择合适数据类型的三个原则 更小的通常更好 - 速度更快 ...
- OA系统从选型到实施完整攻略
本文结合一线IT人士分享OA实施经验,单纯地讲述OA的选型与实施,为相关经验较少的IT人士提供真正的帮助. 一.如何选择OA系统 说起OA选型,稳定性.易用性.灵活性.成本和服务少不了.但是,只了解这 ...
- UVA 10653.Prince and Princess
题目 In an n * n chessboard, Prince and Princess plays a game. The squares in the chessboard are numbe ...
- Spring当中循环依赖很少有人讲,今天一起来学习!
网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...