本文推荐 PC 端阅读~本文版权归 “公众号 | 前端一万小时” 所有,未经授权,请勿转载!
复制代码
css_02
复制代码
1. 伪类选择器有哪些?
2. 伪元素和伪类的区别?
3. 关于 css 选择器,以下说法正确的是?(不定项)❌ header .p 是选择 id 为 header 的类型为 p 的所有后代。✅ header > .p 是选择标签为 header 内的 class 为 p 的直接子元素。✅ #header.p 是选择 id 为 header 同时它的 class 为 p 的元素。✅ #header, p 是选择 id 为 header 的元素以及选择所有的 p 标签。
复制代码

前言: 本篇行文顺序为,首先在第一部分介绍“ HTML 文档树结构”。在完全理解这个“树结构”的基础上,才可以很好的掌握文章下边紧接着的两个大选择器(组合选择器和伪类选择器)。因为,只有有了这个“结构树”,我们本篇讨论的“选择器”才能够起作用。又是很大、很杂、很基础、很重要的知识点,属必掌握项。


1 HTML 文档树结构

通过之前对 HTML 相关知识的学习,我们知道,一个 HTML 文档是以各个元素间的层次结构为基础建立起来的,每个合法的文档都会生成一个结构树(如下例)。

在这个层次结构中,每一个元素都有一个自己的位子,并且每个元素相对于这个结构里的其他元素,它们彼此或是“父子关系”、或是“祖孙—后代关系”、或是“直接相邻关系”、或是“普通相邻关系”等。

(如下例的HTML文档及所对应的“结构树”:)

<!DOCTYPE html>
<html>                                            <head> <meta charset="utf-8"> <title>Oli的前端一万小时</title></head><body><h1>《<em>Oli的前端一万小时</em>》之:xxx</h1> <p><em>本知识学习用时:2小时……</em></p><p><strong><em>前言:</em></strong>Oli是怎样写文章的……</p><h2>一、认识xxx</h2><p>首先把<em>“定义”</em>讲解清楚</p>     <h2>二、为什么xxx</h2>                      <ul><li>是什么<ol>                                           <li>what<ul><li>w</li><li>w</li><li>h</li></ul></li>                            <li>why</li>                           <li><em>how</em></li>  </ol></li><li>为什么</li>                           <li>怎么样</li>  </ul>  <h2>三、怎么样xxx</h2>                      <ol>                                             <li>what</li><li>why</li>                           <li><em>how</em></li> </ol>                  </body>
</html>
复制代码

(文档结构为:)

1.1 父子关系元素

如果一个元素出现在文档层次结构中另一个元素的上一层,则称前者是后者的“父元素”,后者是前者的“子元素”。

1.2 祖孙-后代关系元素

如果一个元素在另一个元素的直接上一层,他们是“父子关系”,而如果一个元素到另一个元素的路径要经过两层或多层,这些元素则是“祖孙-后代关系”。

1.3 根元素

body 元素是浏览器默认显示的所有元素的祖先, html 元素则是整个文档的祖先(因此,html 元素又称“根元素”)。

2 组合选择器

2.1 多元素选择器

  • 用法:为多个元素应用同一个样式;
  • 格式:如给上例中元素 h1 和 h2 加样式,使之背景颜色为 yellow 。
h1,h2 {background:yellow;
}
复制代码

⚠️注意多个选择器之间必须有 , 这个字符。

2.2 后代选择器

  • 用法:使一些样式、规则只在某一些指定的有“祖孙-后代关系”的后代元素上适用,其他非指定的结构中不适用;
  • 格式:如给上例中只给元素 ul 的后代元素 em 加样式,使其文字被中横线划去、背景色为 yellow 。
ul em {text-decoration: line-through;background:yellow;
}
复制代码

⚠️注意选择器之间用“空格”这个“结合符”隔开。

2.3 子元素选择器

  • 用法:使一些样式、规则只在某一些指定的有直接的“父子关系”的子元素上适用,其他非指定的结构中不适用;
  • 格式:如给上例中只给元素 p 的子元素 em 加样式,使其文字被中横线划去、背景色为 yellow 。
p>em {text-decoration: line-through;background:yellow;
}
复制代码

⚠️注意选择器之间用 > 这个“结合符”隔开。

