博客列表 >HTML基础之CSS选择器

HTML基础之CSS选择器

鼠莱鼠去
鼠莱鼠去原创
2020年04月08日 12:20:28632浏览

选择器

1. 简单选择器

1.1 种类

序号 选择器 描述 举例
1 元素选择器 根据元素标签名称进行匹配 div {...}
2 群组选择器 同时选择多个不同类型的元素 h1,h2,h3{...}
3 通配选择器 选择全部元素,不区分类型 * {...}
4 属性选择器 根据元素属性进行匹配 *[...]
5 类选择器 根据元素 class 属性进行匹配 *.active {...}
6 id 选择器 根据元素 id 属性进行匹配 *#top {...}
  • 元素是使用标签和属性进行描述,所以使用标签和属性来选择元素非常自然和直观
  • 以上 6 种,其实可分为二类: 元素选择器和属性选择器, 其它的只是二者的特例罢了
  • 最常用的是: 元素选择器, 类选择器, id 选择器
  • 当 class,id 选择器不限定被修改的元素类型时, 星号”*“可以省略

2. 上下文选择器

  • html 文档,看上去就像一颗倒置的”树”,所以是有层级结构的
  • 每一个元素, 在文档中, 都有自己的位置,即上下文关系
  • 所以, 完全可以根据元素的上下文关系,来获取到它们

2.1 一个元素的四种角色

序号 角色 描述
1 祖先元素 拥有子元素,孙元素等所有层级的后代元素
2 父级元素 仅拥有子元素层级的元素
3 后代元素 与其它层级元素一起拥有共同祖先元素
4 子元素 与其它同级元素一起拥有共同父级元素

2.2 四种上下文选择器

序号 选择器 操作符 描述 举例
1 后代选择器 空格 选择当前元素的所有后代元素 div p, body *
2 父子选择器 > 选择当前元素的所有子元素 div > h2
3 同级相邻选择器 + 选择拥有共同父级且相邻的元素 li.red + li
4 同级所有选择器 ~ 选择拥有共同父级的后续所有元素 li.red ~ li

3. 伪类选择器

  • 学习之前,先分析上下文选择器的局限性,例如选择同一个父级下的第二个子元素,就没那么简单
  • 而伪类就正好弥补了上下文选择器的短板, 所以伪类,大多数是基于文档中元素结构的
  • : 本意是假的,不存在的意思, 这里是特指, 不需要在元素上添加额外的属性来获取元素
  • : 暗指伪类的级别, 仍然是属于”class”级别, 仍然属于属性选择器范畴,级别高于元素选择器

我们重点放在伪类最重要的应用场景:

场景 描述
结构伪类 根据子元素的位置特征进行选择
表单伪类 根据表单控件状态特征进行选择

3.1 结构伪类

3.1.1 不分组匹配

序号 选择器 描述 举例
1 :first-child 匹配第一个子元素 div :first-child
2 :last-child 匹配最后一个子元素 div :last-child
3 :only-child 选择元素的唯一子元素 div :only-child
4 :nth-child(n) 匹配任意位置的子元素 div :nth-child(n)
5 :nth-last-child(n) 匹配倒数任意位置的子元素 div :nth-last-child(n)

3.1.2 分组匹配

序号 选择器 描述 举例
1 :first-of-type 匹配按类型分组后的第一个子元素 div :first-of-type
2 :last-of-type 匹配按类型分组后的最后一个子元素 div :last-of-type
3 :only-of-type 匹配按类型分组后的唯一子元素 div :only-of-type
4 :nth-of-type() 匹配按类型分组后的任意位置的子元素 div :nth-of-type(n)
5 :nth-last-of-type() 匹配按类型分组后倒数任意位置的子元素 div :nth-last-of-type(n)
  • 允许使用表达式来匹配一组元素,表达式中的”n”是从”0”开始计数,且必须写到前面
  • “-n”表示获取前面一组元素,正数表示从指定位置获取余下元素

3.3 其它伪类

