css选择器现在还认不全?那怎么写漂亮的样式呀!!!

简介: 有一次面试一个三年工作经验的前端,我问`css`选择器有哪些?除了`.class 类选择器`、`#id 选择器`还有其他的哪些?

有一次面试一个三年工作经验的前端,我问css选择器有哪些?除了.class 类选择器#id 选择器还有其他的哪些?

他没答上来,说了一句常用的就这些,还有哪些其他的?

来来来,跟我看看css到底有多少个选择器。

css 选择器有哪些?

1. 通配符选择器

通配符选择器(*)可以匹配任何元素,它是最基本的选择器,表现形式如下:

* {
   
   
  color: red;
}

通配符选择器的性能很差,因为它会匹配文档中的所有元素,一般使用在reset.css中,将所有元素的样式重置为默认值,如下:

* {
   
   
  margin: 0;
  padding: 0;
}

记得曾经看过一个很好玩的案例,使用五个*选择器,将元素的背景色变成黑色,如下:

* * * * * {
   
   
  background-color: black;
}

1. 元素选择器

元素选择器,也是标签选择器,是最基本的选择器,它可以匹配到页面中所有的元素,比如divpspan等等。

div {
   
   
  color: red;
}

该选择器使用的地方相对于其他选择器较少,一般用于重置元素的默认样式,如下:

p {
   
   
  margin: 0;
  padding: 0;
}

2. 类选择器

类选择器是以.开头的选择器,它可以匹配到页面中所有的类名,比如class="box"

.class {
   
   
  color: red;
}

类选择器是最常用的选择器,这个就不用多说了。

3. id 选择器

id 选择器是以#开头的选择器,它可以匹配到页面中所有的 id,比如id="box"

#id {
   
   
  color: red;
}

id 选择器的优先级比类选择器高,按照规范,一个页面中只能有一个 id,所以 id 选择器的使用场景也比较少,同时 id
选择器的性能也不如类选择器,所以一般不推荐使用。

4. 属性选择器

input[type="text"] {
   
   
  color: red;
}

属性选择器可以匹配到页面中所有的属性,比如type="text"class="box"等等。
就比如vue的样式隔离,它是通过属性选择器来实现的,vue转换生成的代码如下:


<template>
  <div class="box"></div>
</template>
<style scoped>
.box {
  color: red;
}
</style>

转换后的代码如下:


<html>
<head>title</head>
<style>
  .box[data-v-a1b2c3d4] {
    
    
    color: red;
  }
</style>
<body>
<div id="app">
  <div data-v-a1b2c3d4 class="box"></div>
</div>
</body>
</html>

属性选择器还有很多妙用,例如模糊匹配,比如input[type^="text"],它可以匹配到所有以text开头的属性,比如type="text"
type="text1"type="text2"等等。

5. 伪类选择器

伪类选择器是以:开头的选择器,它可以匹配到页面中的特殊状态,比如hoveractivefocus等等。

a:hover {
   
   
  color: red;
}

伪类选择器可以使用的场景非常丰富,例如鼠标悬停(hover)、鼠标点击(active)、鼠标聚焦(focus)等等。

6. 伪元素选择器

伪元素选择器是以::开头的选择器,它可以匹配到页面中的特殊元素,比如beforeafter等等。

p::first-line {
   
   
  color: red;
}

伪元素选择器是以::开头,伪类选择器是以:开头,很多同学发现伪元素好像用单冒号也可以,其实不然,单冒号是 CSS2 的写法,CSS3
之后规范要求使用双冒号,这样可以更好的区分伪类和伪元素,所以建议大家伪元素选择器使用双冒号。

7. 组合选择器

组合选择器是将多个选择器组合在一起,比如div.boxdiv.box pdiv.box p span等等。
没想到吧,组合选择器也是选择器,大家是不是以为他们是 css 规定的一种语法,其实他们都是选择器中的一员,请不要忽略他们的存在。

div.class {
   
   
  color: red;
}

组合选择器的使用场景很多,例如将一个元素切换到选中状态,一般我们会给它添加一个active类,然后通过active类来切换样式。

