当前位置: 首页 > Web前端 > CSS

你可能不知道的CSS——CSS规范阅读分享

时间:2023-03-31 12:59:15 CSS

本文创建于2018-12-24,移至2019-12-20本文根据CSS2.1规范中文版整理。用浏览器Chrome70测试。前言里可能有人会说,都2019年了,怎么还看CSS2.1规范。一方面,最新的CSS(核心)规范是CSS2.2(下面截图来自https://www.w3.org/TR/CSS/),又因为CSS2.1有中文版,而且它兼容CSS2.2规范并没有太大区别,出于偷懒的目的我最终还是选择了阅读CSS2.1规范。记得面试的时候,面试官说“你的JavaScript比大多数人好很多,但是你的CSS还需要加强”。今年6月毕业后,我正式成为一名前端工程师,阅读CSS规范也因此进入了我今年的TODO清单。前后用了两个月的零散时间,上周终于看完了,对CSS的理解也稍微系统和全面了一些。在自己阅读的过程中,有些人觉得大家容易被忽略,但本身可能会用到或者有趣,所以我以此为主题,在此基础上适当展开,整理出一篇文章与大家分享.分享。喝杯咖啡,让我们回顾一下规范中那些可能没有引起您注意的地方。阅读愉快,请指教。关键字、属性和标识符以-或_开头的关键字和属性名称保留用于特定于供应商的扩展。CSS中的标识符只能包含字符[a-zA-Z0-9]、U+00A0及ISO10646字符中的后续字符,以及-和_,不能以1个数字、2个连字符开头,也不能以数字开头连字符.这也意味着选择器可以是中文的(虽然不推荐)。....这是一个中文选择器文本。

此时,

标签内的文字会变成红色。@import用户代理必须忽略所有出现在块内的@import规则,或者在除@charset和@import规则之外的任何不可忽略的语句之后。这也意味着@import规则必须先于除@charset和其他@import规则之外的所有规则。@import"subs.css"h1{颜色:蓝色;}@import"list.css"在上面的代码中,第二条@import语句是非法的,解析器会忽略这条规则。另外@import规则可以加上一个媒体查询类型,也就是说只有满足某种媒体类型才引入样式表。@import"landscape.css"screenand(orientation:landscape)encoding和@charset当一个样式表嵌入到其他文档中时,比如HTML中的style元素或style属性,样式表会共享整个的字符编码文档。如果样式表在单独的文件中,则样式表的字符编码按照以下顺序(优先级从高到低)确定:HTTP协议的Content-type字段中charest参数文件的BOM编码或@charset或来自链接机制的其他元数据假定导入的样式表或文档的字符集为UTF-8。使用@charset规则的编写者必须将此规则放在样式表的开头,前面不允许有任何字符。.用户代理必须忽略任何不以样式表开头的@charset规则。:first-letter伪元素:first-letter伪元素选择块(第一个格式化行块)第一行的第一个字母(或数字),如果行中没有其他内容在它之前(例如图片或内联表)。表格单元格或行内块元素的首字母不能用作祖先元素的首字母。“一些文字”

一些文字

sometext

实际效果如图::before和:after伪元素:before和:after伪元素将是从文档树中它们所附加的元素中检索继承所有可继承的属性。对于不可继承的元素,将采用其初始值。用法示例:p{颜色:红色;显示:块;}p:before{内容:'T';}如上例,此时,:before伪元素会变成红色。由于display属性是不可继承的,因此它将采用内联的初始值。扩展:伪元素单冒号和双冒号CSS3选择器草案区分伪元素和伪类(CSS-SelectorsLevel4),伪类仍然以引号开头,伪元素以两个引号开头.对于CSS1和CSS2中的:before、:after、:first-line和:first-letter伪元素,用户代理必须同时支持单引号和双引号形式。对于其他新引入的伪类,用户代理将不支持其单引号形式。在选择器和级联选择器中,文档语言元素名称的大小写敏感性取决于文档语言,例如,元素名称在HTML中不区分大小写,但元素名称在XML中区分大小写。级联样式表可能来自3个不同的来源:作者、用户和用户代理(例如浏览器)。为了找到元素或属性组合的值,用户代理必须按以下顺序排序:找到目标媒体类型,所有适用于元素和目标属性的声明,按@important规则和源排序,优先级从低到高依次为:useragentdeclarationusergeneraldeclarationwritergeneraldeclarationwriterimportantdeclaration具有相同重要性和来源的userimportantdeclaration规则按照选择器的特异性排序,更具体的选择器会被加权写在general上。伪元素和伪类分别算作常规元素和类最后,按照指定的顺序排序:如果两个声明的权重、来源和特异性相同,则指定后的生效。@import引入的样式表中的声明被认为是在样式表本身的所有声明之前评估选择器特异性(a-b-c-d)。选择器(a-b-c-d)的特殊性根据以下规则进行评估(a到d按降序加权):如果声明来自样式属性而不是选择器样式规则,则计为1,否则为0(=a)计算选择器中ID属性的数量(=b)计算选择器中其他属性和伪类的数量(=c)计算选择器中元素名称和伪元素的数量(=d)*{}/*a=0,b=0,c=0,d=0*/li{}/*a=0,b=0,c=0,d=1*/.description{}/*a=0,b=0,c=1,d=0*/*[rel=up]{}/*a=0,b=0,c=1,d=0*/#element{}/*a=0,b=1,c=0,d=0*/style=""/*a=1,b=0,c=0,d=0*/即虽然#p123选择了与[id相同的对象=p123],ID选择器比属性选择器有更高的特异性。补充之前看了一些博客,在提到级联的特殊性时,用1000、100、10、1的权重来描述上面a-b-c-d的计算方式。其实这是不准确的。我们可以通过简单的实验推翻上述说法。下面的例子中,我们定义了一个类名为0的div,里面嵌套了十层div,最内层指定id为last。按照10倍递增算法,一个类嵌套十一层的特异性为110,使用一个id的特异性为100,背景为黑色。如果按照a-b-c-d算法,使用前者的特异性为0-0-11-0,后者的特异性为0-1-0-0,背景会呈现红色。观察连续使用十一个classes和一个id的性能就可以得出一个结论。
<如图,背景是红色的,所以1000、100、10、1的计算方法不准确。但是由于实现问题,可能会出现有限类优先级比A高的情况。张新旭在2012年分享过一篇文章《有趣:256个class选择器可以干掉1个id选择器》,主要原因是写这篇文章的时候,有些浏览器使用8位计数器来计算类数。当类数达到256时,由于carry,权重会高于id。后来的浏览器使用了更高位数的计数器,理论上可能还有边界值,但是会很难达到。content中的attr属性content:attr(X)attr(X)函数返回一个字符串,其值为选择器选中的对象的X属性的值。如果对象没有X属性,则返回空字符串。使用示例:p:after{content:","attr(data-name);Hello

将呈现“Helo,Thorn”。计数器计数器使用区分大小写的标识符。自动编号是通过计数器递增和计数器重置属性控制的。如果为同一个计数器指定了多个counter-reset或counter-increment值,则计数器的每次reset或increment都会按照指定的顺序进行处理。/*第二段省略了重置值,会被设置为默认值0,该段会先重置为2,最后重置为0*/h1{counter-reset:section2section;}/*first省略自增值的section会被设置为默认值1,section先自增1,再自增2,相当于自增3*/h1{counter-increment:section第2节;另外,counter-reset属性遵循级联原则,如果两个计数器要同时复位,必须同时指定。h1{计数器重置:第0节图像0;}/*下面的写法会级联,只导致一个计数器生效*/h1{counter-reset:section0;}h1{计数器重置:图像0;}嵌套计数器Withscope计数器是自嵌套的,如果重置位于后代元素或伪元素中的计数器,则会自动创建一个新的计数器实例。计数器的范围从文档中具有“counter-reset+thatcounter”的第一个元素开始,包括该元素的后代和后续兄弟及其后代,但不包括范围内具有相同名称的计数器的任何元素。
  1. item
    1. item
  2. item
效果如图display:none元素中的计数器display值为none的元素不会增加或重置计数器,也不会是无法渲染的伪元素,而带有可见性设置为隐藏将增加或重置计数器。list具有display:list-item的元素会为元素的内容生成一个主块框,并且可能会生成一个标记框作为该元素是列表项的视觉指示。background属性仅适用于主框,外部标记框是透明的。(但是如果list-style-position的值设置为inside,由于markerbox的背景是透明的,所以mainbox设置的背景会透出来,视觉上相当于加了背景)。背景根据盒子模型,背景是指内容、填充和边框区域的背景。边框颜色和样式可以通过边框属性设置,而边距始终是透明的。设置边框颜色当设置为透明时,背景的颜色会透出来。

background属性是不可继承的,但是由于background-color的初始值是透明的,父框的背景会透出来。此外,当同时设置了background-image属性和background-color属性时,如果可用,图像将在背景颜色之上呈现。这也意味着,在图像的透明部分,背景颜色是可见的。Outline(轮廓)轮廓与边框的区别:轮廓不占用空间,显示或隐藏不会造成重排或溢出。矩形的所有方向上的轮廓可能不相同。与border相比,没有outline-top或outline-left属性,如果元素被拆分成多行,与border相比,outline不会在linebox的首尾断开,而是一直尽量完全连接(效果如下图),因为outline不影响formatting,可能会和页面上的其他元素重叠。outline-width接受与background-width相同的值(隐藏除外)。outline-style接受与background-style相同的值(隐藏除外)。outline-color接受与background-color相同的值。另外,outline-color也可以设置为invert,用来反转屏幕的像素(但并不是所有的浏览器都支持这个属性)。默认样式下,不指定字号时,title字号比常规字号略粗,h4字号与常规字号相同,h5和h6字号比常规字号略小常规字体。h1,h2,h3,h4,h5,h6{字体粗细:粗体;}h1{字体大小:2em;保证金:.67em0;}h2{字体大小:1.5em;保证金:.75em0;}h3{字体大小:1.17em;保证金:.83em0;}h4{边距:1.12em0;}h5{字体大小:.83em;保证金:1.5em0;}h6{字体大小:.75em;保证金:1.67em0;}