你真的会CSS吗?[Css选择器系列一]

 css-360.png

选择符、选择器优先级、选择器作用域

/* 后代关系 */
.box div {background: #fff;}
/* 父子关系 */
.box > div {background: #fff;}
/* 相邻兄弟关系 */
.box + div {background: #fff;}
/* 兄弟关系 */
.box ~ div {background: #fff;}
以上四种是我们在编写CSS样式文件中常见的选择符,除此之外还有双管道符 || 和管道符 | ,相关知识内容个人理解不太用的到,此处不做阐述。

选择器作用域

  • 选择器的作用域除基本是全局作用域的,即网页的样式呈现只关乎CSS代码的作用顺序,无关元素本身顺序。
  • 除此之外,现如今CSS选择器是有局部作用域概念的,如Vue文件中的 <style scoped>

选择器优先级

优先级权重(计算时数值表示)
通配符、选择符、逻辑组合伪类0
元素选择器1
类名选择器、属性选择器、伪类10
ID选择器100
style内联样式-
!important-

Tips:

  • 只有逻辑组合伪类 :not()
  • 使用权重计算,利于样式重置,同时由于!important 权重过高,且能够重置Javascript修改的样式,不建议使用,避免引起的混乱
  • style内联样式则用于需要临时进行修改的地方,或者当样式文件重置时比较麻烦时可修改html代码
  • 关于样式重置时,同样的选择器复制粘贴到样式文件末尾不起作用时,可利用重复选择器本身来提高选择器权重,例如:

  .box.box div {background: #f99;}

选择符

选择符,常用的其实不难理解,但是我们在查看一些UI框架,如 ElementUIAntDesignVueLayUI 等,会从中发现一些值得学习的地方,对于选择符的利用可以巧妙的解决一些需要特例化的样式。

后代选择符【空格】( )与子选择符【右键头】( > )

子选择符只会匹配当前元素的第一(个)代子元素,后代选择符则匹配所有子元素

<ul>
    <li>#f99</li>
    <li>#f99</li>
    <ol>
        <li>#333</li>
    </ol>
</ul>

ul li {background:#333;}  // ul内所有子级li的背景色#333
ul > li {background:#f99;} // ul内第一子级的li的背景色#f99
Tips:
子选择符适用于结构固定不变的场景,对于熟悉程度来说,还是尽量使用后代选择符来解决。

相邻兄弟选择符【加号】(+)与兄弟选择符【波浪号】(~)

相邻兄弟选择符仅匹配当前元素后的第一个同级兄弟元素,兄弟选择符则匹配其后的所有同级兄弟元素
对于前端项目中或UI框架中常见的单选/复选框的变化,则使用“+”居多,且便捷。
实际代码参考:

.el-checkbox.is-bordered+.el-checkbox.is-bordered {
    margin-left: 10px
}

.radio {margin-top:15px; position:relative;}
.radio input[type="radio"] {position:absolute; opacity:0;}
.radio input[type="radio"] + .radio-label {cursor: pointer;}
.radio input[type="radio"] + .radio-label:before {content: '';background: #ffffff;border-radius: 100%;border: 1px solid #bac4d0;display: inline-block;width: 14px;height: 14px;position: relative;top: 1px;margin-right: 4px;vertical-align: top;cursor: pointer;text-align: center;-webkit-transition: all 250ms ease;transition: all 250ms ease;}
.radio input[type="radio"]:checked + .radio-label:before {background-color: #4399ff!important;box-shadow: inset 0 0 0 2px #ffffff;}
.radio input[type="radio"]:focus + .radio-label:before {outline: none;border-color: #bac4d0;}
.radio input[type="radio"]:disabled + .radio-label:before {box-shadow: inset 0 0 0 2px #ffffff;border-color: #b4b4b4;background: #b4b4b4;}
.radio input[type="radio"] + .radio-label:empty:before {margin-right: 0;}
Tips:
CSS样式文件的解析顺序是从上至下来进行的,因此,我们在实际项目中可以进行重置改写,同时CSS选择器是没有向前选择的选择符,这样也是避免浏览器渲染后界面又发生大幅度变化
body,html的样式改写也应当在整个CSS文件最顶部,不要夹杂在中间,会很不规范,也有可能出现闪屏的问题

元素选择器

  • 元素选择器本身不能像类选择器那样重复
  • 搭配属性选择器使用时元素选择器必须前置书写

Tips:

  • 元素选择器不区分大小写,尽管我们在Eslint代码后可能警告是因为其不规范,所以我们的样式文件中尽量都是小写字母,包括在元素的class命名及样式的属性值时也尽量合理使用小写字母,如同一份样式文件中,颜色值应尽量统一小写#fff等
  • 自定义元素<x-ele><x-ele>,现代浏览器是支持的,即Html5中的语义化标签,自定义标签可能更符合应用场景,但是由于项目需要兼容IE,一直没有实践的机会。

书中了解到,自定义元素兼容IE8,需要在<head>内添加一段Javascript代码,
<script>document.createElement('x-ele');</script>
个人理解:现在许多项目利用前端框架,Vue/React等,对于IE是不兼容到低版本的,而且创建过多的自定义        元素也需要添加许多Javascript代码,有些不太现实。

  • 通配符(*),仅在CSS reset中使用,项目内不建议使用,由于匹配到所有元素,避免产生问题。
* {margin:0; padding:0;box-sizing:border-box;}

CSS知识巩固学习整理中......

Github -- JasonSubMara

语雀 -- JasonSubmMra


参考链接 | 书籍

  • 张鑫旭《CSS选择器世界》

JasonSubmara
196 声望2 粉丝