.active {
   
   
  opacity: .7;
}

但是如果页面上有多个元素都使用到了active类,那么就会出现样式冲突的问题,而且他们的选中样式还不一样,这时候我们就可以使用组合选择器来解决这个问题。

div.active {
   
   
  opacity: .7;
}

p.active {
   
   
  font-weight: 700;
}

8. 后代选择器

后代选择器是以空格分隔的选择器,它可以匹配到页面中所有的后代元素,比如div pdiv p span等等。

div p {
   
   
  color: red;
}

后代选择有一个特点,就是它可以匹配到所有的后代元素,比如div p span,它可以匹配到div元素下的所有p元素下的所有span元素。


<div>
  <p>
    我是红色
    <span>我是蓝色</span>
  </p>
  <span>我是默认黑色</span>

  <div>
    <p>我是红色</p>
    <p>
      我是红色
      <span>我是蓝色</span>
    </p>
  </div>
</div>

<style>
  div p {
    
    
    color: red;
  }

  div p span {
    
    
    color: blue;
  }
</style>

image.png

9. 子代选择器

子代选择器是以>分隔的选择器,它可以匹配到页面中所有的子元素,比如div>pdiv>p>span等等。

div > p {
   
   
  color: red;
}

不同于后代选择器,子代选择器只能匹配到直接的子元素,比如div>p>span,它只能匹配到div元素下的直接子元素p
元素下的直接子元素span元素。


<div>
  <p>
    我是红色
    <span>我是蓝色</span>
  </p>
  <span>我是默认黑色</span>

  <block>
    <p>我是默认黑色</p>
    <p>
      我是默认黑色
      <span>我是默认黑色</span>
    </p>
  </block>
</div>

<style>
  div > p {
    
    
    color: red;
  }

  div > p > span {
    
    
    color: blue;
  }
</style>

image.png

11. 相邻兄弟选择器

相邻兄弟选择器是以+分隔的选择器,它可以匹配到页面中相邻元素,比如div+p会匹配到div元素后面的第一个p元素。

div + p {
   
   
  color: red;
}

相邻兄弟选择的使用场景有两个,一个是为了消除margin重叠的问题,另一个是为了实现特定的样式。


<div></div>
<p>我是红色</p>
<p>我是默认黑色</p>

<style>
  div + p {
    
    
    color: red;
  }
</style>

12. 通用兄弟选择器

通用兄弟选择器是以~分隔的选择器,它可以匹配到页面中所有的兄弟元素,比如div~p会匹配到div元素后面的所有p元素。

div ~ p {
   
   
  color: red;
}

通用兄弟选择器的使用场景不同于相邻兄弟选择器,他可以匹配到多个元素,对按钮组的样式处理就是一个很好的例子。


<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>

<style>
  button ~ button {
    
    
    margin-left: 10px;
  }
</style>

12. 并集选择器

并集选择器是以,分隔的选择器,它可以匹配到页面中所有的并集元素,比如div,pdiv,p,span等等。

div, p {
   
   
  color: red;
}

一般是用于给多个元素设置相同的样式,例如鼠标悬停时和选中的样式。

button:hover,
button:active {
   
   
  color: red;
}

13. 交集选择器

交集选择器是两个选择器中间没有分隔符,它匹配的元素是同一个元素有不同的特性,比如div.active会匹配到div
元素同时拥有active类的元素。

div.active {
   
   
  color: red;
}

这个选择器在上面的组合选择器中已经有所体现,这里其实还有一个使用场景,就是提升选择器的优先级。

css 选择器优先级

1. 优先级

优先级是指在同一个页面中,当多个选择器同时匹配到同一个元素时,哪个选择器的样式会生效。
一般来书是看css的加载循序的,后加载的css会覆盖前面的css,但是如果css选择器的优先级相同的话,那么就会看css的加载顺序了。

在不考虑!important和属性计算规则的情况下,css选择器的优先级是按照下面的顺序来的。
行内样式 > id选择器 > 类选择器 > 标签选择器 > 通配符选择器 > 继承样式

2. 优先级的计算

