Go to comments

HTML+CSS宝典 CSS基础 选择器

习惯用chrome调试工具,调试一些内容的时候,没有必要在代码里面去更改,直接用chrome的调试工具,可以非常方便的做出更改,

比如支付宝页面的 账户余额 本来是0,可以随便改成很多

pic1619919733436725.png


css无非就是两部分,一个是声明块一个是选择器,上节课学的是一些常见的样式声明,这节课学习选择器有哪些写法,

选择器的作用是,可以帮助我们精准的选中想要的元素。


一、选择器

1、ID选择器

2、元素选择器

3、类选择器

之前学习的ID选择器、元素选择器、类选择器,这几个选择器都属于简单选择器(css里面没有复杂选择器的说发,这三种就叫简单选择器),除了这三种之外,css里面还提供了大量的选择器,帮助我们去选中元素。


4、通配符选择器

 *  表示选中所有元素

html页面里面有三个元素(div、p、h1),文件链接了外部样式表 test.css 文件

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="test.css">
<title>通配符选择器</title>
</head>
<body>

  <div>Lorem.</div>
  <p>Lorem.</p>
  <h1>Lorem.</h1>

</body>
</html>


外部样式表test.css文件,写 * 星号会选中所有的元素,div、p、h1这些元素全部被选中,所有的文字都变成了红色

*{
  color: red;
}

检查工具(F12),左边点击一下body元素,然后看右边

1. 右边区域表示的是body元素目前应用的样式,其中应用了 color: red 样式

2. 并且提示样式来自于 test.css文件(红色圈),点击(红色圈)可以进去看到 test.css 文件里面的代码

image.png

3. 还可以选中head元素,head元素也被选中了也应用到这个样式 color: red 

    尽管选中head元素没什么用,因为head元素不在页面上显示

4. h1元素、div元素、p元素都应用到了 color: red  样式,通配符选择器非常的简单


5、属性选择器

根据属性名和属性值 选中元素


[href]

这样写的意思是选中所有具有href属性的元素,三个a元素都有head属性,都被选中了变成了红颜色

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>属性选择器</title>
<style>
  [href]{
    color:red;
  }
</style>
</head>
<body>

  <div>Lorem.</div>
  <p>Lorem.</p>
  <h1>Lorem.</h1>

  <a href="https://baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>


[href="https://sina.com"]

有时候我们希望不仅要选中属性名,还要选中属性值等于某一个值,

属性值最好用双引号引起来,因为这  href="https://sina.com"  里面的 : 冒号、双斜杆 // 是特殊字符,有时候识别不了最好用双引号引起来

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用属性选择器精准的选择元素</title>
<style>
  [href="https://sina.com"]{
    background-color:red;
    color:#fff;
  }

  [href="https://baidu.com"]{
    background-color:#008c8c;
    color:#fff;
  }
</style>
</head>
<body>

  <a href="https://baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>


用属性选择器精准的选择元素,有很多用法,可以搜一下官方文档,百度搜索(属性选择器 mdn)

https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Building_blocks/Selectors/Attribute_selectors


[attr~=value]

 [class~=b]  选中行间class属性值里面带有字母b的元素(就是包含有b的),要求"a b c d"四个字母之间有空格分开

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>[attr~=value]</title>
<style>
  [class~=b]{
    background-color: red;
    color: #fff;
  }
</style>
</head>
<body>

  <a class="a b c d" href="https://baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>

"abcd"没有空格分开,用上面的方法就不行了,要用下面这种写法


[attr*=value]

 [class*="b"]  匹配带有一个名为b的属性的元素,属性值的字符串中的任何地方,至少出现了一次b子字符,只要包含字母b就行

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>[attr*=value]</title>
<style>
  [class*="b"]{
    background-color:red;
    color:#fff;
  }
</style>
</head>
<body>

  <a class="abcd" href="https://baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>


[attr$=value]

匹配带有一个名为 attr 的属性的元素,其值结尾为value的字符串

比如今后可能改变超链接,总之要链接到 baidu.com,属性值有可能是 https://www.baidu.com,有可能省略的写域名(当前网站协议一样可以省略域名),所以用精确匹配不一定能选中!

 [href$="baidu.com"]  可以用这种方式,$ 在计算机里往往表示结束,这里指的是选中以"baidu.com"结束的元素

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>属性选择器 [attr$=value]</title>
<style>
  [href$="baidu.com"]{
    background-color: red;
    color: #fff;
  }