2.4 直接相邻元素选择器

  • 用法:前提,两个元素有共同的父元素,且后一个元素“紧接”在前一个元素后边时,你想对后一个元素添加样式;
  • 格式:如给上例中只给“紧接”第一个 h2 元素的 p 元素加样式,其他 p 不变,使其文字被中横线划去、背景色为 yellow 。
h2+p {text-decoration: line-through;background:yellow;
}
复制代码

⚠️注意选择器用 + 这个“结合符”隔开。

2.5 普通相邻元素选择器

  • 用法:相对于“直接相邻元素选择器”而言,两个元素也必须有共同的父元素,但后一个元素不需要“紧接”在前一个元素后边,你也可以对后一个元素添加样式;
  • 格式:如给上例中第一个 h2 元素后边的 h2 元素加样式,使其文字被中横线划去、背景色为 yellow 。
h2~h2 {text-decoration: line-through;background:yellow;
}
复制代码

⚠️注意选择器用 ~ 这个“结合符”隔开。

3 伪类

3.1 为什么需要“伪类”?

首先再次复习:《② HTML 元素、属性详解》中关于“超链接 a 元素”的相关知识点。

“链接”在实际页面中出现的频率很高,人们想对“未访问的页面”和“已访问的页面”作样式上的区分,直观的方式就是在 HTML 文档里边对 a 元素作 class 属性的添加,让这个 a 元素加入一个类:

<a href="http://…" class="visited">这里是链接</a>
复制代码

然后通过“类选择器”对其加样式:

a.visited {color=red;
}
复制代码

但,显而易见,这种方式根本就不合乎实际操作,因为不可能每访问一个新页面就去修改一下链接的“类”。

于是,CSS 定义了两个只用于“超链接”的“静态伪类”,这些“伪类”不用在 HTML 文档中输入,可以直接对其添加样式。分别为:

  • 指示这个“超链接”(即 a 元素里有一个 href 属性)未被访问。
:link
复制代码

⚠️注意书写格式上的“冒号”,这个冒号 : 是“伪类”和“伪元素”的名片。且冒号与状态 link 之间不能有空格。

  • 指示这个“超链接”已被访问。
:visited
复制代码

3.2 为什么需要“动态伪类”?

在上文中我们了解到 CSS 为适应需要,最先定义了两个“静态伪类”,但 :link:visited 对文档样式的改变很有限,一般第一次显示过后就不会再起作用了。
而人们的需要则更多:链接“焦点 focus ”时、在链接上“悬停 hover ”时、“活动 active ”状态时,都需要样式的区分。

于是,CSS 又定义了3个“动态伪类”,它们可以根据用户行为相应的改变文档的外观。这些“伪类”或者说所有“伪类”都不用在 HTML 文档中输入,可以直接对其添加样式。分别为:

  • 指示这个元素拥有输入“焦点”——即可以接受键盘输入,或通过某种方式可以激活。
:focus
复制代码
  • 指示当鼠标停留在这个元素上时,外观可以作相应改变。
:hover
复制代码
  • 指示这个元素可以被用户输入“激活”,如,用户停留在一个超链接上,当点击鼠标时,这个链接就会“激活”。
:active
复制代码

⚠️注意:

  • CSS “伪类”不仅可以改变不同状态时的颜色,还可以应用任何需要的样式;
  • “动态伪类”与“静态伪类”不同,“动态伪类”可以应用于任何元素,不局限于“超链接”;
  • 考虑到“继承、层叠”的原因(下一篇会详谈),“伪类”的顺序很重要,通常为:
:link
:visited
:focus
:hover
:active
复制代码

4 伪类选择器

4.1 “静态、动态伪类选择器”合用实例

首先再次复习:《③ HTML 表单详解》,掌握表单元素。然后动手操作以下例子。

?源码和效果展示
→ (根据以下 HTML 文档:)

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>HTML表单</title>
</head>
<body><a href="https://zhuanlan.zhihu.com/Oli-Zhao" title="Oli的前端一万小时">我的博客地址</a>
<div class="login">                                                    <form action="/getinfo" method="get">                                             <div class="username">                                                        <label for="username">姓名</label>                                          <input id="username"  type="text" name="username" value="Oliver">          </div><div class="password"><label for="password" >密码</label><input id="password" type="password" name="password" placeholder="输入密码"> </div><div class="sex"><label>性别</label>                                                         <input type="radio" name="sex" value="男" checked>男                        <input type="radio" name="sex" value="女">女</div>       </form>
</div>
</body>
</html>
复制代码

→(再将 CSS 样式引入其中:)

