1.盒模型

1.1 盒子大小

盒模型描述了元素如何显示,以及如何相互作用、相互影响。

页面中的所有元素都被看作一个矩形盒子,这个盒子包含元素的内容内边距边框外边距

给元素应用的背景会作用于元素内部和内边距。

外边距用于在页面中控制元素之间的距离。

对元素盒子而言,内边距、边框和外边距不是必需的,因此它们的默认值都为0。

默认情况下,元素盒子的widthheight属性指的是内容盒子,也就是元素可渲染内容区的宽度和高度。

通过修改box-sizing属性可以改变计算盒子大小的方式。box-sizing的默认值为content-box

内边距、边框和外边距可以应用于元素的四边,也可以应用于具体某一边。

外边距甚至可以使用负值,使得元素可以在页面中移动。

内边距和外边距的值可以是CSS规范中规定的任意长度单位(px、em或百分比)。

内、外边距的值使用百分比是基于包含块(containing block)的宽度来计算。包含块就是其父元素,但有时候则不一定。

1.2 最大值和最小值

有时候,特别是在响应式布局中,给一个元素应用min-widthmax-width值很有用。因为块级盒子可以默认自动填充父元素的宽度,但不会收缩到比min-width指定的值更窄,或者扩展到比max-width指定的值更宽。

与此类似的是min-heightmax-height属性。

在CSS中,设置任何高度值的时候都应该慎重。因为元素的高度通常应该取决于所包含的内容,不需要我们明确设定。否则,万一内容增多,或者文本字号变大,内容就可能跑到高度固定的盒子之外去。即使出于种种原因,需要明确设定默认高度,也最好使用min-height,因为这个属性允许盒子随内容扩展。

2.可见格式化模型

块级盒子会沿垂直方向堆叠,盒子在垂直方向上的间距由它们的上、下外边距决定。

行内盒子是沿文本流水平排列的,也会随文本换行而换行。它们之间的水平间距可以通过水平方向的内边距、边框和外边距来调节。但行内盒子的高度不受其垂直方向上的内边距、边框和外边距的影响。此外,给行内盒子明确设置高度和宽度也不会起作用。

我们常说的块级元素ph1article等)显示为块级盒子的形式,而行内元素strongspantime等)显示为行内盒子的形式。

