最近在读《Basic Visual Formatting in CSS》,结合以前看的《css权威指南》和css标准。今天就做个笔记。
  以前在遇到一些宽度不明确指明的一些布局的时候,虽然凭感觉能猜出个大概,但是总是有点不是很靠谱。直到最近看到这一本书,觉得总觉得挺好的。

  首先要知道,元素除了通过display来指定block、inline、inline-block这一些属性之外,还有一种能在的特性--替换还是非替换。

    替换元素:像img、video、canvas等稳定种指定的内容只是占位,真正的内容实在后面替换上去的。像img内容是图片加载完成之后替换上去的。
    非替换元素:像div、p、span这一些内容就写在文档中。
  而这里要说到的主要是块级非替换元素既display:block的非替换元素,如p、div;还有就是display:list-item,如li。li虽然看display像是和div、p这一些是两类,但是其实li除了多了前面的标志之外,别的行为基本都是一样的。

  下面进入正题,文档流中块级非替换元素的水平格式化和包含块(containing block)还有七个属性有关(border-left、margin-left、padding-left、width、padding-right、margin-right、border-right)。文档流中块级元素的containing block一般指的是父级块级元素的内容区域(content area)。也就是在box-sizing:content-box时,width指定的区域。下面有一条公式:

  'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block

  上面的公式在所有情况下都要成立。但是很快问题就来了,要是我把7个属性的值都设了值,但是加起来不等于containing block的width怎么办;又或者我把值都设置为auto,那又怎么样去计算呢?其实在这七个值中,只有三个值margin-left、margin-right、width能够设置为auto。我们首先看看把这三个属性设置为auto的情况,由于这三个属性可以设置为auto或者是非auto,那么就是说一共有23,8种情况。下面来分别说下:

  1、一个值设置为auto,也就是margin-left、margin-right或者width设置为auto。这三种情况最简单了,直接套上面的公式一算就知道了。

  2、两个值设置为auto。

    2.1、margin-left和margin-right设置为auto,width指定一个非auto的值。这种情况就是我们平时的水平居中,margin-left和margin-right获得相同的值。

    2.2、margin-left和width设置为auto,margin-right指定一个非auto的值。margin-left重设为0,然后就变成了1情况了。

    2.3、margin-right和width设置为auto,margin-left指定一个非auto的值。margin-right重设为0,然后又变成了1情况了。

  3、三个值设置为auto。margin-left和margin-right都重设为0,然后根据1来计算。

  4、假如没有一个设置为auto,在css中叫"over-constrained"(过度约束)。那么在文档流方向为左到右的时候margin-right的值会被忽略,然后还是1情况。这种情况最容易理解错,容易吧"over-constrained"理解成指定了所有的值后使得上面公式左边小于右边。正确的理解应该是"指定了三个值,都没有变通的余地了"。所以只要给margin-left、width和margin-right都指定了auto之外的值(就算是0),也是"over-constrained"了。

  上面的内容似乎已经覆盖了所有的情况了,其实不然,还有一种特殊情况就是margin-left,margin-right设置为auto,width有指定值,但是border-left+padding-left+width+padding-right+border-right> width of containing block。按照上面的说法,margin-left和margin-right获得相同的值,但事实是,margin-left和margin-right重设为0,然后过度约束,然后忽略掉一个。