a:link {color: blue;
}a:visited {color: red;
}input:focus {background: yellow;font-weight: bold;
}a:hover {font-size: 30px;
}a:active {color: silver;
}
复制代码

⚠️注意:下一篇文章会详细阐述“链接”在随用户操作状态变化时,其样式是按怎样的顺序显示的。

4.2 用户界面元素伪类选择器(UI 元素伪类选择器)

  • 在“表单”元素中,radio 和 checkbox 都具有“选中”和“未选中”状态,以下选择器可以定义这两种状态的样式。
:checked
复制代码
  • 当我们用鼠标左键按住进行网页取词时,浏览器在默认情况下是“蓝底黑字”,如果我想要改变这个样式,我可以用以下选择器。
::selection
复制代码
  • 默认情况下,web 表单元素皆“可用”,但其元素(文字输入框、密码框、单选框、复选框等)也可以有“不可用”的状态。那么下边的选择器可以分别对表单元素的这两种状态设置样式。
:enabled
:disabled
复制代码
  • 默认情况下,web 表单元素皆“可读写”,但其元素(输入框、文本域等)也可以有“只读”的状态。那么下边的选择器可以分别对表单元素的这两种状态设置样式。
:read-write
:read-only
复制代码

⚠️注意选择器的格式!

代码实例:
?源码及效果展示

→ (根据以下 HTML 文档:)

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>HTML表单</title>
</head>
<body><a href="https://zhuanlan.zhihu.com/Oli-Zhao" title="Oli的前端一万小时">我的博客地址</a>
<div class="login"><form action="/getinfo" method="get"><div class="username"><label for="username">姓名</label><input id="username"  type="text" name="username" value="Oliver"></div><div class="password"><label for="password" >密码</label><input id="password" type="password" name="password" placeholder="输入密码"></div><div class="sex"><label>性别</label><input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女</div><div><label for="enabled">可用:</label><input type="text" name="enabled"></div><div><label for="disabled">不可用:</label><input type="text" name="disabled"   disabled="disabled"></div><div><label for="enabled">读写:</label><input type="text" name="status"></div><div><label for="disabled">只读:</label><input type="text" name="status"   readonly="readonly"></div></form>
</div><p>Oli努力做个“伟大的程序员”,他是个好人!</p>
</body>
</html>
复制代码

→(再将 CSS 样式引入其中:)

a:link {color: blue;
}a:visited {color: red;
}input:focus {background: yellow;font-weight: bold;
}a:hover {font-size: 30px;
}a:active {color: silver;
}:checked {font-size: 50px;
}p::selection {background-color: orange;color: white;
}input:enabled {outline: 1px dotted black;
}input:disabled {background-color: green;
}input:read-write {outline: 1px dotted black;
}input:read-only {background-color: gray;
}
复制代码

4.3 结构伪类选择器

⚠️此大类选择器需要用实例讲解,篇幅较长,将后续另起一篇文章讲解。此篇仅作相关知识点列举。
(下文中 E 指 element 元素)

4.3.1 第一类

1. 选择父元素的第一个子元素。
E:first-child2. 选择父元素的最后一个子元素。
E:last-child3. 选择父元素下第 n 个元素或奇偶元素,n 的值为:数字/odd/even。
E:nth-child(n)4. 选择父元素中唯一的子元素————该父元素只有一个子元素。
E:only-child
复制代码

4.3.2 第二类

1. 选择同类型的第一个同级兄弟元素。
E:first-of-type2. 选择同类型的最后一个同级兄弟元素。
E:last-of-type3. 选择同类型的第 n 个同级兄弟元素,n 的值为:数字/odd/even。
E:nth-of-type(n)4. 选择父元素中特定类型的唯一子元素————该父元素有多个子元素。
E:only-of-type
复制代码

4.3.3 第三类

1. 文档的“根元素”--html 元素。
:root2. 选择某个元素之外的所有元素。
E:not(selector)3. 选择一个不包含任何子元素的元素,需要注意的是“文本节点”也可以被看成子元素。
E:empty4. 选取页面中的某个 target 元素。
E:target
复制代码

后记: 终于完成了这篇,知识点很多,如果只是单纯看一遍收获会很小,代码的学习需要我们动起手来,不停的敲、不停的试。跟机器打交道的好处就是,它一般来说不会骗你,对就是对,错就是错。总之,感谢这个时代!

加油!

转载于:https://juejin.im/post/5cb1cdcb6fb9a068973ecf15

