前端极易被误导的css选择器权重计算及css内联样式的妙用技巧

  记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较。。。
  我只想说:真是误人子弟,害人不浅!

  最近,在前端群里还发现以上观点类似的奇葩聊天,真是***

  其实,也是在很久以前,看了腾讯ISUX的一位前端工程师-麦时分享的一篇技术文章(个人站点已失效,就不贴出来了),才了解到真正的css选择器权重计算。

  以下是css选择器权重计算精华所在,翻译自国外的文档(记得是W3C给出的计算规则)



  如果一个声明来自style属性而不是选择器,计作1或者a=1(在一个html文档中,元素“style”的值是样式表规则,这个规则中没有选择器,所以a=1, b=0, c=0, and d=0)
  选择器中id属性的个数,计作b
  选择器中其他属性以及伪类的个数,计作c
  选择器中元素及伪元素的个数,计作d
  优先级只基与选择器的形式,特殊的,一个“[id=p33]“形式的选择器是按照属性选择器来计算的(a=0, b=0, c=1, d=0),即使用定义中包含ID
  一些例子:  

 1 * {}     /* a=0 b=0 c=0 d=0 -> 优先级= 0,0,0,0 */
 2 li {}     /* a=0 b=0 c=0 d=1 -> 优先级 = 0,0,0,1 */
 3 li:first-line {}     /* a=0 b=0 c=0 d=2 -> 优先级 = 0,0,0,2 */
 4 ul li {}     /* a=0 b=0 c=0 d=2 -> 优先级 = 0,0,0,2 */
 5 ul ol+li {}     /* a=0 b=0 c=0 d=3 -> 优先级 = 0,0,0,3 */
 6 h1 + *[rel=up]{}     /* a=0 b=0 c=1 d=1 -> 优先级 = 0,0,1,1 */
 7 ul ol li.red {}     /* a=0 b=0 c=1 d=3 -> 优先级 = 0,0,1,3 */
 8 li.red.level {}     /* a=0 b=0 c=2 d=1 -> 优先级 = 0,0,2,1 */
 9 #x34y {}     /* a=0 b=1 c=0 d=0 -> 优先级 = 0,1,0,0 */
10 style=""     /* a=1 b=0 c=0 d=0 -> 优先级 = 1,0,0,0 */

  [备注] 
  :first-line 伪元素
  [rel=up] 其他属性

  了解了这些 你应该不会再对”11个class与一个id”谁的优先级高“这类的问题有疑问了吧,因为a,b,c,d只是在各自位置数字的累加,而不会越级。



  其实,这里还漏了一个重要的东西,那就是!important了。这是一个神奇的东西~

  首先强调的是!important的使用问题:如height:100px !important; 菜鸟一定会疑问,为什么important前面要加空格,其实没什么,不加也可以,只是为了阅读方便,呵呵~

  important可以让前面所有的权重计算变得可笑,因为css属性值添加了important后,前面所有的努力白费了,行内式的权重也高不过它,除非再声明一个加important的属性值来覆盖它(注意是由css属性值读取的顺序决定的)。

  比如h1{height:100px !important;}要覆盖这个height值为200px的话,要在其后加上h1{height:200px !important;}

  而一般!important值的相互覆盖,是取决于浏览器在加载css文件时,对样式表的读取顺序决定的。在大项目中,很难预料你的文件是先加载还是后加载,特别是公用css文件,不建议加这个特殊值。

  讲到这里,提个额外的点:css样式的读取解析,是按从右到左进行的,所以不要误以为写#id .class1 .class2 .class3{}这样的选择器,浏览器会因为唯一id存在而查找很快,其实是更慢,最好是保持三个层级,不要层级过多。

  还有,很多人喜欢写.class1.class2{}这样的交集选择器,一般是跟js配合做一些显示效果。关键是IE6不支持这种交集选择器,像p.class1{}这样的标准复合选择器,IE6等低版本浏览器才能完美支持。(ps:公司同事踩过这个坑,在IE6下把我的css代码给覆盖了,我还查了老半天——最后知道真相的我眼泪掉下来)

  

  其实,懂得上面的这些东西了,你的css水平才算入门(没错,只算入门)。

  接下来,讲一些很实用的技巧(其实也就是上面基础知识的融会贯通):

  场景:当鼠标hover到id为content的div后,将高度由auto改变为30px;

  1.菜鸟级写法

1 $("#content").hover(function(){
2     $(this).css({"height":"30px"});
3 },function(){
4     $(this).css({"height":"auto"});
5 });

  那如果这个div本身height不是auto呢,你是不是又得知道其默认的height属性值。

  所以这种写法很不好,学术一点的叫做硬编码、强耦合。

  2.普通写法

1 .content_normal{height:20px;} /*默 认应用的样式*/
2 .content_change{height:30px} /*hover时候应用的样式*/
1 $("#content").hover(function(){
2     $(this).addClass("content_change");
3 },function(){
4     $(this).removeClass("content_change");
5 });

  3.适用性的高级写法

var $extStyle = $("head").find("#extStyle");