序号 选择器 描述
1 :active 向被激活的元素添加样式
2 :focus 向拥有键盘输入焦点的元素添加样式
3 :hover 当鼠标悬浮在元素上方时,向元素添加样式
4 :link 向未被访问的链接添加样式
5 :visited 向已被访问的链接添加样式
5 :root 根元素,通常是html
5 :empty 选择没有任何子元素的元素(含文本节点)
5 :not() 排除与选择器参数匹配的元素

4 示例代码

4.1 HTML代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>CSS选择器测试DEMO</title>
  7. <!-- 加载外部样式表 -->
  8. <link rel="stylesheet" type="text/css" href="css/custom.css">
  9. </head>
  10. <body>
  11. <header>
  12. <!-- 页面头部,简单选择器 -->
  13. <div class="navbar">
  14. <div class="nav-log"><img src="img/log.png" /></div>
  15. <!-- id, class可以添加到任何元素上, 前面的元素限定符默认就是*,所以可省略 -->
  16. <nav id="main-menu" class="nav-bar">
  17. <ul>
  18. <li title="home">Home</li>
  19. <li class="menu-about">About</li>
  20. <li>Blog</li>
  21. <li title="news">News</li>
  22. <li title="cont">Contact</li>
  23. </ul>
  24. </nav>
  25. </div>
  26. </header>
  27. <body>
  28. <div class="clearfix"></div>
  29. <!-- 上下文选择器 -->
  30. <div class="container">
  31. <div class="item-lists">
  32. <div class="item">1</div>
  33. <div class="item">2</div>
  34. <div class="item item-3">3</div>
  35. <div class="item item-4">4</div>
  36. <div class="item">5</div>
  37. <div class="item">6</div>
  38. <div class="item">7</div>
  39. <div class="item">8</div>
  40. <div class="item">9</div>
  41. </div>
  42. <!-- 结构伪类:不分组匹配 一 -->
  43. <div class="item-lists list-2">
  44. <div class="item">1</div>
  45. <div class="item">2</div>
  46. <div class="item">3</div>
  47. <div class="item">4</div>
  48. <div class="item">5</div>
  49. <div class="item">6</div>
  50. <div class="item">7</div>
  51. <div class="item">8</div>
  52. <div class="item">9</div>
  53. </div>
  54. <!-- 结构伪类:不分组匹配 二 -->
  55. <div class="item-lists list-3">
  56. <div class="item">1</div>
  57. <div class="item">2</div>
  58. <div class="item">3</div>
  59. <div class="item">4</div>
  60. <div class="item">5</div>
  61. <div class="item">6</div>
  62. <div class="item">7</div>
  63. <div class="item">8</div>
  64. <div class="item">9</div>
  65. </div>
  66. <!-- 结构伪类:分组匹配 -->
  67. <div class="item-lists list-4">
  68. <div class="item">1</div>
  69. <div class="item">2</div>
  70. <div class="item">3</div>
  71. <div class="item">4</div>
  72. <div class="item">5</div>
  73. <span class="item">6</span>
  74. <span class="item">7</span>
  75. <span class="item">8</span>
  76. <span class="item">9</span>
  77. </div>
  78. </div>
  79. </body>
  80. </body>
  81. </html>

4.2 style.css代码

  1. /* 通配选择器,选择全部元素,不区分类型 */
  2. * {padding: 0;margin: 0;border-radius: 0;}
  3. /* 元素选择器 */
  4. html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}
  5. body{margin:0}
  6. /*群组选择器,同时选择多个不同类型的元素,以英文,为分割*/
  7. article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}
  8. .clearfix{overflow:hidden;clear:both;}

