笔记整理,看前方-CSS

337 阅读7分钟

盒模型

  • 内容(content)、内边距(padding)、边框(border)、外边距(margin)
  • 盒模型有两种:1. W3c标准的盒子模型(标准盒模型) 2. IE标准的盒子模型(怪异盒模型
  • 标准盒模型下盒子的大小 = content(width) + border + padding + margin
  • box-sizing可以改变盒模型,border-box将会出发怪异模式解析计算

回流重绘

回流

当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建,这就称为回流(reflow)每个页面至少需要一次回流,就是在页面第一次加载的时候,这时候是一定会发生回流的,因为要构建render tree。在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘。

需要回流的场景

  • 添加或者删除可见的DOM元素
  • 元素位置改变
  • 元素尺寸改变——边距、填充、边框、宽度和高度
  • 内容改变
  • ......

重绘

当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color,就称为重绘。

区别

回流必将引起重绘,重绘不一定引起回流

BFC、IFC、FFC、GFC

什么是BFC?

Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)Inline formatting context (简称IFC)。Block formatting context直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。通俗地讲,BFC是一个容器,用于管理块级元素。

如何创建BFC?

  • float为 left|right
  • overflow为 hidden|auto|scroll
  • display为 table-cell|table-caption|inline-block|inline-flex|flex
  • position为 absolute|fixed
  • 根元素

BFC的布局规则

  • 内部的Box会在垂直方向,一个接一个地放置(即块级元素独占一行)。
  • BFC的区域不会与float box重叠(利用这点可以实现自适应两栏布局)。
  • 内部的Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
    • margin重叠三个条件:
      • 1.同属于一个BFC;
      • 2.相邻;
      • 3.块级元素
  • 计算BFC的高度时,浮动元素也参与计算。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

BFC的特性

  • BFC会阻止垂直外边距折叠
    按照BFC的定义,只有同属于一个BFC时,两个元素才有可能发生垂直margin的重叠,这个包括相邻元素或者嵌套元素,只要他们之间没有阻挡(比如边框、非空内容、padding等)就会发生margin重叠。
  • BFC不会重叠浮动元素
  • BFC可以包含浮动----清除浮动

IFC

IFC(Inline Formatting Contexts) 直译为"内联格式化上下文",IFC的line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的padding/margin影响)

IFC布局规则:

框会从包含块的顶部开始,一个接一个地水平摆放。 摆放这些框的时候,它们在水平方向上的外边距、边框、内边距所占用的空间都会被考虑在内。在垂直方向上,这些框可能会以不同形式来对齐:它们可能会把底部或顶部对齐,也可能把其内部的文本基线对齐。能把在一行上的框都完全包含进去的一个矩形区域,被称为该行的行框。水平的margin、padding、border有效,垂直无效。不能指定宽高。 行框的宽度是由包含块和存在的浮动来决定。行框的高度由行高计算这一章所描述的规则来决定。

GFC

GFC(GridLayout Formatting Contexts) 直译为"网格布局格式化上下文",当为一个元素设置display值为grid的时候,此元素将会获得一个独立的渲染区域,我们可以通过在网格容器(grid container)上定义网格定义行(grid definition rows)和网格定义列(grid definition columns)属性各在网格项目(grid item)上定义网格行(grid row)和网格列(grid columns)为每一个网格项目(grid item)定义位置和空间。

FFC

FFC(Flex Formatting Contexts) 直译为"自适应格式化上下文",display值为flex或者inline-flex的元素将会生成自适应容器(flex container),可惜这个牛逼的属性只有谷歌和火狐支持,不过在移动端也足够了,至少safari和chrome还是OK的,毕竟这俩在移动端才是王道。

Flex Box 由伸缩容器和伸缩项目组成。通过设置元素的 display 属性为 flexinline-flex 可以得到一个伸缩容器。设置为 flex 的容器被渲染为一个块级元素,而设置为 inline-flex 的容器则渲染为一个行内元素。

伸缩容器中的每一个子元素都是一个伸缩项目。伸缩项目可以是任意数量的。伸缩容器外和伸缩项目内的一切元素都不受影响。简单地说,Flexbox 定义了伸缩容器内伸缩项目该如何布局。

css左侧固定右侧自适应布局,有哪几种实现方式?

  • 1.float+bfc ,左侧宽度不需要固定,但父级容器宽度需大于左侧宽度,否则右侧被挤压无法展示
.container1 .left{ 
    float: left; 
    width: 100px; 
} 
.container1 .right { 
    overflow: hidden; 
} 
/*清除浮动*/ 
.container1:after{ 
    content: ""; 
    height: 0; 
    line-height: 0; 
    display: block; 
    visibility: hidden; 
    clear: both; 
}
  • 2.子元素inline-block + calc动态计算宽度,左侧宽度需固定,父元素需要设置font-size:0清除默认间距,子元素设置vertical-align:top使其顶部对齐,右侧设置 width: calc(100% - 140px);达到自适应
.container4{ 
    font-size: 0; 
} 
.container4 .left{ 
    width: 100px; 
} 
.container4 .left,.container4 .right{ 
    display: inline-block; 
    font-size: 16px; 
    vertical-align: top; 
} 
.container4 .right{ 
    width: calc(100% - 100px); 
}
  • 3.postion:absolute+padding-left
.container { 
    position: relative; 
    padding-left: 100px; 
}
.container .lefi { 
    position: absolute; 
    left: 0; 
    top: 0; 
    width: 100px;
}
  • 4.flex,最便捷的方法
.container6{ display: flex; } 
.container6 .right{ flex-grow: 1; }
  • 5.grid,网格布局
.container7{ display: grid; } 
.container7 .left{ grid-column:1; } 
.container7 .right{ grid-column:2; }

link 与 @import 的区别

  • 从属关系区别
    @import是 CSS 提供的语法规则,只有导入样式表的作用;link是HTML提供的标签,不仅可以加载 CSS 文件,还可以定义 RSS、rel 连接属性等

  • 加载顺序区别
    加载页面时,link标签引入的 CSS 被同时加载;@import引入的 CSS 将在页面加载完毕后被加载。

  • 兼容性区别
    @import是 CSS2.1 才有的语法,故只可在 IE5+ 才能识别;link标签作为 HTML 元素,不存在兼容性问题。

  • DOM可控性区别
    可以通过 JS 操作 DOM ,插入link标签来改变样式;由于DOM方法是基于文档的,无法使用@import的方式插入样式。

CSS优化、提高性能的方法有哪些

  • 尽量将样式写在单独的css文件里面,在head元素中引用 将代码写成单独的css文件有几点好处:
    • 内容和样式分离,易于管理和维护
    • 减少页面体积
    • css文件可以被缓存、重用,维护成本降低
  • 不使用@import
  • 避免使用复杂的选择器,层级越少越好 建议选择器的嵌套最好不要超过三层
  • 精简页面的样式文件,去掉不用的样式
  • 利用CSS继承减少代码量
  • 避免!important,可以选择其他选择器