资讯专栏INFORMATION COLUMN

CSS选择器、层叠、继承的那些事

xfee / 704人阅读

摘要:选择器的作用就是将相应的元素选择出来,并为他们应用样式。给别名为孩子穿上黑色西装选择器用来寻找特定的元素。效果图这里需要注意的就是是完全匹配的,所以即使李老二的属性有,但没有成为金色背景的缘故。

题外话

最近看了《精通CSS,高级web标准解决方案》这本书。所以接下来的几篇文章结合自己的理解,参照本书做一下总结。

好,废话不多说,开始进入正题。

CSS的前世今生

在很久很久以前,早期的浏览器只支持简易版本的HTML,使用HTML添加基本的格式和结构。但是随着web的流行,人们开始不满足于只有结构和文本的样式了!!

看一下1999年搜狐的页面:

人都是爱美的,所以HTML开始用来表现页面了,这样一来就web领域就变得一团糟了,试想一下当你把所有的样式都装在同一个HTML文档的时候,是多么的恐怖。

发展到了这里,HTML有点跑偏了,貌似HTML并没有被看作是简单的标记语言,反而是把表现、布局与内容融成了一团,让人们看起来复杂、混乱、更加易于出错(不仅仅易于出错,查错也相当困难!)。总之开发人员避而远之,用可视化的编辑器来代替。这样下去的结果就是:连开发者自己都不知道如何编写代码。(所以当时的负责web开发的程序员可能也是蒙圈的状态)

就在一筹莫展之际,CSS横空出世!解决了这一问题,CSS出现的意义就是:要文档的内容与表现分隔开。这对于程序员应该相当熟悉了,内容与表现分开的好处就在于:我在多带带设计内容时候,不用考虑表现,在多带带实际表现的时候,不用过分的考虑内容,这样下去带来的结果就是:①更加简单,架构清晰。②修改容易,在一个地方修改,就会贯彻到整个系统。

所以,标记(HTML)再一次返璞归真,天下太平。

我们极力摆脱内容与表现重合,所以在以后的设计中,尽可能的区分出内容和表现。
为HTML元素命名的时候,要根据“它是什么”,而不是“它的外观是什么"命名。

例如:
如果你想要新闻类型的元素表现为红色。好的命名:news 坏的命名:red 同理leftbottom类似的方位命>名,也是不好的。
CSS选择器 何为选择器?

答:选择+容器。(即挑选出来,并放到容器中)

我们之前提到了要把内容和表现分离,而选择器就是实现这一技术的重要手段。

如果我们把HTML和CSS开发的过程想象成不同人打扮自己的话。

那么HTML就是如图所示的人,他是一个结构化的语言,他可以将页面分为好几个部分,每个部分又包含了不同的元素。

如:头部包含头顶,眼睛,耳朵等等。

那么CSS是什么呢,CSS是装扮人的东西!!
比如:帽子,眼镜,外套等等。他的目的就是让人有不同的风格,更好看,也有可能更丑(这取决于不同人的审美)。

CSS选择器的作用就是将相应的元素选择出来,并为他们应用样式。

比如:把眼睛选择出来给他戴上眼镜把脖子选择出来,带上领带

怎么样,理解了吧!!!

接下来就让我们看看有哪些选择器!

元素选择器

最最普遍的选择器,也是最简单的。只需要元素就可以了

//给h2小帅哥穿上黑色西装
h2 {
    color:black;
}
后代选择器

用来寻找特定元素的后代。

//快给div家族的孩子h2穿上黑色西装。
div h2 {
    color:black;
}
类选择器

用来寻找特定的类。

//给别名为news孩子穿上黑色西装
.news {
    color:black;
}
ID选择器

用来寻找特定ID的元素。

//给ID为header的美女穿上黑色西装
#header {
    color:black;
}

以上四种选择器,是最简单,也是最常用的几个类。可以互相结合
如:

//选择类名为news的p元素
p.news {
    color:red;
}
伪类选择器

这个是什么意思呢?不要只要看到没见过的东西就着急查资料。其实很简单!

联想一下:那什么是“伪娘”呢?哈哈哈

伪类:伪装成类的一种类,他本身不是类。