4.3 custom.css代码

  1. /* @import 将同目录下的 style.css 引入至头部 */
  2. @import url(style.css);
  3. /* 类选择器 */
  4. .navbar{ max-width: 1200px; width: 100%; margin: 0 auto; }
  5. .navbar .nav-log{ width: 20px; float: left; margin-right: 20px; padding: 5px; }
  6. .navbar .nav-log img{ width: 20px; }
  7. /* id 选择器 id 选择器权重大于类选择器*/
  8. .navbar #main-menu{ max-width: 960px; }
  9. /* 类选择器 */
  10. .navbar .nav-bar{ max-width: 800px; width: 80%; margin: 0 auto; }
  11. /* ul li 同为元素标签选择器 */
  12. .navbar .nav-bar ul{ list-style: none; display: grid; grid-template-columns: repeat(5, 1fr); }
  13. /* 类选择器, class 权重大于元素标签 */
  14. /* 元素标签 < class属性 < id属性 */
  15. .navbar .nav-bar ul .menu-about{ background-color: lightcyan; }
  16. .navbar .nav-bar ul li{ padding: 5px; text-align: center; background-color: lightblue; }
  17. /* 属性选择器 */
  18. .navbar .nav-bar ul li[title="cont"]{ background-color: white; }
  19. /* 伪类选择器 */
  20. .navbar .nav-bar ul li:hover{ background-color: black; color: white; }
  21. /* 菜单结束 */
  22. .container .item-lists{ width: 300px; height: 300px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px; float: left;margin-right: 10px; margin-top: 30px; margin-left: 10px; }
  23. /* 后代选择器 */
  24. .container div{ border: 1px solid coral; }
  25. /* 父子选择器,只有外层的div(类名为"item-lists")受影响 */
  26. .container > div{ border: 3px solid green; }
  27. .item{ font-size: 2rem; display: flex; justify-content: center; align-items: center; }
  28. /* 同级相邻选择器 */
  29. /* 选择与第3个相邻的,即后面的"item-4"元素 */
  30. .item.item-3 + .item{ background-color: lightgreen; }
  31. /* 同级所有选择器 */
  32. /* 选择与第4个后面的,有共同父级的所有兄弟元素 */
  33. .item.item-4 ~ .item{ background-color: lightblue; }
  34. /*上下文选择器演示结束*/
  35. /* 为了防止递归,应该在具体的父元素上调用伪类 */
  36. /* :nth-child(1) === :first-child */
  37. .list-2.item-lists > :first-child{ background-color: wheat; }
  38. /* 匹配最后一个 */
  39. .list-2.item-lists > :last-child{ background-color: lightpink; }
  40. /* :nth-child(n),n: 支持表达式, n 从0开始,2n 与偶数效果相同 */
  41. .list-2.item-lists > :nth-child(2n){ background-color: magenta; }
  42. /* 匹配任何一个,示例中匹配5 */
  43. .list-2.item-lists > :nth-child(5){ background-color: lightgreen; }
  44. /* :nth-child(n)表达示,与奇数效果相同 */
  45. .list-2.item-lists > :nth-child(2n-1){ background-color: lightsalmon; }
  46. /* 只选择前三个:1,2,3 */
  47. .list-2.item-lists > :nth-child(-n + 3){ background-color: lightblue; }
  48. /* odd: 代表奇数 */
  49. .list-3.item-lists > :nth-child(odd){ background-color: lightsalmon; }
  50. /* even: 代表偶数 */
  51. .list-3.item-lists > :nth-child(even){ background-color: magenta; }
  52. /* 从第6个开始,选择剩下的所有元素 */
  53. .list-3.item-lists > :nth-child(n + 4){ background-color: lightgrey;}
  54. /* 选择倒数第2个 */
  55. .list-3.item-lists :nth-last-child(2){ background-color: lime; }
  56. /*结构伪类: 不分组匹配演示结束*/
  57. /* span分组前两个 */
  58. .list-4 span:nth-of-type(-n + 2){ background-color: grey; }
  59. /* span分组最后两个 */
  60. .list-4 span:nth-last-of-type(-n + 2){ background-color: coral; }
  61. /* 结构伪类: 分组匹配演示结束 */

4.4 效果图


课后总结

  1. CSS选择器控制HTML页面中的元素,并输出对应样式效果,从而实现HTML页面的美化。
  2. CSS选择器是CSS学习过程中重要的一部分。
  3. 了解学习常用的选择器与其使用方法,权重。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议