欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

细说选择器及其权重

程序员文章站 2022-05-29 12:51:17
...

今天也是元气满满的一天呢~

元素的样式有哪些来源呢,我们先看一个例子

  1. <h2>
  2. Hello world
  3. </h2>

这样一段代码浏览器解析完,是一种什么样式呢?
细说选择器及其权重
如上图所示,当我们没有自定义样式的时候,会使用标签自带的用户代理样式表;
那么如果我们给h2添加一个style会是什么效果呢

  1. <h2 style="color=red">
  2. Hello world
  3. </h2>

细说选择器及其权重
细说选择器及其权重
由图中可见,第二个h2的样式有两个来源,一个是用户自定义的样式style,一个是用户代理样式表,也就是浏览器默认样式。
还有一种叫做继承样式,我们来看个示例:

  1. <div class='father'>
  2. <p class='son'>
  3. demo1
  4. </p>
  5. </div>
  6. <style>
  7. .father {
  8. border: 1px solid #acb123;
  9. color: cadetblue;
  10. }
  11. .son {
  12. color: chartreuse;
  13. color: inherit;
  14. }
  15. </style>

我们分别给父级div添加颜色样式,给子级p添加颜色样式,并让p的颜色岁父级标签的变化而变化,这样我们只要修改父级的字体颜色,那么所有继承他样式的字标签的字体颜色都会跟着变动,看一下浏览器中的预览效果:
细说选择器及其权重
那么除了这三种样式来源,还有一种样式,叫做外部样式,即在html中引用一个外部css文件的形式来给元素添加样式,具体写法像这样:

  1. <link href="style1.css" rel="stylesheet" />

这种样式我们以后会大量使用。
知道样式来源后,我们还应该知道他的显示顺序,我们可以很直观的给他们排个序:
行内样式(style="")> 文档样式(<style>标签里的) > 外部样式(link引用的) > 用户代理样式(浏览器默认的)


说完样式来源,我们再来看一下选择器

  • 基本选择器
    首先基本选择器分为4类:标签、属性(重点)、群组(用’,’分隔)、通配符(*);
  1. 标签选择器,即使用HTML标签来选中标签,例如选中文档中所有的p标签,那么我们就可以用p {}的方式来全部选中;
  2. 属性选择器,是重中之重,最原始的写法:input[type="text"] {}这种写法,即选中所有type=text的input标签,或简写为[type="text"]{}。这种毕竟用得少且容易误伤,所以我们采用更多的,就是class来选中标签,写法呈现为 .classname {} 这种标签选中方式既灵活又多变,classname我们可以任意自定义,这样也就实现了样式多样化。另外还有一种权重较高的选择器,叫id选择器,他的写法为#idname {}同样idname也是我们自定义的,但是通常id要保持唯一,所以通常用在单一样式或要提高权重(实现单独样式)的情况下。
  3. 群组选择器,即同时选中多个元素进行统一设置样式,写法如:div.head,div.foot {} ,这样相同的样式可以写在一起,像提取公因式一样,可以使代码更加简洁整齐。
  4. 通配选择器,这是指某元素下所有元素均选中,使用统一样式,例如:html body * {} 给body下所有的元素设置统一样式。
    下面我们用一段代码和示例开整体呈现以下效果
    1. <div style="width: 500px; border: 1px solid;">
    2. <p>item1</p>
    3. <a href="#">item2</a>
    4. <p class="p1">item3</p>
    5. <p id="p2">item4</p>
    6. <div class="d1">item5</div>
    7. <div class="d2">item6</div>
    8. </div>
    9. <style>
    10. /* 标签选择器,会选中所有的P标签 */
    11. p {
    12. background: #a6b8f3;
    13. }
    14. /* 属性选择器,会选中带有该属性的标签 */
    15. a[href="#"] {
    16. background-color: aquamarine;
    17. }
    18. /* 属性选择器:class类的选择器,会选中class是它的所有标签 */
    19. p.p1 {
    20. color: beige;
    21. }
    22. /* 属性选择器:id类的选择器,会选中id是它的唯一标签(唯一性由开发控制,浏览器不校验) */
    23. p#p2 {
    24. color: brown;
    25. }
    26. /* 群组选择器:给选中的所有标签添加统一样式 */
    27. div.d1,
    28. div.d2 {
    29. border: 1px solid #a6b8f3;
    30. }
    31. /* 通配选择器:给选中元素下面所有元素添加统一样式 */
    32. html body div * {
    33. font-size: 1.5em;
    34. }
    35. </style>
    最终展示效果为:
    细说选择器及其权重
  • 上下文选择器(层级选择器)
    有这样一个无序列表
    1. <ul class="list">
    2. <li class="item">item1</li>
    3. <li class="item second">item2</li>
    4. <li class="item third">item3</li>
    5. <li class="item">item4</li>
    6. <li class="item">item5</li>
    7. <li class="item">item6</li>
    8. </ul>
  1. 如果我们要选中ul下所有子元素li,语法如下:.list > li {},所以,选中子元素的符号为:>;
  2. 如果我们要选中ul的所有后代元素,语法如下:.list li {},所以,选中所有后代元素的符号为:空格
  3. 如果我们要选中列表中第二个li的相邻兄弟元素,语法如下:.item.second + * {},即选中相邻兄弟的符号为:+
  4. 如果我们想选中列表中第三个li的下文中所有兄弟元素,语法如下:.item.third ~ * {},即选中元素的下文中所有兄弟元素的符号是:~
    那么活不多说,我们给上面这个列表添加一些样式,看一下选中结果:
    1. <style>
    2. /* 选中ul下的所有子元素li */
    3. .list > li {
    4. color: chartreuse;
    5. }
    6. /* 选中ul的所有后代元素 */
    7. .list li {
    8. border: 1px solid rgb(11, 20, 2);
    9. }
    10. /* 3. 选中第二个li的相邻兄弟: + */
    11. .item.second + * {
    12. background-color: darkgray;
    13. }
    14. /* 4. 选中第三个li的后面所有兄弟: ~ */
    15. .item.third ~ * {
    16. font-size: 1.5em;
    17. }
    18. </style>
    细说选择器及其权重
    结合图片效果理解上文中的css,要多写多练多实践,这样才能加深记忆,把知识真正掌握。

最后我们来总结一下这些选择器的权重吧

先来说结果
id选择器 > class选择器 > 标签选择器
我们可以这样来快速记忆,把权重看成是一个三位数,id代表百位上的数,class代表十位上的数,标签则代表个位上的数,一个就是1,没有就是0,多个就是N;
这样就能很好的区分和记忆了;
下面我们来看一下一些示例:
h2 {}:001;
.list {}:010;
#name {}:100;
div#a,p.b {}:101,011;(群组选择器的权重不是相加而是分开看)
.item.second + * {}:020;
p#p2 {}:101;
看完这些示例总结一下就是数数就好啦,数一下有几个id有几个class有几个标签然后小学加法咯,需要特别注意的是群组选择器是‘,’前后分开算的哦~
OK,今天的总结与分享就到这里啦,有问题的可以浏览讨论!