伪类和伪元素
参考
伪类
伪类是选择器的一种,用于选择处于特定状态的元素,开头为冒号
1 | :pseudo-class-name; |
例子:
- :first-child
- :last-child
- :only-child
- :invalid 表示任意内容未通过验证的
<input>或其他<form>元素 - :hover
- :focus
伪元素
伪元素像新的元素,开头为双冒号
1 | ::pseudo-element-name |
例子:
- ::first-line
- ::before
- ::after
伪类是选择器的一种,用于选择处于特定状态的元素,开头为冒号
1 | :pseudo-class-name; |
例子:
<input>或其他<form>元素伪元素像新的元素,开头为双冒号
1 | ::pseudo-element-name |
例子:
https://www.zhihu.com/question/20597072
https://developer.mozilla.org/zh-CN/docs/Glossary/Vendor_Prefix
示例:
1 | -webkit-transition: all 4s ease; |
https://developer.mozilla.org/zh-CN/docs/Web/CSS/position
可选项有四种:
默认就是 static,在这个选项下,设置 top, bottom, left, right, z-index 无效。
设置了 relative,也就是说会在该元素原本的位置留白,不会改变页面原来的布局。
设置了 absolute,就不会在原本的位置留白,就会影响到页面原来的布局了。相对偏移的对象是最近的非 static 祖先元素。一般是父元素用 relative,子元素用 absolute 这样搭配着来使用,让子元素根据父元素进行绝对定位。
固定在视口(viewport)的某个位置,也就是说相对于视口来偏移。元素的位置在屏幕滚动时不会改变。
相对于最近的滚动祖先(当该祖先的overflow 是 hidden, scroll, auto, 或 overlay时)偏移。sticky 一般用来实现表格的表头固定
强烈建议用 MDN Web Docs 的例子,亲身体会一下。
BFC,Block Formatting Context,块级格式上下文
具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。
只要元素满足下面任一条件即可触发 BFC 特性:
1 | <head> |
如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中。
1 | <style> |
1 | <div style="height: 100px;width: 100px;float: left;background: lightblue"> |
1 | <div style="height: 100px;width: 100px;float: left;background: lightblue;"> |
我们都知道,浮动的元素会脱离普通文档流,来看下下面一个例子
1 | <div style="border: 1px solid #000;"> |
由于容器内元素浮动,脱离了文档流,所以容器只剩下 2px 的边距高度。如果使触发容器的 BFC,那么容器将会包裹着浮动元素。
1 | <div style="border: 1px solid #000;overflow: hidden"> |

width = contentwidth = content + 2*padding + 2*border通过 css3 新增的属性 box-sizing: content-box | border-box 分别设置盒模型为标准模型(content-box)和 IE 模型(border-box)。默认是标准模型。
1 | .content-box { |
.content-box 设置为标准模型,它的元素宽度 width=100px。

1 | .border-box { |
.border-box 设置为 IE 模型,它的元素宽度 width = content + 2*padding + 2*border = 70px + 2*10px + 2*5px = 100px。

dom.style.width/height 只能取到行内样式的宽和高,style 标签中和 link 外链的样式取不到。dom.currentStyle.width/height 取到的是最终渲染后的宽和高,只有 IE 支持此属性。window.getComputedStyle(dom).width/height 同(2)但是多浏览器支持,IE9 以上支持。dom.getBoundingClientRect().width/height 也是得到渲染后的宽和高,大多浏览器支持。IE9 以上支持,除此外还可以取到相对于视窗的上下左右的距离当两个垂直外边距相遇时,他们将形成一个外边距,合并后的外边距高度等于两个发生合并的外边距的高度中的较大者。注意:只有普通文档流中块框的垂直外边距才会发生外边距合并,行内框、浮动框或绝对定位之间的外边距不会合并。

可以是兄弟元素,也可以父子元素之间发生外边距重叠。
看下面这个例子:
1 | <section id="sec"> |
在线演示:父子元素外边距合并
子元素的 margin-top: 10px 没有生效,当我们加了 overflow: hidden 后才生效。给父级加了 overflow: hidden, 其实就是给父级元素创建一个 BFC(块级格式化上下文),那什么是 BFC,请看下一个话题。