css_02 | CSS——CSS 选择器详解相关推荐

  1. CSS 类选择器详解——CSS 多类选择器

    类选择器允许以一种独立于文档元素的方式来指定样式. CSS 类选择器 类选择器允许以一种独立于文档元素的方式来指定样式. 该选择器可以单独使用,也可以与其他元素结合使用. 提示:只有适当地标记文档后, ...

  2. html怎么在页面中获取操作用户的id,CSS ID 选择器详解

    类选择器还是 ID 选择器? 在类选择器这一章中我们曾讲解过,可以为任意多个元素指定类.前一章中类名 important 被应用到 p 和 h1 元素,而且它还可以应用到更多元素. 区别 1:只能在文 ...

  3. css2和css1,CSS1,CSS2选择器详解

    第一.CSS选择器: 1.元素选择器(也叫标签选择器,是最基本的选择器) html{background-color: red;} div{background-color: yellow;} 2.I ...

  4. HTML使用CSS的方法详解

    HTML使用CSS的方法详解 在尝试学习 CSS 之前,您应该了解 HTML 的基础知识,或者同时学习 HTML 和 CSS. html是超文本编辑语言,是用来定义页面结构的,html有很多图文或者视 ...

  5. [转]CSS hack大全详解

    转自:CSS hack大全&详解 1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的, ...

  6. CSS属性vertical-align详解(CSS之五)

    CSS属性vertical-align详解 作用对象 vertical-align的意思是在垂直方向进行对齐.它主要对以下属性的元素有效 inline元素.inline-block元素和普通的文本. ...

  7. CSS vw vh详解

    CSS vw vh详解 简介 适配原理 简介 vw vh是一种相对单位 相对视口的宽度计算结果 vw viewport width 1vw=1/100视口宽度 vh viewport height 1 ...

  8. css background-attachment属性详解

    css background-attachment属性详解 background-attachment属性用途 background-attachment属性用于设置背景图片定位的参照方式 backg ...

  9. html右侧浮动菜单,HTML+CSS:css元素浮动详解,使用浮动制作导航栏菜单

    原标题:HTML+CSS:css元素浮动详解,使用浮动制作导航栏菜单 今天这篇文章我们来说一下css的浮动属性(float),给块状元素添加float属性可以使其转变为行内元素,也就是我们所说标签对象 ...

  10. CSS盒子模型详解(清除无序列表的项目符号)

    CSS盒子模型详解(清除无序列表的项目符号) 网页的布局过程 准备好相关的网页元素(盒子) 利用CSS设置好盒子的样式以及在网页中的摆放位置 往盒子里面装东西 盒子模型(box model) 网页中, ...

最新文章

  1. html5 实现手机摇一摇功能(C)
  2. 介绍一个好用的工具类库commons-beanutils
  3. python伪造浏览器请求头_Python3 伪装浏览器的方法示例
  4. 数值范围_如何理解PLC对数值运算的定义与处理方式?
  5. LeetCode 970. 强整数
  6. 同一个电脑可安装多个python版本吗_Linux下如何安装多个Python版本
  7. 摘抄一篇:图的存储结构
  8. 4_2 刽子手游戏(UVa489)自顶向下逐步求精法
  9. 51Nod1344走格子
  10. github webhook php,github 利用webhook配置代码自动发布
  11. java jaas_JAAS 参考指南
  12. yate怎样调出彩色的log日志实时调试信息
  13. 数据结构 严蔚敏 迷宫求解 代码
  14. ug编程内公差和外公差是什么_ug编程内外公差是什么
  15. KEIL、uVision、RealView、MDK、KEIL C51区别
  16. CSS样式书写的三种方式
  17. C语言九条语句经典例题,一起温故而知新!!!
  18. Win 32API速查
  19. charles 过期了怎么办
  20. sublimeText3配置_首选项-设置-用户

热门文章

  1. linux中级之防火墙的数据传输过程
  2. Linux文本编辑器-vi/vim
  3. 面试题·HashMap和Hashtable的区别(转载再整理)
  4. 【转】Servlet与web.xml的配置
  5. ctrl+d与ctrl+c
  6. redis报错MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist
  7. ubuntu下手动安装php-amqp模块教程
  8. 使用DbFunctions来解决EF按照日期分组数据
  9. 躲开Xilinx官网龟速的下载器
  10. R语言在大气污染数据分析中的应用-时间序列分析(一)