Go to comments

Css3 选择器

brief introduction of css3(CSS3简短的介绍)


1. upgrade version(升级的版本)

css3是css2的升级版本,语法格式都差不多,css3最重要的突破是在css2的基层上实现动画了,主要配合js的事件来操作动画效率最高,当然除了实现动画还有很多其它功能


2. css3`s compatible history(CSS3兼容性的历史)

compatible 兼容性的意思

prefix 是前缀的意思


 prefix     browser

-webkit   chrome和safari

-moz       firfox

-ms         IE

-o           opera

div{
  -webkit-border-radius:50%;
  -ms-border-radius:50%;
  -moz-border-radius:50%;
  -o-border-radius:50%;
  border-radius:50%;
}


text-fill-color 属性只有 webkit 内核浏览器能做到,前缀肯定是不能去掉的

div{
  -webkit-text-fill-color:;
}


3. 参考手册(reference manual website)

http://css.doyoe.com


reference 参考的意思

manual 手册的意思


4. 权威的网站(Authoritative inquiry website )

http://www.caniuse.com


Authoritative 权威的意思

inquiry 查找的意思


一、关系型选择器(Relationship selectors)

关系型选择器的模式,不是选择器类型是一个模式


什么是选择器的模式?

 E F      是css2的父子选择器 ( div span{} ),不叫选择器的类型,只是一个模式

 E > F  直接子元素选择器,也是一个模式,这个其实是css3的,只不过兼容性比较好


 E + F 

1. div下的第一个兄弟元素节点

2. 并且这个兄弟必须是p元素

<style>

div + p{
  background-color: orangered;
}

</style>


<div>div</div>
<p>p喵</p>
<p>p</p>
<p>p</p>


条件也可以是class

div + .demo{
  background-color: orangered;
}

div + span.demo{
  color:yellow;
}


 E ~ F 

1. div元素下的所有兄弟元素节点

2. 并且必须是p元素

<style>

  div ~ p{
    color:#fff;
    background-color: red;
  }

</style>


<div>div</div>
<span>span</span>
<p>p喵</p>
<p>p喵</p>
<p>p喵</p>
<em>
  <p>兄弟元素节点必须在同级下</p>
</em>


二、属性选择器(Attribute selectors)

E[attr ~= "val"]   css2提供的

E[attr |= "val"]    css2提供的

E[attr ^= "val"]  下面这三个是css3新增的,基本上是按照正则的规则

E[attr $= "val"]

E[attr *= "val"]


 E[attr = "val"] 

<style>

  div[data] {
    background-color: yellow;
  }

  div[data="a"] {
    color: red;
  }

</style>


<div class="demo" data="a">data="a"</div>
<div class="demo" data="b">data="b"</div>


 E[attr ~= "val"] 

1. 属性名是 data

2. 属性值只有一个a,或者a开头后面被空格隔开,或者a左右被空格隔开

<style>

  div[data~="a"] {
    background-color: yellow;
  }

</style>


<div data="a">1瞄</div>
<div data="b a c">2瞄</div>
<div data="a c">3瞄</div>
<div data="aa c">4</div>


属性名换成 class 就更加好理解了

<style>

  div[class~="a"] {
    background-color: yellow;
  }

</style>

<div class="a">1瞄</div>
<div class="b a c">2瞄</div>
<div class="a c">3瞄</div>
<div class="aa c">4</div>


 E[attr |= "val"] 

以a开头,或者a开头后面加一个杠 -

<style>
  div[class |="a"] {
    background-color: red;
  }
</style>

<div class="a">1喵</div>
<div class="a-test">2喵</div>
<div class="b-test">3</div>


下面这三个是css3新增的,基本上是按照正则的规则


 E[attr ^= "val"] 

^ 正则中的意思,以什么什么开头的, [^]  放到方括号是非的意思


以"a"开头的

<style>
  div[class ^="a"] {
    background-color: yellow;
  }
</style>

<div class="a">1瞄</div>
<div class="a-test">2瞄</div>
<div class="b-test">3</div>


以"t"结尾的 

<style>
  div[class $="t"] {
    background-color: yellow;
  }
</style>

<div class="a">1</div>
<div class="a-test">2瞄</div>
<div class="b-test">3瞄</div>


 E[attr $= "val"] 

$ 正则中的意思是以什么什么结尾


以 st 结尾的

<style>
  div[class $="st"] {
    background-color: yellow;
  }

</style>

<div class="a">1</div>
<div class="a-test">2瞄</div>
<div class="b-test">3瞄</div>


属性名写全,以 a-test 结尾的

<style>

  div[class $="a-test"] {
    background: yellow;
  }

</style>

<div class="a">1</div>
<div class="a-test">2瞄</div>
<div class="b-test">3</div>


 E[attr *= "val"] 

只要字符串里面有字母 t 就可以,不管位置在哪都无所谓。实测空格都可以

<style>
  div[class *="t"] {
    background-color: yellow;
  }
</style>

<div class="a">1</div>
<div class="a-test">2瞄</div>
<div class="b-test">3瞄</div>


三、伪元素选择符 Pseudo-Element Selectors(Pseudo 假装的意思)

E::placeholder

E::selection


这两个前面写一个冒号写两个冒号都可以

:befroe

:after

但是这两个必须写两个冒号,不能写一个冒号

::placeholder

::selection


 E::placeholder 

html5里面 input 标签有一个行间属性 placeholder,在部分移动端浏览器不是那么特别兼容,但不考虑特别多是可以用的


::placeholder 能改变 input 框的字体颜色,默认是灰色的,我们设置的是默认颜色

<style>
  /* 注意,在使用的时候,在双冒号后面写兼容的前缀。在IE、webkit浏览器兼容前缀有input */
  input::-webkit-input-placeholder {
    color: #ff8c8c;
  }
  input::-ms-input-placeholder {
    color: #ff8c8c;
  }
  input::-moz-placeholder {
    color: #ff8c8c;
  }
  input::placeholder {
    color: #ff8c8c;
  }
</style>

<input type="text" placeholder="请输入用户名">


 E::selection 

字体选中后的样式,它只能设置 1.颜色、2.背景、3.文字阴影,这三个属性(兼容性非常好)

<style>
  p:nth-of-type(1)::selection {
    color: #fff;
    background-color: #ff8c8c;
    text-shadow: 3px 5px 2px #000;
  }
  p:nth-of-type(2)::selection {
    color: #fff;
    background-color: #008c8c;
  }
  p:nth-of-type(3) {
    color: #fff;
    background-color: #008c8c;
  }
  span::selection {
    color: yellow;
    background-color: #008c8c;
  }
</style>

<p>
  文字是人类用符号记录表达信息以传之久远的方式和工具。现代文字大多是记录语言的工具。人类往往先有口头的语言后产生书面文字,很多小语种,有语言但没有文字。文字的不同体现了国家和民族的书面表达的方式和思维不同。文字使人类进入有历史记录的文明社会
</p>
<p>文字是人类用符号记录表达信息以传之久远的方式和工具。</p>
<p>文字是人类<span>老</span>用符号记录<span>邓</span>表达信息以传<span>头</span>之久远的方式和工具。</p>


四、伪类选择器 Pseudo-Classes Selectors 

伪类选择器是被选中元素的一种状态,重点是被选中的元素的一种状态


第一部分

E:not(s)

E:root E有点无厘头

E:target


第二部分

下面5种都考虑其它元素的影响,所以并不常用

E:first-child  第一个子元素

E:last-child   最后一个子元素

E:only-child   只有一个子元素的前提下才会会被选中

E:nth-child(n) 一个公式选择,按照公式批量选

E:nth-last-child(n) 与nth-child相反,导致计数


这5种不考虑其它元素的影响,所以是常用的

E:first-of-type

E:last-of-type

E:only-of-type

E:nth-of-type(n) 重点

E:nth-of-last-type(n) 取反


第三部分

E:empty  元素必须是空的

E:checked 元素被选中状态

E:enabled

E:disabled

E:read-only

E:read-write 可读可写正常的状态


1、第一部分

E:not(s)

E:root   E有点无厘头

E:target


 E:not 

:not(nots加s也可以)用法和 jQuery里的 .not() 方法如出一辙


选中前两个 demo 元素,

可以通过  div.demo  并列选择器选择,也可以通过  div[class="demo"]  属性选择器


这里用 :not 选择不是 .test 元素的,把前两个选中

<style>
  div:not(.test) {
    background-color: yellow;
  }
</style>

<div class="demo">1喵</div>
<div class="demo">2喵</div>
<div class="test">3</div>


选不是 .demo 元素的,把最后一个 div 选中

<style>
  div:not(.demo) {
    background-color: yellow;
  }
</style>

<div class="demo">1</div>
<div class="demo">2</div>
<div class="test">3喵</div>


参数换成属性选择器,选择不是 class="text" 的,选中前两个的

<style>
  div:not([class="test"]) {
    background-color: yellow;
  }
</style>

<div class="demo">1喵</div>
<div class="demo">2喵</div>
<div class="test">3</div>


想选中第四个 div,就是要选中没有 class 属性的 div,也就是除了有 class 的全部被选中

<style>
  div:not([class]) {
    background-color: yellow;
  }
</style>

<div class="demo">1</div>
<div class="demo">2</div>
<div class="test">3</div>
<div>4瞄</div>


如果选中有 class 的 div,不用 not 直接用属性选就完事了

<style>
  div[class] {
    background-color: #008c8c;
  }
</style>

<div class="demo">1瞄</div>
<div class="demo">2瞄</div>
<div class="test">3瞄</div>
<div>4</div>


:not 的应用场景

移动端的列表页面的时候,不是最后一个 li 都加下边的线 

<style>
  ul {
    padding: 0;
    width: 200px;
    border: 1px solid #ccc;
    list-style: none;
  }

  li {
    height: 32px;
    line-height: 32px;
    margin: 0 10px;
    /* border-bottom: 1px solid #ccc; 这样加不好 */
  }

  li:not(:last-of-type) {
    border-bottom: 1px solid #ccc;
  }
</style>

<ul>
  <li>content</li>
  <li>content</li>
  <li>content</li>
  <li>content</li>
  <li>content</li>
  <li>content</li>
  <li>content</li>
</ul>


 E:root 

根标签选择器

在html页面里面 :root{} 和 html{} 是一样的,都是选中 html 标签,

但是区别是,在 html 文件里 :root 选中的是根标签 html 标签,在 xml 里 :root 选中的是 xml 标签

:root{
  background-color: #008c8c;
}

E:root E有点无厘头

div:root{} 不好用

html:root{} 可以用,但是没什么用,直接写 :root{} 也是根标签


 E:target 

target 的意思是目标,选中被选中的目标


什么是被选中的目标?

被选中的状态是被锚点所标记的


可以通过 js 手动设置锚点的值

location.hash = "Ruyic2";


哪个div元素的 id 被标记了,也就是变成了 location.hash 的值,这个 id 就变成 target 状态,

:target 的意思是被标记成锚点之后,言外之意就是 location.hash 的等于什么值之后


div:target{}

1.  index.html#box2  url上的锚点是#box2

2.  <div id="box2">box2</div>  这个div的id值变成  location.hash="box2"  的值了,这个 div 就变成了 target 的状态于是就被选中了

<style>
  div:target {
    background-color: yellow;
    color: orangered;
  }
</style>

<a href="#box1">点击选中box1</a>
<a href="#box2">点击选中box2</a>
<div id="box1">box1</div>
<div id="box2">box2</div>


改变背景颜色

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<style>

  :root,
  body {
    margin: 0;
    height: 100%;
  }

  .btu-wrapper {
    position: absolute;
    width: 200px;
    height: 20px;
    top: 50%;
    left: 50%;
    margin-top: -10px;
    margin-left: -100px;
    font-size: 12px;
    background-color: rgba(255, 255, 255, .3);
    text-align: center;
  }

  .btu-wrapper a {
    display: inline-block;
    height: 20px;
    line-height: 20px;
    text-align: center;
    text-decoration: none;
    color: #666;
    margin: 0 5px;
  }

  div[id]:not(:target) {
    display: none;
  }

  #red,
  #green,
  #blue {
    width: 100%;
    height: 100%;
  }

  #red {
    background-color: #ff8c8c;
  }
  #green {
    background-color: #008c8c;
  }
  #blue {
    background-color: skyblue;
  }

</style>
<title>改变背景颜色</title>
</head>
<body>

  <div class="btu-wrapper">
    <a href="#red">Red</a>
    <a href="#green">Green</a>
    <a href="#blue">BlueSky</a>
  </div>

  <div id="red"></div>
  <div id="green"></div>
  <div id="blue"></div>

  <script>
    location.hash = "red";
  </script>

</body>
</html>


html 先对 document 进行计算,计算完得出高度值,

然后 body 对 html 进行计算,把100%传递给 body,div 再拿 body 的高度

:root,
body{
  height:100%;
}


2、第二部分

下面五种都会考虑其它元素的影响,所以并不常用

E:first-child               第一个子元素

E:last-child                最后一个子元素

E:only-child              只有一个子元素的前提下才会被选中

E:nth-child(n)            一个公式选择,按照公式批量选

E:nth-last-child(n)    与nth-child相反倒着计数


 E:first-child 

回忆这句话,伪元素选择器是"被选中元素"的一种状态


选择div下第一个p元素

1. p 标签是“被选择的元素

2. p:first-child 选中的是“符合第一个p标签的状态

<style>
  p:first-child {
    background-color: yellowgreen;
  }
</style>

<div>
  <p>1喵</p>
  <p>2</p>
  <p>3</p>
</div>


选中 0 和 1

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>first-child</title>
<style>
  p:first-child {
    background-color: yellow;
  }
</style>
</head>
<body>

  <p>0瞄</p>
  <div>
    <p>1瞄</p>
    <p>2</p>
    <p>3</p>
  </div>

</body>
</html>


1. 必须是位置上的第一个

2. 必须是 p 元素,如果第一个是 span 元素会产生干扰

<style>
  p:first-child {
    background-color: yellowgreen;
  }
</style>

<div>
  <span>0</span>
  <p>1</p>
  <p>2</p>
  <p>3</p>
</div>


 E:last-child 

选择最后一个元素,同级不能有兄弟元素,不是一个类型也不行,可能是因为div和p是兄弟元素( 这个有问题

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>:last-child</title>
  <style>
    div p:last-child {
      background-color: yellow;
    }
  </style>
</head>
<body>

  <div>
    <p>1</p>
    <p>2</p>
    <p>3瞄</p>
  </div>
  <p>4</p>

</body>
</html>


没有没选中最后一个p( 这个有问题

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>:last-child</title>
  <style>
    p:last-child {
      background-color: yellow;
    }
  </style>
</head>
<body>

  <p>1</p>
  <p>2</p>
  <p>3</p>
  <p>4</p>

</body>
</html>


 E:only-child 

span 是 div选独生子,所以被选中

<style>
  span:only-child {
    background-color: yellow;
  }
</style>

<div>
  <span>喵</span>
</div>


span不是独生子了,所以不会选中

<style>
  span:only-child {
    background-color: red;
  }
</style>

<div>
  <span>不会被选中</span>
  <em>em</em>
</div>


div 现在是独生子,应该被选中,可是这里选不中,可能因为有兄弟元素body的干扰( 这个也可能有问题

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
  <style>
    div:only-child{
      background-color: yellow;
    }
  </style>
<title>:only-child</title>
</head>
<body>

  <div>
    <span>span</span>
    <em>em</em>
  </div>

</body>
</html>


 E:nth-child(n) 

Css是从 1 开始计数,n 是自然数从 0 开始计数,2n 选的是偶数

2 * 0 = 0 不选

2 * 1 = 2 

2 * 2 = 4

2 * 3 = 6

<style>
  .first p:nth-child(2n) {
    background-color: yellow;
  }
</style>

<div class="first">
  <p>1</p>
  <p>2 瞄</p>
  <p>3</p>
  <p>4瞄</p>
  <p>5</p>
  <p>6瞄</p>
</div>


 2n+1  选中的是基数

2 * 0 + 1 = 1

2 * 1 + 1 = 3

2 * 2 + 1 = 5

<style>
  p:nth-child(2n+1) {
    background-color: yellow;
  }
</style>

<div>
  <p>1瞄</p>
  <p>2</p>
  <p>3瞄</p>
  <p>4</p>
  <p>5瞄</p>
  <p>6</p>
</div>


还可以填单词

add  奇数 1 3 5

even 偶数 2 4 6

<style>
  .third p:nth-child(odd) {
    background-color: greenyellow;
  }

  .third p:nth-child(even) {
    background-color: yellow;
  }
</style>

<div class="third">
  <p>1</p>
  <p>2</p>
  <p>3</p>
  <p>4</p>
  <p>5</p>
  <p>6</p>
</div>


填数字,

Css是从 1 开始计数,不能填负数

<style>
  p:nth-child(1) {
    background-color: #008c8c;
  }

  p:nth-child(4) {
    background-color: #ff8c8c;
  }

  p:nth-child(6) {
    background-color: yellow;
  }
</style>

<div>
  <p>1喵</p>
  <p>2</p>
  <p>3</p>
  <p>4喵</p>
  <p>5</p>
  <p>6喵</p>
</div>


位置必须是第一个,且必须是 p 元素,因为有 span 干扰没有选中

<style>
  p:nth-child(1) {
    background-color: red;
  }
</style>

<div>
  <span>span</span>
  <p>1</p>
  <p>2</p>
  <p>3</p>
  <p>4</p>
</div>


位置是第三个元素,而且是p元素所以能够被选中

<style>
  p:nth-child(3) {
    background-color: yellow;
  }
</style>

<div>
  <span>1span</span>
  <p>2</p>
  <p>3喵</p>
  <p>4</p>
  <p>5</p>
</div>


 E:nth-last-child(n) 

倒着计数与 nth-child 相反

<style>
  p:nth-last-child(1) {
    background-color: #008c8c;
  }

  p:nth-last-child(2) {
    background-color: #ff8c8c;
  }
</style>

<div>
  <p>1</p>
  <p>2</p>
  <p>3喵</p>
  <p>4喵</p>
</div>

下面这五种不考虑其它元素的影响,所以是常用的

E:first-of-type

E:last-of-type

E:only-of-type

E:nth-of-type(n) 重点

E:nth-of-last-type(n) 取反


 E:first-of-type 

 E:last-of-type 

p元素类型的第一个和最后一个,排除span元素的干扰

<style>
  p:first-of-type {
    background-color: orangered;
  }
  p:last-of-type {
    background-color: yellow;
  }
</style>

<div>
  <span>span</span>
  <p>1喵orangered</p>
  <p>2</p>
  <p>3</p>
  <p>4</p>
  <p>5喵yellow</p>
</div>


外面有p元素依然可以选中

<style>
  p:first-of-type {
    background-color: orange;
  }

  p:last-of-type {
    background-color: orangered;
  }
</style>

<p>0喵orange</p>
<div>
  <span>span</span>
  <p>1喵orange</p>
  <p>2</p>
  <p>3</p>
  <p>4</p>
  <p>5喵orangered</p>
</div>
<p>6喵orangered</p>


 E:only-of-type 

必须只有一个 p 元素类型的儿子,原来的 only-child 是必须只有一个儿子,有其它类型的就不行了

<style>
  p:only-of-type {
    background-color: orangered;
  }
</style>

<div>
  <p>p喵</p>
  <!-- 如果再有一个p元素就不行了 -->
  <span>span</span>
</div>


 E:nth-of-type(n)   [重点]

成哥:重点是 E:nth-of-type(n) 也是成哥同事最常用的


参数:

n+2    从第二个开始

n+3    从第三个开始

2n+1

odd

even

数字


找的是 p 元素同类型的

2 * 1 = 2

2 * 2 = 4

2 * 3 = 6

<style>
  p:nth-of-type(2n) {
    background-color: orangered;
  }
</style>

<div>
  <span>span</span>
  <p>1</p>
  <p>2瞄</p>
  <p>3</p>
  <p>4瞄</p>
  <p>5</p>
  <p>6瞄</p>
</div>


 E:nth-of-last-type(n) 

倒着计树


3、第三部分

E:empty     元素必须是空的

E:checked   元素被选中状态

E:enabled

E:disabled

E:read-only

E:read-write 可读可写正常的状态


 E:empty  

:empty 就是这个元素里面什么都没有,有点像 hasChildNodes() 元素里面有没有节点,有节点就不行


这个元素必须是空的的状态下才叫 empty,有空格也不行,但是注释可以因为注释不算做内容

<style>
  div:empty {
    width: 100px;
    height: 100px;
    border: 1px solid #eee;
  }
</style>

<div><span>123</span></div>
<div></div><!-- 瞄 -->
<div> </div>
<div><!-- 注释不算内容 --></div><!-- 瞄 -->
<div>234</div>


 E:checked 

:checke 是元素被选中状态,input 选中状态下的,下一个 span 元素变化,这个做表单美化

<style>
  input[type="checkbox"] {
    display: none;
  }

  span {
    display: block;
    height: 30px;
    width: 30px;
    background-color: #ddd;
    border-radius: 50%;
  }

  /* 选中状态下的下一个元素span */
  input:checked + span {
    background-color: orange;

  }
</style>

<label>
  <input type="checkbox">
  <span></span>
</label>


 E:disabled  设置用不了的输入框样式

 E:enabled   设置默认的正常的输入框样式

<style>
  input:enabled {
    border: 1px solid #008c8c;
  }

  input:disabled {
    border: 1px solid red;
  }
</style>

<input type="text" value="能用的">
<input type="text" disabled value="用不了">


 E:read-only 

<style>
  input:read-only {
    border: 1px solid #eee;
  }
</style>

<input type="text" readonly value="只读">


五、作业

1. Accordion List 手风琴效果

2. Tabs  选项卡


手风琴效果

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<style>
  div {
    position:absolute; top:50%;left:50%;margin-left:-100px;margin-top:-100px;
    width: 200px;
    height: 163;
  }

  span {
    display: none;
    background-color: antiquewhite;
    height: 120px;
  }

  label {
    display: block;
    height: 40px;
    line-height: 40px;
    background-color: brown;
    color: #fff;
    border: none;
    text-align: center;
    border-bottom: 1px solid antiquewhite;
  }

  input[type="radio"] {
    display: none;
  }

  input:checked + span {
    display: block;
  }
</style>
<title>Accordion List 手风琴效果</title>
</head>
<body>

  <div>
    <label for="demo1">Title</label>
    <input type="radio" name="title" id="demo1">
    <span>span</span>


    <label for="demo2">Title</label>
    <input type="radio" name="title" id="demo2">
    <span>span</span>

    <label for="demo3">Title</label>
    <input type="radio" name="title" id="demo3">
    <span>span</span>
  </div>

</body>
</html>




Leave a comment 0 Comments.

Leave a Reply

换一张