其中分为以下两类:

只对于链接a 元素有效的是:a:link a:visited

应用于任何一个元素::hover :active 和:focus 还有:first-child :lang

通用选择器

用*来表示选择出所有的元素。

* {
    padding:0;
    margin:0;
}
子选择器和相邻孩子选择器

还记得后代选择器吗,用空格表示前面元素的后代,这个后代是个很大的概念,儿子算是后代,孙子也是后代......所以就突出儿子选择器的重要性了!!

用>这个符号来用于儿子选择器.

“>”:是左边的地位比右边的大,所以左边代表父亲,右边代表儿子。

而相邻孩子选择器用“+”,该如何理解呢?

“+”: 一方面是代表两个元素是平等的,都处于同一级别,另一个是代表着连接的意思,也就是说左边的元素之后的某一个元素。

例如:

//儿子选择器,选择的是nav的儿子li
#nav>li {
    padding:20px;
}

//相邻孩子选择器,选择的是,和h1同等级别的,并且在和h1紧邻的后面的p元素
h1 + p {
    color:red;
}
属性选择器

根据某个属性值来寻找元素。用[属性值]来表示
可以根据这个属性值搜索出来很多东西。
先给出html的代码:

这是我的朋友名单:

  • 张大傻
  • 李老二
    • 哈巴1
    • 哈巴2
  • 王尼玛
  • 仙女喵
  • 正最傻

预览图

关于属性选择器的匹配问题:

1.精确匹配

[attr]:包含attr属性的全部元素。
[attr="title"]:属性仅是attr=title的全部元素,精确匹配!
[attr~="title"]:其中包含title的attr属性的元素(中间有空格)。

/*将所有my-friend属性的元素 设置成蓝色*/
[my-friend] {
    color:blue;
}

/*将排名为第一的my-friend属性的元素 设置成金色的背景*/
[my-friend="1"] {
    background-color:gold;
}

/*将my-dog 属性的ul元素设置成灰色*/
ul[my-dog] {
    color:#ccc;
}

/*将my-friend属性并且包含stupid 的元素,用红色显示。*/
[my-friend~="stupid"] {
    color:red;
}

效果图:

这里需要注意的就是:
attr="title"是完全匹配的,所以即使李老二的myfriend属性有1,但没有成为金色背景的缘故。

2.模糊匹配

[attr|=val] : 选择attr属性的值以val(包括val)或val-开头的元素(-用来处理语言编码)。(把中间的一竖理解为:隔断墙,后面就是从隔断墙头开始的元素。)

注意:这个必须是整个单词,经过本人测试,val是整个单词的时候,和attr=val效果是一样的,如果有单词中有 - ,效果和attr^=val- 一样的。(注意短横)
[attr^=val] : 选择attr属性的值以val开头(包括val)的元素。(把^理解为脑袋,就是“头”了啊。)
[attr$=val] : 选择attr属性的值以val结尾(包括val)的元素。(把$理解为尾巴)
[attr*=val] : 选择attr属性的值中包含字符串val的元素。(想一下游戏中的屏蔽系统吧:我草泥马会被屏蔽掉 。怎么样,很形象吧?)

/*上面的代码省略不写,和上面一致*/

/*将以my开头的 class所有元素加粗显示*/
[class|="my"] {
    font-weight:bold;
}
/*其他类似。不再一一列举*/

最终效果图:

关于层叠

如果你对上面所讲到的穿衣服印象深刻的话,那么层叠就代表着穿上衣服最后呈现的效果,这个效果和很多因素有关。

比如:你妈妈叫你穿秋裤,你虽然不想穿,但是还是得穿上,你觉得太丑,在外面套上了帅气的牛仔裤,虽然里面有点肥,但是还是很好看。

这一过程就体现了层叠, 页面中最终呈现的效果和不同选择器的优先级有关,我把这个总结成五看,而不是像一些书中的用特殊性的进行解释(我觉得不太适合理解)。

一看:看该样式是不是行内样式,是优先级最高。(所谓行内样式就是在html中直接指定的样式)
二看:ID选择器的数量越多,越优先显示
三看:看类,伪类,属性选择器的数量,越多越优先显示
四看:看元素,伪元素选择器的数量。
五看:在以上全部相等的情况下,最后样式的会覆盖掉先前的样式。

