一、背景


翻出我4年前看的《精通CSS》一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西、知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 blog 系列,以犒自己。

二、选择器


1、基本选择器

(1)标签选择器 ——elementname

(2)类别选择器 ——.elementname

(3)ID选择器 ——#elementname

(4)通用选择器 ——*

2、组合选择器

符号 说明
A > B 子代选择器
A B 后代选择器
A + B 相邻兄弟选择器
A ~ B 兄弟选择器

注意:相邻兄弟选择器和兄弟选择器都不能选择自身以上的元素

因为这样会导致回溯,所以CSS一直几乎都没有这样的选择器。

防止回溯的原因是,浏览器最初设计的时候就考虑了渐进显示,也就是整个文档加载了多少就显示多少内容,而不用等整个下载完。

3、属性选择器

属性选择器允许用户自定义属性名称

代码 说明
[attribute] 元素有attribute属性。
[attribute="value"] 属性attribute里是value
[attribute*="value"] 属性attribute里含有value
[attribute~="value"] 属性attribute里使用空白分开的字串里其中一个是value
[attribute|="value"] 属性attribute里是value或者以value-开头的字符串
[attribute^="value"] 属性attribute里最前的是value
[attribute$="value"] 属性attribute里最后的是value

3、伪类 / 伪元素选择器

官方文档的定义:css 引入伪类和伪元素概念是为了格式化文档树以外的信息

(1) 伪类

:first-child:last-child 称为结构性伪类。

:link:visited 称为链接伪类。

:hover:active:focus 称为动态伪类。

:enabled:disabled:checked 称为表单伪类。

:not() 称为反选伪类。

:target 称为 target 伪类。

伪类选择器可以叠加使用,例如:a:visited:hover {color:olive;}

(2) 伪元素

:before - 在元素的内容前面插入新内容。

:after - 在元素的内容之后插入新内容。

:first-letter - 向文本的首字母设置特殊样式。

:first-line - 向文本的首行设置特殊样式。

伪元素的特点:

1、伪元素不属于文档DOM节点。

2、伪元素属于主元素的一部分,因此点击伪元素触发的是主元素的click事件。

特别说下:before:after

可以搭配content属性,添加字符串作为输出。

添加的内容默认是inline元素,且只是单纯的字符串,不支持 html。


伪类与伪元素的区别在于:有没有创建一个文档树之外的元素

三、CSS 层叠


1、层叠的概念

还记得前面提到的,CSS 的全程是 Cascading Style Sheets,这里 Cascading(层叠)的含义,包括两种:

1、样式的权重

2、样式的继承

2、样式权重

样式的权重导致:权重高的样式覆盖权重低的样式

(1) 不同的来源

首先我们看下定义样式的不同来源:

1、用户样式

虽然规范中有,但从 chrome 33 起不支持了,而是建议使用扩展来实现。

2、内联样式

3、内部样式

4、直接外部样式

html 引入 <link rel="stylesheet" type="text/css" href="index.css"/> -->

5、间接外部样式

css 的 <style> 里用 @import 引入

6、浏览器(默认)样式


注意:

下面这两种写法是一致的:

<style>
#main {
background-color: red;
}
@import "index.css";
</style>
<style>
@import "index.css";
#main {
background-color: red;
}
</style>

因为会自动把 @import 提前,类似 js 里 var 可声明前置 (而 let 不行)。


(2) 选择器优先级值

一个元素可能会有多个来源、多个匹配的选择器( 内联、内部还是外部[直接/间接] )的样式。而针对这些选择器,都会有对应的可以计算出来的优先级值

选择器优先级值是由 ABCD 四个参数来决定的,计算规则如下:

  1. 如果存在内联样式,那么 A = 1, 否则 A = 0;
  2. B 的值等于 ID选择器 出现的总次数;
  3. C 的值等于 类选择器属性选择器伪类 出现的总次数;
  4. D 的值等于 标签选择器伪元素 出现的总次数 。

例如 #nav-global > ul > li > a.nav-link 算出来的优先级值为 (0, 1, 1, 3)

计算出各个选择器的优先级值后,根据规则算出权重:

将优先级值从左往右依次比较 ,较大者胜出,如果相等,则继续往右移动一位进行比较 。

如果全相等,则遵循后来居上的原则

所以按照 选择器优先级值 算出的样式权重,除了内联的权重最高,其他的来源不同对权重没有任何影响

(3) !important

规则:

1、!important 的权重 跟 选择器优先级值的权重 比有"一票否决权"。

2、!important之间的权重比较,跟 选择器优先级值 规则一样:

**先看来源:内联 > 内部 / 外部 [直接/间接] **

再看引入顺序:后来居上。

所以按照 选择器优先级值 算出的样式权重,除了内联的权重最高,其他的来源不同对权重没有任何影响

注意:

**尽量避免使用 !important **。

千万不要在内联样式中使用 !important

千万不要在你定义的插件里写 !important

!important 类似 C 语言里的 goto 关键字,用着一时爽,实则隐患无穷。

3、样式继承

(1)自然继承规则

CSS 有的属性可以继承:

