• CSS选择器(二)


    五、属性选择器。

    属性选择器可以根据元素的属性及属性值来选择元素。

    简单属性选择

    如果希望选择有某个属性的元素,而不论属性值是什么,可以使用简单属性选择器。

    例子 1

    如果您希望把包含标题(title)的所有元素变为红色,可以写作:

    *[title] {color:red;}

    例子 2

    与上面类似,可以只对有 href 属性的锚(a 元素)应用样式:

    a[href] {color:red;}

    例子 3

    还可以根据多个属性进行选择,只需将属性选择器链接在一起即可。

    例如,为了将同时有 href 和 title 属性的 HTML 超链接的文本设置为红色,可以这样写:

    a[href][title] {color:red;}

    例子 4

    可以采用一些创造性的方法使用这个特性。

    例如,可以对所有带有 alt 属性的图像应用样式,从而突出显示这些有效的图像:

    img[alt] {border: 5px solid red;}

    提示:上面这个特例更适合用来诊断而不是设计,即用来确定图像是否确实有效。

    根据具体属性值选择

    除了选择拥有某些属性的元素,还可以进一步缩小选择范围,只选择有特定属性值的元素。

    例子 1

    例如,假设希望将指向 Web 服务器上某个指定文档的超链接变成红色,可以这样写:

    a[href="http://www.w3school.com.cn/about_us.asp"] {color: red;}

    例子 2

    与简单属性选择器类似,可以把多个属性-值选择器链接在一起来选择一个文档。

    a[href="http://www.w3school.com.cn/"][title="W3School"] {color: red;}

    这会把以下标记中的第一个超链接的文本变为红色,但是第二个或第三个链接不受影响:

    <a href="http://www.w3school.com.cn/" title="W3School">W3School</a>
    <a href="http://www.w3school.com.cn/css/" title="CSS">CSS</a>
    <a href="http://www.w3school.com.cn/html/" title="HTML">HTML</a>

    属性与属性值必须完全匹配

    请注意,这种格式要求必须与属性值完全匹配。

    如果属性值包含用空格分隔的值列表,匹配就可能出问题。

    请考虑一下的标记片段:

    <p class="important warning">This paragraph is a very important warning.</p>

    如果写成 p[class="important"],那么这个规则不能匹配示例标记。

    要根据具体属性值来选择该元素,必须这样写:

    p[class="important warning"] {color: red;}

    根据部分属性值选择

    如果需要根据属性值中的词列表的某个词进行选择,则需要使用波浪号(~)。

    假设您想选择 class 属性中包含 important 的元素,可以用下面这个选择器做到这一点:

    p[class~="important"] {color: red;}

    如果忽略了波浪号,则说明需要完成完全值匹配。

    部分值属性选择器与点号类名记法的区别

    该选择器等价于我们在类选择器中讨论过的点号类名记法。

    也就是说,p.important 和 p[class="important"] 应用到 HTML 文档时是等价的。

    那么,为什么还要有 "~=" 属性选择器呢?因为它能用于任何属性,而不只是 class。

    例如,可以有一个包含大量图像的文档,其中只有一部分是图片。对此,可以使用一个基于 title 文档的部分属性选择器,只选择这些图片:

    img[title~="Figure"] {border: 1px solid gray;}

    这个规则会选择 title 文本包含 "Figure" 的所有图像。没有 title 属性或者 title 属性中不包含 "Figure" 的图像都不会匹配。

    子串匹配属性选择器

    下面为您介绍一个更高级的选择器模块,它是 CSS2 完成之后发布的,其中包含了更多的部分值属性选择器。按照规范的说法,应该称之为“子串匹配属性选择器”。

    很多现代浏览器都支持这些选择器,包括 IE7。

    下表是对这些选择器的简单总结:

    可以想到,这些选择有很多用途。

    举例来说,如果希望对指向 W3School 的所有链接应用样式,不必为所有这些链接指定 class,再根据这个类编写样式,而只需编写以下规则:

    a[href*="w3school.com.cn"] {color: red;}

    提示:任何属性都可以使用这些选择器。 

    特定属性选择类型

    最后为您介绍特定属性选择器。请看下面的例子:

    *[lang|="en"] {color: red;}

    上面这个规则会选择 lang 属性等于 en 或以 en- 开头的所有元素。因此,以下示例标记中的前三个元素将被选中,而不会选择后两个元素:

    <p lang="en">Hello!</p>
    <p lang="en-us">Greetings!</p>
    <p lang="en-au">G'day!</p>
    <p lang="fr">Bonjour!</p>
    <p lang="cy-en">Jrooana!</p>

    一般来说,[att|="val"] 可以用于任何属性及其值。

    假设一个 HTML 文档中有一系列图片,其中每个图片的文件名都形如 figure-1.jpg 和 figure-2.jpg。就可以使用以下选择器匹配所有这些图像:

    img[src|="figure"] {border: 1px solid gray;}

    当然,这种属性选择器最常见的用途还是匹配语言值。

    CSS 选择器参考手册

    六、CSS 后代选择器

    后代选择器(descendant selector)又称为包含选择器。

    后代选择器可以选择作为某元素后代的元素。

    根据上下文选择元素

    我们可以定义后代选择器来创建一些规则,使这些规则在某些文档结构中起作用,而在另外一些结构中不起作用。

    举例来说,如果您希望只对 h1 元素中的 em 元素应用样式,可以这样写:

    h1 em {color:red;}

    上面这个规则会把作为 h1 元素后代的 em 元素的文本变为 红色。其他 em 文本(如段落或块引用中的 em)则不会被这个规则选中:

    <h1>This is a <em>important</em> heading</h1>
    <p>This is a <em>important</em> paragraph.</p>

    当然,您也可以在 h1 中找到的每个 em 元素上放一个 class 属性,但是显然,后代选择器的效率更高。

    语法解释

    在后代选择器中,规则左边的选择器一端包括两个或多个用空格分隔的选择器。选择器之间的空格是一种结合符(combinator)。每个空格结合符可以解释为“... 在 ... 找到”、“... 作为 ... 的一部分”、“... 作为 ... 的后代”,但是要求必须从右向左读选择器。

    因此,h1 em 选择器可以解释为 “作为 h1 元素后代的任何 em 元素”。如果要从左向右读选择器,可以换成以下说法:“包含 em 的所有 h1 会把以下样式应用到该 em”。

    具体应用

    后代选择器的功能极其强大。有了它,可以使 HTML 中不可能实现的任务成为可能。

    假设有一个文档,其中有一个边栏,还有一个主区。边栏的背景为蓝色,主区的背景为白色,这两个区都包含链接列表。不能把所有链接都设置为蓝色,因为这样一来边栏中的蓝色链接都无法看到。

    解决方法是使用后代选择器。在这种情况下,可以为包含边栏的 div 指定值为 sidebar 的 class 属性,并把主区的 class 属性值设置为 maincontent。然后编写以下样式:

    div.sidebar {background:blue;}
    div.maincontent {background:white;}
    div.sidebar a:link {color:white;}
    div.maincontent a:link {color:blue;}

    有关后代选择器有一个易被忽视的方面,即两个元素之间的层次间隔可以是无限的。

    例如,如果写作 ul em,这个语法就会选择从 ul 元素继承的所有 em 元素,而不论 em 的嵌套层次多深。

    因此,ul em 将会选择以下标记中的所有 em 元素:

    <ul>
      <li>List item 1
        <ol>
          <li>List item 1-1</li>
          <li>List item 1-2</li>
          <li>List item 1-3
            <ol>
              <li>List item 1-3-1</li>
              <li>List item <em>1-3-2</em></li>
              <li>List item 1-3-3</li>
            </ol>
          </li>
          <li>List item 1-4</li>
        </ol>
      </li>
      <li>List item 2</li>
      <li>List item 3</li>
    </ul>

    七、CSS 子元素选择器

    与后代选择器相比,子元素选择器(Child selectors)只能选择作为某元素子元素的元素。

    选择子元素

    如果您不希望选择任意的后代元素,而是希望缩小范围,只选择某个元素的子元素,请使用子元素选择器(Child selector)。

    例如,如果您希望选择只作为 h1 元素子元素的 strong 元素,可以这样写:

    h1 > strong {color:red;}

    这个规则会把第一个 h1 下面的两个 strong 元素变为红色,但是第二个 h1 中的 strong 不受影响:

    <h1>This is <strong>very</strong> <strong>very</strong> important.</h1>
    <h1>This is <em>really <strong>very</strong></em> important.</h1>

    语法解释

    您应该已经注意到了,子选择器使用了大于号(子结合符)。

    子结合符两边可以有空白符,这是可选的。因此,以下写法都没有问题:

    h1 > strong
    h1> strong
    h1 >strong
    h1>strong

    如果从右向左读,选择器 h1 > strong 可以解释为“选择作为 h1 元素子元素的所有 strong 元素”。

    结合后代选择器和子选择器

    请看下面这个选择器:

    table.company td > p

    上面的选择器会选择作为 td 元素子元素的所有 p 元素,这个 td 元素本身从 table 元素继承,该 table 元素有一个包含 company 的 class 属性。

    八、CSS 相邻兄弟选择器

    相邻兄弟选择器(Adjacent sibling selector)可选择紧接在另一元素后的元素,且二者有相同父元素。

    选择相邻兄弟

    如果需要选择紧接在另一个元素后的元素,而且二者有相同的父元素,可以使用相邻兄弟选择器(Adjacent sibling selector)。

    例如,如果要增加紧接在 h1 元素后出现的段落的上边距,可以这样写:

    h1 + p {margin-top:50px;}

    这个选择器读作:“选择紧接在 h1 元素后出现的段落,h1 和 p 元素拥有共同的父元素”。

    语法解释

    相邻兄弟选择器使用了加号(+),即相邻兄弟结合符(Adjacent sibling combinator)。

    注释:与子结合符一样,相邻兄弟结合符旁边可以有空白符。

    请看下面这个文档树片段:

    <div>
      <ul>
        <li>List item 1</li>
        <li>List item 2</li>
        <li>List item 3</li>
      </ul>
      <ol>
        <li>List item 1</li>
        <li>List item 2</li>
        <li>List item 3</li>
      </ol>
    </div>

    在上面的片段中,div 元素中包含两个列表:一个无序列表,一个有序列表,每个列表都包含三个列表项。这两个列表是相邻兄弟,列表项本身也是相邻兄弟。不过,第一个列表中的列表项与第二个列表中的列表项不是相邻兄弟,因为这两组列表项不属于同一父元素(最多只能算堂兄弟)。

    请记住,用一个结合符只能选择两个相邻兄弟中的第二个元素。请看下面的选择器:

    li + li {font-weight:bold;}

    结合其他选择器

    相邻兄弟结合符还可以结合其他结合符:

    html > body table + ul {margin-top:20px;}

    这个选择器解释为:选择紧接在 table 元素后出现的所有兄弟 ul 元素,该 table 元素包含在一个 body 元素中,body 元素本身是 html 元素的子元素。

    上面这个选择器只会把列表中的第二个和第三个列表项变为粗体。第一个列表项不受影响。

  • 相关阅读:
    【MSSQL】MSSQL还原单mdf文件报1813错误
    【JSP】JSP基础学习记录(二)—— JSP的7个动作指令
    【JSP】JSP基础学习记录(一)—— 基础介绍以及3个编译指令
    【Other】U盘FAT32转NTFS且无数据丢失
    python map()
    python关于分割与拼接的那些事
    python shutil.copy()用法
    python enumerate用法
    工作中遇到一些难题1_5
    廖雪峰读书笔记_文件读写总结_2016_12_23
  • 原文地址:https://www.cnblogs.com/xinghun/p/5386200.html
Copyright © 2020-2023  润新知