</style>
</head>
<body>

  <a href="//baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>


属性选择器平时用的不是很多,表单元素里面有可能会用到属性选择器,下面的伪类选择器就用的很多很多了,用的超级多。


6、伪类选择器

伪类选择器,一般是选中某些元素的某种状态,下面是平时用的最多的伪类选择器


:hover

鼠标悬停的状态,表示鼠标移动上去的状态(鼠标移动到谁上去呢?是不是还要在加一个选择器?

:hover 如果前面不加选择器,那就是选中所有元素,所有元素鼠标移动到上面字体都变成红色

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  :hover{
    color: red;
  }
</style>
<title>伪类选择器 :hover</title>
</head>
<body>

  <div>Lorem.</div>
  <p>Lorem.</p>
  <h1>Lorem.</h1>

  <a href="//baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>

鼠标移动到div、p、h1元素上面的时候字体变成红色,移动到a元素上面字体也变成了红色。

为什么鼠标移开了div、p、h1元素字体还是红色呢?

因为鼠标移动到body元素里面,body元素也应用到了伪类样式


image.png


选中body元素看一下,右边为什么没有看到伪类样式呢?

1. 伪类样式要这么看,选中一个元素(比如选中body元素)点击 :hov 选中这个元素的状态

image.png

2. 选中:hover,把hover这个状态打开

image.png

3. body元素现在是鼠标悬停的状态,选中body元素就看到应用到:hover这个选择器了

image.png


上面这样设置 :hover 他的选择的面太广了,所有的元素都会被应用到这个hover,

所以我们通常用 hover 设置 a 元素 或 菜单类的东西,于是在:hover选择器前面在配合一个东西(a:hover)


 a:hover{color: red;}  意思是选中的是鼠标悬停时的a元素,鼠标移动到a元素上时变成红颜色了,鼠标移开这个状态就消失了

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  a:hover{
    color:red;
  }
</style>
<title>选中鼠标悬停时的a元素</title>
</head>
<body>

  <div>Lorem.</div>
  <p>Lorem.</p>
  <h1>Lorem.</h1>

  <a href="//baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>

鼠标移开状态消失了,如果调试的时候怎么调试呢?

希望a元素新浪一直处于鼠标悬停的状态

1. 右键检查(F12)

2. 左边选中元素(新浪),右边点击:hov,把下面的:hover前面的钩打上,a元素新浪就一直处于悬停的状态了,浏览器强行变成鼠标移入的状态,方便我们查看样式

image.png


:active

表示激活状态,鼠标按下的状态

 a:active  点击鼠标按下去时候的a元素变成红色(写伪类选择器都是加一个冒号)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  a:active{
    color:#008c8c;
  }
</style>
<title>active</title>
</head>
<body>

  <a href="//baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>


:link

表示超链接未访问过的状态


:visited

表示超链接访问过后的状态


visited跟link是对立的

link 是未访问过的状态

visited 访问过后的状态

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  a:link{
    color: chocolate;
  }
  a:visited{
    color:rgb(133, 133, 0);
  }
</style>
<title>伪类选择器</title>
</head>
<body>

  <a href="https://baidu.com">百度</a>
  <a href="https://sina.com">新浪</a>
  <a href="https://douyu.com">斗鱼</a>

</body>
</html>


这四个伪类非常简单,注意一下顺序

可以省略写,省略写顺序就无所谓,如果这四个伪都要写,按照下面这个顺序来书写

1. link

2. visited

3. hover

4. active


如果不按照这个顺序,四个都写是要出问题的,这个情况很多地方叫爱恨法则:

首字母l,首字母v,表示love

首字母h,首字母a,表示hate

可以按照这个爱恨法则的方法记忆顺序。


伪类选择器目前学习了四种,其实还有很多,

1. 这些伪类通常是跟a元素相关

2. 这两种link、visied只有a元素可以使用

3. 这两种hover、active别的元素也可以使用,比如 div:hover{}、h1:hover{}、p:hover{} 等都可以用的。


7、伪元素选择器

伪元素选择器通常用于,生成并选中某个元素内部的第一个子元素或最后一个子元素。

但是伪元素选择器还不只有这些,目前就学两个伪元素选择器一个是 ::before、一个是 ::after,写法前面是加两个冒号(伪类选择器前面是加一个冒号)。


下面文字中的“HTML和CSS”用span元素包起来,在显示的时候前、后加上书名号 

<p>
  袁老师和成老师的<span>HTML和CSS</span>课程真不错呀!
</p>


怎么用CSS来加书名号?

 span::before{ }  

1. 用css样式给span加了一个子元素,并且同时选中这个子元素,然后加了个内容为书名号

2. before是伪元素选择器,意思是先在span元素里面生成一个子元素(这个子元素没有名字),并且这个子元素,一定是第一个子元素

3. content 是一个特殊的属性,只有在 before 还有 after 这两个伪元素选择器里面才能使用,content表示这个生成元素的内容,这里要写文本内容,第一个元素为左边的书名号(《)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  span::before{
    content:"《";
    color:red;
  }
</style>
<title>伪元素选择器</title>
</head>
<body>

  <p>袁老师和成老师的<span>HTML和CSS</span>课程真不错呀!</p>

</body>
</html>

打开检查(f12)看一下,左边span元素里面多一个 ::before,可以认为它就是一个元素(伪元素)

image.png

右边 span::before 是伪元素的样式,选中的是左边的 ::before 给它设置样式,甚至还可以给书名号设置一些样式 color: red 字体为红色。


问一个问题,

span元素里面的这段文字“HTML和CSS”会不会变成红色?

不会因为 span::before{} 选中的是 ::before 这个生成的子元素,span元素没有应用到这个样式。


同样道理写一个 span::after{ }

after 刚好相反,生成最后一个子元素,然后加写内容(》)写样式(文字颜色红色)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  span::before{
    content:"《";
    color:red;
  }
  span::after{
    content:"》";
    color:red;
  }
</style>
<title>伪元素选择器</title>
</head>
<body>

  <p>袁老师和成老师的<span>HTML和CSS</span>课程真不错呀!</p>

</body>
</html>

通过css伪元素选择器,生成一对书名号以及样式,今后还会学习更多的伪元素选择器


二、选择器的组合


选择器的组合用处非常非常的广,组合就是多个选择器组合在一起使用

1.  span::after  伪元素选择器就已经在组合了,span 是一个元素选择器,::after 是一个伪元素选择器,

    两个选择器组合起来达到一个并且的效果,选中的是span元素 并且 选中的是span里面的最后一个子元素(并且生成的最后一个子元素)

2.  a:hover  选中的的a元素 并且 选中的是a元素鼠标悬浮的状态


1、并且

两个或多个选择器,不加任何东西,直接写到一起就是并且。


vscode快捷键

 p.red + tab键    生成一个 class="red" 的类样式

 p.red.big.center + tab键   如果有多个类样式依次写


下面有两段文字有一些共同的样式,比如首行缩进两个字符 text-indent: 2em 、行高为 line-height: 2,两个段落每个段落文字的行高是字体的两倍,并且每个p运算都有缩进2个字符

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  p{
    width:800px;
    text-indent: 2em;
    line-height: 2;
  }
</style>
<title>并且</title>
</head>
<body>

<p>
  Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem vero nam adipisci placeat ut magni, delectus molestiae tempore alias accusamus, exercitationem dolor quisquam architecto odio similique natus quo ad hic.
</p>

<p class="red">
  Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam laudantium odio voluptas error explicabo expedita iusto iure ab? Quis praesentium eveniet sint nostrum cupiditate quisquam aut earum inventore quaerat ad?
</p>

</body>
</html>


但是其中有个p元素比较特殊,有个类样式.red,

可以直接写 .red 来选中,这里用另外一种方式 p.red {} 组合的方式也可以,表示选中的是它必须是 p 元素并且还要带有类样式 .red

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  p{
    width:800px;
    text-indent: 2em;
    line-height: 2;
  }
  p.red{ // 必须是p元素,并且还要带有类样式.red
    color:red;
  }
</style>
<title>并且</title>
</head>
<body>

<p>
  Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem vero nam adipisci placeat ut magni, delectus molestiae tempore alias accusamus, exercitationem dolor quisquam architecto odio similique natus quo ad hic.
</p>

<p class="red">
  Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam laudantium odio voluptas error explicabo expedita iusto iure ab? Quis praesentium eveniet sint nostrum cupiditate quisquam aut earum inventore quaerat ad?
</p>

</body>
</html>

 p.red {} 中间不要加空格,两个选择器连着写就行了


包括之前属性选择器 [href$="baidu.com"] 其实前面可以写一个a

1. 前面是一个元素选择器a

2. 后面跟着是一个属性选择器 [href$="baidu.com"] 并列起来

3. 表示选中的是一个a元素,并且a元素的属性等于这个值 baidu.com 

a[href$="baidu.com"]{

}


2、后代元素

后代元素是指的是两个选择器之间加空格。


vs快捷键:ul>li*5>lorem1


比如下面,

第二个 div.red 元素里面有一些ul、li元素,现在要把 .red元素里面的 li元素里面文字的颜色变成马尔斯绿,

 .red li{}  的意思是选中的是.red元素的后代元素li(后代元素是子孙元素)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  .red li{
    color:#008c8c;
  }
</style>
<title>后代元素选择器</title>
</head>
<body>

  <div>
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem vero nam adipisci placeat ut magni, delectus molestiae tempore alias accusamus, exercitationem dolor quisquam architecto odio similique natus quo ad hic.
  </div>

  <div class="red">
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam laudantium odio voluptas error explicabo expedita iusto iure ab? Quis praesentium eveniet sint nostrum cupiditate quisquam aut earum inventore quaerat ad?      
    <ul>
      <li>Lorem.</li>
      <li>Fugiat.</li>
      <li>Velit.</li>
      <li>Voluptas.</li>
      <li>Sapiente!</li>
    </ul>
  </div>

  <ul>
    <li>Lorem.</li>
    <li>Fugiat.</li>
    <li>Velit.</li>
    <li>Voluptas.</li>
    <li>Sapiente!</li>
  </ul>

</body>
</html>


注意,

上面的div元素开始是p元素,p元素里面是不能放列表ul的,所以改成div元素


后代元素选择器用的非常多

下面有两个 .bcd 元素, .abc .bcd{ }  的意思是用精准的选中方式选中 .abc 下面的 .bcd 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  .abc .bcd{
    color: red;
  }
</style>
<title>后代元素选择器</title>
</head>
<body>

  <div class="abc">
    <p>Lorem.</p>
    <p class="bcd">Tempora.</p>
    <p>Enim.</p>
  </div>

  <p class="bcd">Lorem.</p>

</body>
</html>


空格前面、后面什么选择器都可以写,还可以这样这样  .abc *  表示选中.abc元素后代中所有的元素


3、子元素

子元素的选择组合用大于号 >,只能选中子元素,不能选中子元素的子元素,只不过子元素选择器用的没有后代选择器那么多,后代选择器太常见了。


看例子,选中li元素

选中li元素的方式太多了

 div li { color:Red }   可以选中,li是后代元素

 div>li { color:Red }   不能选中,div的子元素里面没有li

 div>ul  li { color:Red }   可以选中

 div>ul>li { color:Red }   可以选中

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style></style>
<title>子元素选择器</title>
</head>
<body>

<div>
  <ul>
    <li>Lorem.</li>
    <li>Tempore!</li>
    <li>Ex!</li>
  </ul>
</div>

<!-- vscode快捷键:div>ul>li*3>lorem1 -->

</body>
</html>


4、相邻兄弟元素

 .special  表示选中的元素中的文字变成红色, .special+li  表示选中相邻的下一个兄弟元素是马尔斯绿色

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  .special{
    color:red;
  }
  .special+li{
    color:#008c8c;
  }
</style>
<title>相邻兄弟元素</title>
</head>
<body>

  <div>
    <ul>
      <li>Lorem.</li>
      <li>Obcaecati.</li>
      <li>Itaque!</li>
      <li class="special">Est.</li>
      <li>Culpa.</li><!-- 选中变绿色了 -->
      <li>Distinctio!</li>
      <li>Itaque.</li>
      <li>Facilis?</li>
      <li>Itaque.</li>
      <li>Nemo!</li>
    </ul>
  </div>

</body>
</html>


如果有两组ul列表,前面 .special 选中的是多个,两个ul列表里面的下一个li元素文字都变成马尔斯绿

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  .special{
   color:red;
  }
  .special+li{
    color:#008c8c;
  }
</style>
<title>相邻兄弟元素</title>
</head>
<body>

  <div>
    <ul>
      <li>Lorem.</li>
      <li>Obcaecati.</li>
      <li>Itaque!</li>
      <li class="special">Est.</li>
      <li>Culpa.</li>
      <li>Distinctio!</li>
      <li>Itaque.</li>
      <li>Facilis?</li>
      <li>Itaque.</li>
      <li>Nemo!</li>
    </ul>
    <ul>
      <li>Lorem.</li>
      <li>Obcaecati.</li>
      <li>Itaque!</li>
      <li class="special">Est.</li>
      <li>Culpa.</li>
      <li>Distinctio!</li>
      <li>Itaque.</li>
      <li>Facilis?</li>
      <li>Itaque.</li>
      <li>Nemo!</li>
    </ul>
  </div>

</body>
</html>


5、兄弟元素

 .special~li  表示 .special 后边出现的所有兄弟元素,只能选择 .special 之后的,css没有提供选择之前的方法,跟css渲染页面的方式有关

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  .special{
   color:red;
  }
  .special~li{
    color:#008c8c;
  }
</style>
<title>兄弟元素</title>
</head>
<body>

  <div>
    <ul>
      <li>Lorem.</li>
      <li>Obcaecati.</li>
      <li>Itaque!</li>
      <li class="special">Est.</li>
      <li>Culpa.</li>
      <li>Distinctio!</li>
      <li>Itaque.</li>
      <li>Facilis?</li>
      <li>Itaque.</li>
      <li>Nemo!</li>
    </ul>
    <ul>
      <li>Lorem.</li>
      <li>Obcaecati.</li>
      <li>Itaque!</li>
      <li class="special">Est.</li>
      <li>Culpa.</li>
      <li>Distinctio!</li>
      <li>Itaque.</li>
      <li>Facilis?</li>
      <li>Itaque.</li>
      <li>Nemo!</li>
    </ul>
  </div>

</body>
</html>


三、选择器的并列

并列的意思是,多个选择器用逗号分隔(它只是一个语法糖)。

语法糖的意思是,某些语法不会改变它的本质,只是方便我们书写代码,方便我们记忆,起到减轻我们书写代码负担的作用


选择器也是这样,比如把 .special 元素后面的所有的li元素都变成马尔斯绿,还要把三个p元素也变成马尔斯绿

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  .special{
   color:red;
  }
  .special~li{
    color:#008c8c;
  }
  p{
    color:#008c8c;
  }
</style>
<title>选择器的并列</title>
</head>
<body>

<div>
  <ul>
    <li>Lorem.</li>
    <li>Obcaecati.</li>
    <li>Itaque!</li>
    <li class="special">Est.</li>
    <li>Culpa.</li>
    <li>Distinctio!</li>
    <li>Itaque.</li>
    <li>Facilis?</li>
    <li>Itaque.</li>
    <li>Nemo!</li>
  </ul>
  <ul>
    <li>Lorem.</li>
    <li>Obcaecati.</li>
    <li>Itaque!</li>
    <li class="special">Est.</li>
    <li>Culpa.</li>
    <li>Distinctio!</li>
    <li>Itaque.</li>
    <li>Facilis?</li>
    <li>Itaque.</li>
    <li>Nemo!</li>
  </ul>
</div>

<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Nemo voluptas aspernatur eligendi nihil, veniam nesciunt consequuntur architecto voluptates doloribus in pariatur quo quia. Obcaecati tempora hic vero quidem, repellat doloribus?</p>
<p>Nesciunt quisquam placeat enim eum eligendi porro architecto quasi. Eaque possimus eos iste error assumenda autem nihil deserunt culpa illo nobis. Placeat tempora reiciendis provident optio cumque, earum laborum voluptatibus.</p>
<p>Dicta maxime animi veritatis obcaecati reprehenderit quis eveniet suscipit inventore pariatur recusandae eos iusto id ad quia vero sapiente expedita, facere doloribus ducimus rerum fuga perferendis atque sed rem. Qui.</p>

</body>
</html>


上面这样写没有问题,但是有重复代码 .special~li 和 p 两块代码重复了


我们可以下面这样写  .special~li, p 

.special{
  color:red;
}
.special~li, p{
  color:#008c8c;
}

 

 .special~li, p  就是一个语法糖,方便我们书写代码的。


.special~li 和 p 其实是两个选择器,前面的  .special~li  是一个选择器,后面 p 也是一个选择器,

我们可以统一的设置,但本质上并没有发生变化,运行的时候仍然是看做分开书写的,只是写代码的时候可以方便一点,用语法糖的方式来写了。



Leave a comment 0 Comments.

Leave a Reply

换一张