由一行文本形成的水平盒子叫行盒子,而行盒子的高度由所包含的行内盒子决定。修改行盒子大小的唯一途径就是修改行高(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属性值必须能够提供类似块级的上下文。

默认情况下,widthheightmarginpadding的值为百分比时,就以该父元素的尺寸为计算依据。

2.4 相对定位

把一个元素的display属性设置为relative,该元素仍然会呆在原来的地方。但此后,可以通过设置toprightbottomleft属性,使该元素相对于初始位置平移一定距离。

无论是否位移,相对定位的元素仍然会在文档流中占用初始的空间。因此,这样平移元素会导致它遮挡其他元素。

2.4 绝对定位

绝对定位会把元素拿出文档流,因此也就不会再占用原来的空间。与此同时,文档流中的其他元素会各自重新定位,仿佛绝对定位的那个元素没有存在过一样。

绝对定位元素的包含块是距离它最近的定位祖先,也就是display属性设置为static之外任意值的祖先元素。如果没有这么一个定位祖先,那么它就相对于文档的根元素即html元素定位。文档的根元素也叫作起始包含块(initial containing block)。

绝对定位的盒子也可以相对于其包含块向上、下、左、右方向平移。

绝对定位的盒子是脱离了常规文档流的,因此可能会遮挡页面上的其他元素。为了控制这些盒子层叠的次序,可以设置一个叫z-index的属性。z-index属性值越大,盒子在层叠中的次序就越靠近用户的眼睛。

使用绝对定位很难创建自适应或者响应式布局。

2.4 固定定位

固定定位元素的包含块是视口(viewport)。

固定定位可用来创建始终停留在窗口相同位置的浮动元素。

很多网站都使用这个技术让导航区始终保持可见。

2.5 浮动

浮动盒子可以向左或向右移动,直到其外边沿接触包含块的外边沿,或接触另一个浮动盒子的外边沿。

浮动盒子也会脱离常规文档流,因此常规流中的其他块级盒子的表现,几乎当浮动盒子根本不存在一样。

为什么说“几乎”?因为其他元素盒子中的文本内容会记住浮动元素的大小,并在排布时避开它,为其留出相应的空间。从技术角度来讲,就是跟在浮动元素后面的行盒子会缩短,从而为浮动元素留空,造成文本环绕浮动盒子的效果。

事实上,浮动就是为了在网页中实现文本环绕图片的效果而引入的一种布局模型。

要阻止行盒子环绕在浮动盒子外面,需要给包含行盒子的元素应用clear属性。clear属性的值有leftrightbothnone,用于指定盒子的哪一侧不应该紧挨着浮动盒子。

使用浮动可以实现“媒体对象”(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 内在大小与外在大小

CSSIntrinsic and Extrinsic Sizing Level 3模块定义了一组可以应用给widthheight属性的关键字,而非像素或百分比这种长度值。

这些关键字代表了明确的长度,要么继承自周围的上下文(外在大小),要么源于元素自身的内容(内在大小),具体数值由浏览器决定。

3.其他CSS布局模块

弹性盒布局模块(Flexible Box Layout Module),常被称为Flexbox。

Flexbox支持对子元素水平或垂直布局,以及设置这些子元素的大小、间距和对齐方式。

网格布局(grid layout)是CSS中最早成熟的高层布局工具,目标是取代浮动和定位元素的布局方式。

多栏布局模块(Multi-column Layout Module)用于实现内容的多栏布局。

参考资料:

  • 《精通CSS》— [英] 安迪·巴德、[瑞典] 埃米尔·比约克隆德

CSS可见格式化模型的更多相关文章

  1. CSS视觉格式化模型

    CSS视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.这是CSS 2.1的一个基础概念.视觉格式化模型根据CSS盒模型为文档的每个元素生成0 ...

  2. 大前端学习笔记整理【二】CSS视觉格式化模型

    1. 概念 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树中其他元素的关系 ...

  3. CSS - 视觉格式化模型(Visual formatting model)

    几个概念 块:block,一个抽象的概念,块与块之间在垂直方向上按照顺序依次堆叠. 行内:inline,一个抽象的概念,行内与行内之间在水平方向上按照顺序依次堆叠(会有换行). 元素:element, ...

  4. CSS学习笔记——视觉格式化模型 visual formatting model

    CSS 视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.他有一套既定的规则(也就是W3C规范),规定了浏览器该怎么处理每一个盒子.以下内容翻 ...

  5. CSS2.1SPEC:视觉格式化模型之width属性详解(下)

    本文承接CSS2.1SPEC:视觉格式化模型之width属性详解(上),继续分析CSS视觉格式化模型中width以及相关值的计算问题: 注:与上节不同,本节的demo中由于出现了float,absol ...

  6. CSS2.1SPEC:视觉格式化模型之包含块

    原汁原味的才是最有味道的,在阅读CSS标准时对这一点的体会更加深刻了,阅读文档后的一大感觉就是很多看上去理所应当的样式表现也都有了对应的支持机制.本文首先从包含块写起,一方面总结标准中相应的阐述,并且 ...

  7. #CSS的盒子模型、元素类型

    CSS的盒子模型.元素类型   本文首先介绍了CSS元素的统一内部结构模型,盒子模型:然后介绍了CSS元素基于不同分类标准定义的元素类型,包括基于不同内容设置方式定义的replaced元素和non-r ...

  8. CSS中的视觉格式化模型

    视觉格式化模型 1. 简介 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树 ...

  9. * CSS 视觉格式化(基本框、包含块、盒模型、水平格式化、垂直格式化、行布局、em框、内容区、行间距、行内框、行框)

    前言 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应该显示的 ...

随机推荐

  1. flask 源码专题(十一):LocalStack和Local对象实现栈的管理

    目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于localstack的实现 3. 总结 04 LocalS ...

  2. Java对象与Json字符串的转换

    Java对象与Json字符串的转换 JSON是一种轻量级的数据交换格式,常用于前后端的数据交流 后端 : 前端 Java对象 > JsonString Java对象 < jsonStrin ...

  3. 二、Python系列——time时间格式的转换及计算

    # -*- coding:utf-8 -*- import pandas as pd import time import datetime start_date = '2020-06-08' # 一 ...

  4. Python Ethical Hacking - BACKDOORS(4)

    REVERSE_BACKDOOR - cd command Access file system: cd command changes current working directory. It h ...

  5. ant design pro : 依赖项 webpack-theme-color-replacer 最新版导致项目无法启动?

    重新装了一个项目的依赖,结果发现打不开了? 报错如下: This dependency was not found: * webpack-theme-color-replacer/client in ...

  6. 7.CSMA协议

    载波监听多路访问协议CSMA CS:载波侦听/监听,每一个站在发送数据之前要检测一下总线上是否有其他计算机在发送数据. MA:多点接入,表示许多计算机以多点接入的方式连接在一根总线上 协议思想:发送帧 ...

  7. 基于Vue的UI框架element el-table表格的自定义排序

    html部分: <el-table-column prop="phoneCache" label="手机缓存包编号" align="center ...

  8. Selenium自动化:有代码测试与无代码测试。这些你都懂了吗?

    大多数测试人员认为 Selenium是满足其测试自动化需求的自动化框架.作为全球测试人员使用的开放源框架, Selenium 无疑是测试人员适应日趋敏捷的公司的一种好方法.实际上, Selenium仍 ...

  9. 程序员每日一乐:html动态烟花设计 3D

    3D版烟花 效果图:file:///C:/Users/QianXin/Desktop/3D%E7%83%9F%E8%8A%B1.html 经过一天的的工作或者学习是否感到枯燥乏味?现在的你是否想找些乐 ...

  10. java8之Stream流处理

    简介 Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念. Stream 机制是针对集合迭代器 ...