举例:
#wrapper #content{}#wrapper p{}同时作用的时候, 第一个优先显示,因为有两个ID选择器

所以有的时候,为了防止有层叠的现象产生,会多加一个id选择器或类选择器,好让他的优先级变高。设计的时候,要秉承着一般性样式优先级降低,特殊性样式要优先级升高的原则

从这里再退回到伪类选择器的地方。对于链接的伪类有五个,他们是有一定的层叠优先级的。
顺序是::link,:visited,:hover,:focus,:active。
是不是觉得很难记?

没关系,记住这一句话,你就能记住了:lvhfa(你好烦啊)!分别是前面的首字母。快去应用几次,你就完全记住了!

关于继承

继承的意思就是:祖先留给孩子的遗产。

在CSS也是这样,如果后代元素没有定义样式,那么会继承自祖先的样式。

继承的优先级为空!你可能会想到标题元素,如果在主体上设置字号,而标题元素却好像没有继承下来,这是为什么呢?

那是因为浏览器会给默认样式设置标题字号。所以优先显示。

更新情况

2017.12.02 完成写作

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/112875.html

相关文章

  • CSS选择层叠继承那些

    摘要:选择器的作用就是将相应的元素选择出来,并为他们应用样式。给别名为孩子穿上黑色西装选择器用来寻找特定的元素。效果图这里需要注意的就是是完全匹配的,所以即使李老二的属性有,但没有成为金色背景的缘故。 题外话 最近看了《精通CSS,高级web标准解决方案》这本书。所以接下来的几篇文章结合自己的理解,参照本书做一下总结。 好,废话不多说,开始进入正题。 CSS的前世今生 在很久很久以前,早期的...

    yanbingyun1990 评论0 收藏0
  • 浏览渲染那些(二)

    摘要:接上一篇浏览器渲染的那些事一继续说。哈希表的选择器各不相同,包括,标记名称等。例如,如果选择器是,就把规则放入的哈希表中还有一种通用哈希表,适合不属于上述类别的规则。 接上一篇浏览器渲染的那些事(一)继续说。 构建呈现树 Render Tree/Frame Tree 渲染的流程: 在这部分我们来讲一下构建Render Tree的过程。呈现树主要是负责布局并将自身及其子元素绘制出来。We...

    沈建明 评论0 收藏0
  • 浏览渲染那些(二)

    摘要:接上一篇浏览器渲染的那些事一继续说。哈希表的选择器各不相同,包括,标记名称等。例如,如果选择器是,就把规则放入的哈希表中还有一种通用哈希表,适合不属于上述类别的规则。 接上一篇浏览器渲染的那些事(一)继续说。 构建呈现树 Render Tree/Frame Tree 渲染的流程: 在这部分我们来讲一下构建Render Tree的过程。呈现树主要是负责布局并将自身及其子元素绘制出来。We...

    MadPecker 评论0 收藏0
  • 浏览渲染那些(二)

    摘要:接上一篇浏览器渲染的那些事一继续说。哈希表的选择器各不相同,包括,标记名称等。例如,如果选择器是,就把规则放入的哈希表中还有一种通用哈希表,适合不属于上述类别的规则。 接上一篇浏览器渲染的那些事(一)继续说。 构建呈现树 Render Tree/Frame Tree 渲染的流程: 在这部分我们来讲一下构建Render Tree的过程。呈现树主要是负责布局并将自身及其子元素绘制出来。We...

    Crazy_Coder 评论0 收藏0
  • 什么是 CSS

    摘要:的第二章,什么是释义,层叠样式表也算是一种标记语言,其内容作为浏览器的输入,浏览器会解析其文本内容,作为附加的样式信息,用以修饰标签。年,提出层叠样式表,的雏形出现。属性的继承开篇我们就提到了,为层叠样式表,层叠代表的意思为属性的继承。 前言 作为程序员,技术的落实与巩固是必要的,因此想到写个系列,名为 why what or how 每篇文章试图解释清楚一个问题。 why what ...

    hankkin 评论0 收藏0

发表评论

0条评论

xfee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<