css 文档流中块级非替换元素水平区域的计算规则(1)的更多相关文章

  1. CSS文档流与块级元素和内联元素

    CSS文档流与块级元素(block).内联元素(inline),之前翻阅不少书籍,看过不少文章, 看到所多的是零碎的CSS布局基本知识,比较表面.看过O'Reilly的<CSS权威指南>, ...

  2. CSS文档流与块级元素和内联元素(文档)

    CSS文档流与块级元素(block).内联元素(inline),之前翻阅不少书籍,看过不 少文章, 看到所多的是零碎的CSS布局基本知识,比较表面.看过O'Reilly的<CSS权威指 南> ...

  3. CSS文档流、块级元素、内联元素

    CSS文档流与块级元素(block).内联元素(inline),之前翻阅不少书籍,看过不少文章, 看到所多的是零碎的CSS布局基本知识,比较表面.看过O'Reilly的<CSS权威指南>, ...

  4. 前端学习 -- Css -- 文档流

    文档流 文档流处在网页的最底层,它表示的是一个页面中的位置, 我们所创建的元素默认都处在文档流中 元素在文档流中的特点 块元素 块元素在文档流中会独占一行,块元素会自上向下排列. 块元素在文档流中默认 ...

  5. CSS文档流

    文档流 将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流. 每个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端. 若当前行容不下, 则另起新行再浮动. 内联元素也不 ...

  6. CSS-position 属性&元素脱离文档流引发父级边框塌陷问题

    CSS-position 属性 CSS 定位机制 CSS 有三种基本的定位机制:普通流.浮动(float)和绝对定位(position). 除非专门指定,否则所有框都在普通流中定位.也就是说,普通流中 ...

  7. 前端学习笔记之CSS文档流

    先引用一段W3C的文档: 9.3 Positioning schemes In CSS 2.1, a box may be laid out according to three positionin ...

  8. [转载]css菜鸟之HTML 中块级元素设置 height:100% 的实现

    HTML 中块级元素设置 height:100% 的实现 当你设置一个页面元素的高度(height)为100%时,期望这样元素能撑满整个浏览器窗口的高度,但大多数情况下,这样的做法没有任何效果. 为什 ...

  9. css菜鸟之HTML 中块级元素设置 height:100% 的实现

    HTML 中块级元素设置 height:100% 的实现 当你设置一个页面元素的高度(height)为100%时,期望这样元素能撑满整个浏览器窗口的高度,但大多数情况下,这样的做法没有任何效果. 为什 ...

随机推荐

  1. IIC协议

    总线信号 :  SDA :串行数据线 SCL  :串行时钟 总线空闲状态 : SDA :高电平 SCL :高电平 起始位:SCL为高电平期间    SDA出现下降沿 终止位:SCL为高电平期间 SDA ...

  2. Postgresql 创建主键并设置自动递增的三种方法

    Postgresql 有以下三种方法设置主键递增的方式,下面来看下相同点和不同点. --方法一create table test_a (  id serial,  name character var ...

  3. AVL 平衡树

    AVL是一种平衡二叉树,它通过对二叉搜索树中的节点进行旋转使得二叉搜索树达到平衡.AVL在所有的平衡二叉搜索树中具有最高的平衡性. 定义 平衡二叉树或者为空树或者为满足如下性质的二叉搜索树: 左右子树 ...

  4. Android之ListView分页数据加载

    1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: 点击加载按 ...

  5. java基础---->Java中枚举的使用(一)

    这里介绍一下java中关于枚举的使用. java中枚举的使用 一.枚举中可以定义方法 参照于TimeUnit的使用,TimeUnit.MILLISECONDS.sleep(1000); LoveUti ...

  6. whistle--全新的跨平台web调试工具

    版权声明:本文由吴文斌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/151 来源:腾云阁 https://www.qclo ...

  7. line-height和vertical-algin

    项目中,经常会用到line-height和vertical-algin来解决垂直居中的问题,但对其原理和应用限制却很少了解.因此做了一下总结: line-height具有继承性,对inline元素.t ...

  8. request.get... getHeader 能取得的信息 参数

    转载▼   StringTokenizer st = new StringTokenizer(agent,";"); st.nextToken(); //得到用户的浏览器名 Str ...

  9. Ajax 完整教程(转载)

    第 1 页 Ajax 简介 Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.本文的作者是 ...

  10. V2EX的RSS订阅地址

    1.全站RSS输出: https://www.v2ex.com/index.xml 2.单独节点RSS输出: http://www.v2ex.com/feed/{节点名}.xml  以shadowso ...