azimuth, border-collapse, border-spacing,
caption-side, color, cursor, direction, elevation,
empty-cells, font-family, font-size, font-style,
font-variant, font-weight, font, letter-spacing,
line-height, list-style-image, list-style-position,
list-style-type, list-style, orphans, pitch-range,
pitch, quotes, richness, speak-header, speaknumeral,
speak-punctuation, speak, speechrate,
stress, text-align, text-indent, texttransform,
visibility, voice-family, volume, whitespace,
widows, word-spacing。

有的属性不可继承:

display、margin、border、padding、background、height、min-height、max- height、width、min-width、max-width、overflow、position、left、right、top、 bottom、z-index、float、clear、table-layout、vertical-align、page-break-after、 page-bread-before和unicode-bidi。

且内联元素、块状元素、列表元素、表格元素的继承规则都不一样,很复杂

且如果大量依靠自然继承规则,那么判断样式的来源就会变得困难。

(2)手动控制继承规则
  • inherit:继承父元素。
  • initial :继承浏览器默认样式。
  • unset :默认。若该元素有自然继承,则值为inherit;否则值为initial。
  • revert :若用户定义样式表中有,则恢复此设置;否则,变成 unset。

朝花夕拾《精通CSS》二、选择器 & 层叠的更多相关文章

  1. 朝花夕拾《精通CSS》一、HTML & CSS 的基础

    一.背景 翻出我4年前看的<精通CSS>一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西.知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 b ...

  2. 你真的精通 CSS 了?来挑战一下 CSS 选择器测验吧

    CSS 选择器赋予 CSS 强大的 HTML 元素匹配功能.作为前端开发人员必须要掌握的一部分,可能基本的大家都知道.但是你真的精通 CSS 了吗?挑战一下 CSS 选择器测验就知道. 您可能感兴趣的 ...

  3. IE7浏览器下CSS属性选择器二三事

    一.为何专门说起IE7 以前,或者说数年前,我们从事桌面端网页开发的时候,基本上都还要兼顾IE6浏览器, 即使有些特性,IE7支持,我们也会忽略之.于是,我们会不自然地把IE6和IE7浏览器归为一路货 ...

  4. CSS+DIV入门第一天基础视频 CSS选择器层叠性和继承性

    大家好,我是小强老师, 现在网上的CSS+DIV视频,要么讲的太深,要么太浅,很多初学的同学们总是遇到困难,今天小强老师专门给大家准备了css课程的视频.带你从零基础学习CSS+DIV一直到能独立完成 ...

  5. 朝花夕拾《精通CSS》三、对一些标签元素的使用

    一.背景 翻出我4年前看的<精通CSS>一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西.知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 b ...

  6. css优先级和层叠

    css优先级和层叠 1.优先级    计算方法:        a.行内样式        b.id选择器的数量        c.类,伪类和属性选择器的数量        d.标签选择器和伪元素选择 ...

  7. CSS常用选择器的认识

    ---恢复内容开始--- 前言:在CSS中选择器的种类有很多很多,但是在实际的工作中,我们经常会用到的分为两大类:基础选择器和复合选择器这两个大类,学习选择器的目的就是为了在复杂的页面中能够快速定位到 ...

  8. CSS 1. 选择器

    1.css的介绍 CSS是指层叠样式表(Cascading Style Sheets),样式定义如何显示HTML元素,样式通常又会存在于样式表中.也就是说把HTML元素的样式都统一收集起来写在一个地方 ...

  9. 精通CSS:高级Web标准解决方式(第2版)

    精通CSS:高级Web标准解决方式(第2版) 跳转至: 导航. 搜索 层叠重要度:(也就是说.用户!important能够覆盖inline style) !important.用户>作者.最后是 ...

随机推荐

  1. Centos 8 安装 Nginx

    安装步骤: /* 1. 安装编译工具及库文件 */ yum -y install gcc automake autoconf libtool make && yum install g ...

  2. Enumeration接口和Iterator接口的区别有哪些?

    Enumeration速度是Iterator的2倍,同时占用更少的内存.但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象.同时, ...

  3. 深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

  4. 《Dotnet9》系列-Google ProtoBuf在C#中的简单应用

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  5. Python基础-day02-2

    运算符 目标 算数运算符 比较(关系)运算符 逻辑运算符 赋值运算符 运算符的优先级 数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成 ...

  6. 12-Factor与云原生

    12-Factor与云原生 云原生应用 今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管理,团队建设 有参考作用 , 您可能感兴趣的文章: 精益IT组织与 ...

  7. LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da | ε (3)B -> cC (4)C -> aADC | ε (5)D -> b | ε 验证文法 G ...

  8. React的世界观及与Vue之比较

    写在前面:本文谈论的是主观的个人感受,不追求立场的“客观.公正”,因此我下面所说的很可能是错的,欢迎交流指正. 我学习前端时,跟大部分beginner一样,学的第一个框架是Vue,入职后也一直写Vue ...

  9. CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中

    CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28. 编写了个golang程序,用到了这个C ...

  10. 图像处理之C语言实现二维卷积

    在用C语言实现图像处理中,经常要用到二维卷积的运算,这个在matlab中是非常容易实现的,只需要conv2()就OK啦,而且速度非常的快.但是在C语言中就需要四层的for循环来实现了. 首先二维卷积的 ...