1、伪元素选择器和伪类选择器区别

::after :在元素后面添加一个元素










类选择器:dom中真实存在的类,如p.test1,选择p标签具有类test1的所有元素,这个类是具体的、可以看见的。
伪类选择器:分为状态伪类和结构性伪类
状态伪类:基于元素当前状态进行选择的。在与用户的交互过程中元素的状态是动态变化的,因此该元素会根据其状态呈现不同的样式。当元素处于某状态时会呈现该样式,而进入另一状态后,该样式也会失去。常见的状态伪类主要包括: :link 应用于未被访问过的链接; :hover 应用于鼠标悬停到的元素; :active 应用于被激活的元素; :visited 应用于被访问过的链接,与:link互斥。 :focus 应用于拥有键盘输入焦点的元素。
结构性伪类:是css3新增选择器,利用dom树进行元素过滤,通过文档结构的互相关系来匹配元素,能够减少class和id属性的定义,使文档结构更简洁。常见的包括:
:first-child 选择属于其父元素的首个子元素;container中的第一个p元素和son-div中的第一个p元素的字体颜色都会变成红色






:nth-last-child() 选择某个 元素(p)匹配同类型中的倒数第 2 个同级兄弟元素


:nth-of-type() 与:nth-child()一样 :nth-last-of-type() 与:nth-last-child()一样; :first-of-type 选择一个父元素下的第一个同类子元素;




:only-child 选择的元素是它的父元素的唯一一个子元素;




:empty 选择的元素里面没有任何内容。




(2)兄弟选择器(~):选择当前元素的合乎规则所有兄弟元素


(3)相邻选择器(+): 选择当前元素相邻的那个合乎规则的兄弟元素




width 的默认值是auto。至少包含以下4种不同的宽度表现。 (1)充分利用可用空间。如div、p元素的宽度默认100%于父级容器的。
(2) 包裹性 实际案例:页面某个模块的文字内容是动态的,可能是几个字,也可能是一句话。然后希望文字少的时候居中显示,文字超过 一行的时候居左显示。





(4)超出容器限制 除非有明确的width相关设置。否则上面3种情况尺寸都不会主动超过父级容器的宽度。若设置了white-space:nowrap 文字超出容器也不会换行。这种情况下就会超出父级容器的宽度。


问题: width:100px 是如何作用到div元素上的? 是作用到content-box上的。如果padding、border和margin都是0。该div所呈现的宽度就是100px。若加上padding、border div的实际宽度就会超过100px.这种宽度设定和表现并不合理。总结为以下两点。 (1)流动性丢失 (2)与现实世界表现不一致的困扰 解决方案: (1)宽度分离



嵌套一层标签,父元素定宽。子元素因为width使用的是默认值auto,所以会如水流般自动充满父级容器。修改子元素的padding或者border都不会影响其实际宽度。 (2)box-sizing:改变width的作用细节。 width默认作用到content-box上。而box-sizing可以让width作用到content-box,border-box上。 作用到content-box上(box-sizing: content-box):div实际宽度是142 = width(100) + 2padding(20) + 2border(1)




原因:父元素没有设置高度,那么默认为auto。auto * 100% = NaN。 具体地讲,所有基于百分比的尺寸必须从父块元素继承,并且如果任一父项未能指定尺寸,则它们的尺寸假定为0 x 0像素。 当子元素设置宽度为width: 100%,而父元素没有设置宽度时。这个元素的宽度为什么会立刻扩展到窗口的整个横向宽度。为什么高度就不行。


为了理解为什么不会,你需要理解浏览器是如何计算高度和宽度的。Web浏览器在计算有效宽度时会考虑浏览器窗口的打开宽度。如果你不给宽度设定任何缺省值,那浏览器会自动将页面内容平铺填满整个横向宽度。 但是高度的计算方式完全不一样。事实上,浏览器根本就不计算内容的高度,除非内容超出了视窗范围(导致滚动条出现)。或者你给整个页面设置一个绝对高度。否则,浏览器就会简单的让内容往下堆砌,页面的高度根本就无需考虑。 因为页面并没有缺省的高度值,所以,当你让一个元素的高度设定为百分比高度时,无法根据获取父元素的高度,也就无法计算自己的高度。换句话说,父元素的高度只是一个缺省值:height: auto;。当你要求浏览器根据这样一个缺省值来计算百分比高度时,只能得到undefined的结果。也就是一个null值,浏览器不会对这个值有任何的反应。 如果想让一个元素的百分比高度height: 100%;起作用,有两种方法 (1)设定显示的高度值



此时的height: 100%就会有计算值。即使祖先元素的height计算为auto也是如此。需要注意的是绝对定位元素的百分比计算和非绝对定位元素的百分比计算是有区别的。绝对定位的宽高百分比是相对于padding-box。非绝对定位的元素则是相对于ocntent-box计算的。对比一下 非绝对定位元素