$("#content").hover(function(){

    //向头部插入一个内链样式表
    if($extStyle.length < 1){
         var styleElem = document.createElement("style");
         styleElem.setAttribute("type", "text/css");
         styleElem.setAttribute("id", "extStyle");
          $("head").append(styleElem);
         $extStyle = $("head").find("#extStyle");
      }

     $extStyle.append("#content{height:30px;}");
},function(){
     $extStyle.empty();
});

  第三种写法的好处就是,不管需求怎么变,都可以轻松覆盖样式,也可以避免第一种写法存在的style="height:auto;"的情况。因为height:auto;有时也是致命的,在项目中就遇到过这样的问题。

  缺点就是要向头部插入一个style节点,对于小需求的话就有点小题大做。但是大项目中,可以内部默认一个style节点负责插入这些暂时性修改的样式数据,方便删除,不弄脏代码。

  最后提一个很重要的点:在IE下,style节点最多是31个,多了它不认,呵呵~

原文地址:前端极易被误导的css选择器权重计算及css内联样式的妙用技巧

时间: 2024-08-07 08:25:38

前端极易被误导的css选择器权重计算及css内联样式的妙用技巧的相关文章

CSS 选择器权重计算规则

CSS 选择器(Selector)的权重(Specificity)决定了对于同一元素,到底哪一条 CSS 规则会生效.且仅有当多条 CSS 规则都对同一元素声明了相应样式时,才会涉及到权重计算的问题. 选择器的分类 正式计算选择器权重之前,先来看选择器是如何被分类的. 因为 CSS 选择器众多,在计算时,这些选择器被归为了三大类,按其权重由大到小依次为: ID 选择器:比如 #dialog 元素类型选择器(type selector)和伪选择器(pseudo selector):比如 h1,::

CSS选择器权重计算

权重计算规则 内联样式,如: style=" ",权值为1000. ID选择器,如:#content,权值为0100. 类,伪类和属性选择器,如.content,权值为0010. 类型选择器和伪元素选择器,如div p,权值为0001. 通配符.子选择器.相邻选择器等的.如*.>.+,权值为0000. 继承的样式没有权值. 权值越大,权重越高 !important !important 用来提升优先级,加了这句的样式的优先级是最高的. 原文地址:https://www.cnblo

CSS选择器权重计算规则

1.第一等:代表内嵌样式:如:style=" ",权重值为10000. 2.第二等:代表ID选择器:如:#content,权重值为0100. 3.第三等:代表类,伪类和属性选择器:如:.content,权重值为0010. 4.第四等:代表元素和伪元素选择器:如:div p,权重值为0001. 5.第五等:代表通配符,子元素选择器和相邻兄弟选择器等:如:*.>.+,权重值为0000. 6.继承的样式没有权重值. 7.!important; !important的作用是提升优先级,换

8 1 css 2 元素就是标签 2 内联样式 3 css选择器 style ,head ,内部样式表 4 外部样式表 css文件, link标签 ,href,

1 2 3 4 原文地址:https://www.cnblogs.com/anvivi/p/9694814.html

CSS的内联样式和外链样式简单介绍

CSS的内联样式和外链样式简单介绍:关于标题中的概念可能很多朋友根本就有在意过,或者没有特别的注意,但并不说明他们就没有使用对应的方式设置样式,但是能够明白各自的代表那种方式总比不明白的好,下面就介绍一下它们各自的概念.一.内联样式:所谓的内联样式就是直接写在标签内部的样式,代码如下: <div style="color:red">蚂蚁部落</div> 以上代码可以将字体颜色设置为红色.二.外链样式表:外链样式表就是通过在网页头部利用link标签引用一个单独的c

CSS:外部样式表/内部样式表/内联样式

在html中,引用CSS样式有3中方式:外部样式表,内部样式表,内联样式. 本文代码整理自w3school:http://www.w3school.com.cn (1)外部样式表,指在html文件的head标签中,使用link引用另一个css文件中定义的样式.如果某个样式表需要被使用许多次,使用外部样式表是最好的选择. html文件: <html> <meta http-equiv="Content-Type" content="text/html; cha

css选择器权重、样式继承、默认样式

学过css的小伙伴都是指css选择器的权重 !important Infinity 行间样式 1000 id   100 class|属性|伪类 10 标签|伪元素 1 通配符 0 权重相同 相同css文件:写在后面的起作用 不同css文件:后导入的起作用 但今天遇到一个问题 <body> <div style="color: red"> <span>123</span> </div> </body> 却是这样的

css 选择器的优先级-【css选择器世界】

1 对于优先级的计算,数值计数法: 每一段css语句的选择器都对应一个具体的数值,数值越大,优先级越高,其中的css语句将被优先渲染. 其中:出现一个0级选择器,优先级数值+0: 出现一个1级选择器,优先级数值+1: 出现一个2级选择器,优先级数值+10: 出现一个3级选择器,优先级数值+100: 2 css优先级规则 0级:通配符选择器.选择符.逻辑组合伪类 * + .> .~.空格.|| 逻辑组合伪类: :not .:is.:where 1级: 标签选择器 2级:类选择器,属性选择器,伪类

CSS三种引入方式:内联、页级、外联

1.内联CSS 内联CSS也可称为行内CSS或者行级CSS,它直接在标签内部引入,显著的优点是十分的便捷.高效:但是同时也造成了不能够重用样式的缺点,如果代码行数到达一定长度不建议采用.通常内联CSS作为测试使用,可以查找代码中bug. 1 <body> 2 <div style="width: 65px;height: 20px;border: 1px solid;">测试元素</div> 3 </body> 2.页级CSS 页级CSS