CSS 之选择器

选择器

元素选择器

  • *{ }
    1. 通配选择符 (*)
    2. 选定所有对象。
    3. 通常不建议使用通配选择符,因为它会遍历并命中文档中所有的元素,出于性能考虑,需酌情使用。
  • E{ }
    1. 类型选择符(E)
    2. 以文档语言对象类型作为选择符。
    <style>
    h1{font-size:20px;}
    p{font-size:13px;}
    </style>
    
    <h1>标题</h1>
    <p>正文内容</p>
    
  • #myid{ }
    1. ID选择符
    2. 以唯一标识符id属性等于myid的E对象作为选择符.
  • .myclass{ }
    1. 以class属性包含myclass的E对象作为选择符。

关系选择器

  • E F{ }
    1. 包含选择器,又称之为:后代选择器。
    2. 选择所有被E元素包含的F元素。
    3. 子选择器不同的是,包含选择符将会命中所有符合条件的后代,包括儿子,孙子,孙子的孙子..
  • E>F{ }
    1. 子选择器
    2. 选择所有作为E元素的子元素F。
    3. 包含选择符不同的是,子选择符只能命中子元素,而不能命中孙辈。
  • E+F{ }
    1. 相邻选择器
    2. 选择紧贴在E元素之后F元素。
    3. 兄弟选择符不同的是,相邻选择符只会命中符合条件的相邻的兄弟元素。
    # 此例,如果使用 p+p{color:#f00;} ,那么p2,p5将会变成红色;
    # 如果使用p~p{color:#f00;},那么p2,p3,p4,p5将会变成红色;
    <style>
      /* 相邻选择符(E+F) */
      p+p{color:#f00;}
      /* 兄弟选择符(E~F) */
      p~p{color:#f00;}
    </style>
    
    <p>p1</p>
    <p>p2</p>
    <h3>这是一个标题</h3>
    <p>p3</p>
    <h3>这是一个标题</h3>
    <p>p4</p>
    <p>p5</p>
    
  • E~F{ }
    1. 兄弟选择符
    2. 选择E元素后面的所有兄弟元素F。
    3. 相邻选择符不同的是,兄弟选择符会命中所有符合条件的兄弟元素,而不强制是紧邻的元素。

属性选择器

  • [att]
    选择具有for属性的所有元素
    <style>
      [for]{margin:10px;}
    </style>
    <p> 不带有 for 属性的 p 元素</p>
    <p for="Ethan"> 带有 for 属性的 p 元素 </p>
    <p for="Alice"> 带有 for 属性的 p 元素 </p>
    
  • E[att]
    选择具有att属性的E元素
    <style>
      img[alt]{margin:10px;}
    </style>
    
    <img src="图片url" alt="" />
    <img src="图片url" />
    
  • E[att="val"]
    选择具有for属性,并且for=Alice的所有元素
    <style>
      [for="Alice"]{margin:10px;}
    </style>
    <p> 不带有 for 属性的 p 元素</p>
    <p for="Ethan"> 带有 for 属性的 p 元素,且for的值为 Ethan </p>
    <p for="Alice"> 带有 for 属性的 p 元素,且for的值为 Alice</p>
    
  • E[att^="val"]
    选择具有att属性,且属性值以字符串val开头的E元素。
    #此例,将会命中1, 2两个div,因为匹配到了class属性,且属性值以a开头
    <style>
      div[class^="a"]{border:2px solid #000;}
    </style>
    
    <div class="abc">1</div>
    <div class="acb">2</div>
    <div class="bac">3</div>
    
  • E[att$="val"]
    选择具有att属性且属性值为以val结尾的字符串的E元素。
    #此例,将会命中1, 3两个div,因为匹配到了class属性,且属性值以c结尾
    <style>
      div[class$="c"]{border:2px solid #000;}
    </style>
    
    <div class="abc">1</div>
    <div class="acb">2</div>
    <div class="bac">3</div>
    
  • E[att*="val"]
    选择具有att属性且属性值为包含字符串val的E元素。
    #此例,将会命中所有div,因为匹配到了class属性,且属性值中都包含了b
    <style>
      div[class*="b"]{border:2px solid #000;}
    </style>
    
    <div class="abc">1</div>
    <div class="acb">2</div>
    <div class="bac">3</div>
    

伪类选择器

  • :first-child
    向元素的第一个子元素添加样式
  • :last-child
    向元素的最后一个子元素添加样式
  • :nth-child(n)
    向元素的第 n 个子元素添加样式
    特殊应用(可用于表格隔行变色):
    • :nth-child(even)
      选中偶数位置的子元素,添加样式
    • :nth-child(odd)
      选中奇数位置的子元素,添加样式
  • :nth-last-child(n)
    父元素的倒数第n个子元素E,假设第n个该子元素不是E,则选择符无效(E元素必须是某个元素的子元素)
    • 注意:

      <div>
        <p>第1个p</p>
        <p>第2个p</p>
        <span>第1个span</span>
        <p>第3个p</p>
        <span>第2个span</span>
      </div>
      
      1. 假设要命中倒数第一个p(即正数第3个p),那么CSS选择符应该是:
        p:nth-last-child(2)
      2. 而不是: p:nth-last-child(1)

      解释:
      1. 倒数第1个p,其实是倒数第2个子元素。
      2. 基于选择符从右到左解析,首先要找到第1个子元素,然后再去检查该子元素是否为p,如果不是p,则n递增,继续查找。

      1. 假设不确定倒数第1个子元素是否为E,但是又想命中倒数第1个E,应该这样写: p:last-of-type
  • :only-child
    匹配父元素仅有一个子元素,且该子元素为E。
    要使该属性生效,E元素必须是某个元素的子元素,E的父元素最高是body,即E可以是body的子元素。
    <style>
      h1{font-size:16px;}
      li:only-child{color:#f00;}
    </style>
    
    <h1>只有唯一一个子元素</h1>
    <ul>
        <li>结构性伪类选择符 only-child</li>   # 只有 这个字体变色了
    </ul>
    <h1>有多个子元素</h1>
    <ul>
        <li>结构性伪类选择符 only-child</li>
        <li>结构性伪类选择符 only-child</li>
        <li>结构性伪类选择符 only-child</li>
    </ul>
    
  • :first-of-type
    同类型中的第一个同级兄弟元素E
  • :last-of-type
    匹配同类型中的最后一个同级兄弟元素E。
    该选择符总是能命中父元素的倒数第1个为E的子元素,不论倒数第1个子元素是否为E。
  • :only-of-type
    匹配同类型中的唯一的一个同级兄弟元素E。
    该选择符总是能命中父元素的唯一同类型子元素E,不论该元素的位置。
    <style>
          p:only-of-type{color:#f00;}
    </style>
    
    <div class="test">
      <p>结构性伪类选择符 only-of-type</p>
    </div>
    
  • :nth-of-type(n)
    匹配同类型中的第n个同级兄弟元素E。
  • :nth-last-of-type(n)
    匹配同类型中的倒数第n个同级兄弟元素E。
    该选择符总是能命中父元素的倒数第n个为E的子元素,不论倒数第n个子元素是否为E。
  • :empty
    匹配没有任何子元素(包括text节点,即文字)的元素E。
  • :not(s)
    匹配不含有s选择符的元素E。
    <style>
      p:not(.abc){color:#f00;}
    </style>  
    
    <p class="abc">否定伪类选择符 not(s)</p>  #只有class为 .abc的未变色,后面的三个都变色了
    <p id="abc">否定伪类选择符 not(s)</p>
    <p class="abcd">否定伪类选择符 not(s)</p>
    <p>否定伪类选择符 not(s)</p>
    

超链接的伪类

  • a:link{}
    设置超链接a在未被访问前的样式。

  • a:visited{}
    设置超链接a在其链接地址已被访问过的样式。

  • a:hove{}
    设置元素在其鼠标悬停时的样式。

  • a:active{}
    设置元素在被用户激活(在鼠标点击与释放之间发生的事件)时的样式。

  • 注意点

    如果需要给超链接定义:访问前,鼠标悬停,当前被点击,已访问这4种伪类效果,而又没有按照一致的书写顺序,不同的浏览器可能会有不同的表现。
    超链接的4种状态,需要有特定的书写顺序才能生效。
    可靠的顺序是:l(link)ov(visited)e h(hover)a(active)te, 即用喜欢和讨厌两个词来概括

    #注意,a:hover 必须位于 a:link 和 a:visited 之后,a:active 必须位于 a:hover 之后
    a:link{}
    a:visited{}
    a:hover{}
    a:active{}
    

伪元素

  • ::first-letter{ }
    设置对象内的第一个字符的样式。
  • ::first-line{ }
    设置对象内的第一行的样式。
  • ::before
    1.设置在对象前(依据对象树的逻辑结构)发生的内容。
    2.用来和content属性一起使用,并且必须定义content属性
  • ::after
    1.设置在对象后(依据对象树的逻辑结构)发生的内容。
    2.用来和content属性一起使用,并且必须定义content属性
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335