优先级的计算可以通过一个四位的数字来表示的,比如0,0,0,0,这个数字的每一位分别代表了不同的优先级,从左到右分别是内联样式、ID选择器、类选择器、标签选择器。

这里有几个注意事项:

  1. 权重低的选择器不能覆盖权重高的选择器,例如class选择器不能覆盖id选择器。
  2. 权重相同的选择器,后面的会覆盖前面的。
  3. !important的优先级最高,不管权重是多少,都会覆盖其他的选择器。
  4. style属性的优先级是最高的,不管权重是多少,都会覆盖其他的选择器。

<style>
  /* 0,0,0,1 */
  div {
    
    
    color: gainsboro;
  }

  /*
   0,0,0,2 因为有两个标签选择器,所以权重是2 
  */
  div span {
    
    
    color: rosybrown;
  }

  /* 0,0,1,1 */
  div .class {
    
    
    color: greenyellow;
  }

  /* 0,1,0,0 */
  #id {
    
    
    color: orange;
  }

  /* 0,1,0,1 */
  #id span {
    
    
    color: blueviolet;
  }
</style>

<div style="color: #f5222d;" id="id" class="class">
  我是红色,因为style属性的优先级最高
  <span>我是蓝紫色,因为id选择器的优先级高于标签选择器</span>
</div>

这个案例建议反复尝试,可以更好的理解优先级的计算,这里有一个在线的优先级计算器
,可以帮助你更好的理解优先级的计算。

总结

css的门门道道有很多,就拿选择器来讲,选择器的使用方式是多变的,选择器的作用就是选择元素,可以选择所有元素,也可以选择元素的某个部分,还可以选择元素的某个状态,这些都是选择器的强大之处。

这次就写这么多吧,下次再写写css的其他选择器,比如伪类选择器、伪元素选择器、属性选择器等等。

目录
相关文章
|
3月前
|
前端开发
如何设置 CSS 盒子模型的边框样式?
CSS盒子模型的边框样式可以通过`border`属性设置,包括边框宽度、样式和颜色。例如:`border: 2px solid red;` 设置了2像素宽的红色实线边框。也可分别设置四边,如`border-top`、`border-right`等。
|
28天前
|
JavaScript 前端开发
jQuery和CSS3斑马线样式range滑块特效
jQuery和CSS3斑马线样式range滑块特效
|
2月前
|
存储 移动开发 前端开发
高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容
本文深入探讨了高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容,旨在提升开发效率、网站性能和用户体验。
52 5
|
2月前
|
前端开发 JavaScript UED
|
2月前
|
前端开发 JavaScript UED
深入理解与应用 CSS 伪类选择器
【10月更文挑战第23天】通过以上对 CSS 伪类选择器的深入探讨,我们可以更好地理解和应用它们,为网页设计和开发带来更丰富、更灵活的样式效果。同时,要注意在实际应用中根据具体情况合理选择和使用伪类选择器,以达到最佳的设计效果和用户体验。
63 2
|
3月前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
350 1
|
3月前
|
编解码 前端开发 JavaScript
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
97 2
|
2月前
|
前端开发
HTML 样式- CSS3
内部样式表适用于单个文件的特别样式,通过&lt;head&gt;部分的&lt;style&gt;标签定义;外部样式表适用于多个页面,通过&lt;link&gt;标签引用外部CSS文件;&lt;style&gt;定义样式,&lt;link&gt;引用资源;已弃用的标签有&lt;font&gt;、&lt;center&gt;、&lt;strike&gt;,属性有color和bgcolor。
HTML 样式- CSS2
HTML样式实例展示了如何使用`font-family`、`color`和`font-size`属性来定义字体样式,以及使用`text-align`属性来设置文本的对齐方式。示例包括标题和段落的样式设置。
|
2月前
|
前端开发
HTML 样式- CSS1
CSS (层叠样式表) 用于为 HTML 元素添加样式,包括颜色、文本、盒子模型等。CSS 可以通过内联样式、内部样式表或外部引用的方式添加到 HTML 中。推荐使用外部引用方式。本教程将介绍如何使用 CSS 为 HTML 添加样式,并提供实例演示。