属性选择器非常神奇。它们可以使你摆脱棘手的问题,帮助你避免添加类,并指出代码中的一些问题。但是不要担心,虽然属性选择器非常复杂和强大,但是它们很容易学习和使用。在本文中,我们将讨论它们是如何运行的,并给出一些如何使用它们的想法。
通常将?html?属性放在方括号中,称为属性选择器,如下:
[href] {color:?red;}这样任何具有?href?属性的且没有更特定选择器的元素的文本颜色都会是红色的。属性选择器的特性与类相同。
但是你可以使用属性选择器做得更多。就像你的 dna 一样,它们有内在的逻辑来帮助你选择各种属性组合和值。它们可以匹配属性中的任何属性,甚至字符串值,而不是像标签、类或id选择器那样精确匹配。
属性选择器
属性选择器可以独立存在,更具体地说,如果需要选择所有具有?title?属性的div标签,可以这么做:
div[title]但你也可以通过以下操作选择具有 `title` 属性的 **div** 的子元素
div [title]需要说明的是,它们之间没有空格意味着属性位于相同的元素上(就像元素和类之间没有空格一样),而它们之间的空格意味着后代选择器,即选择具有该属性的元素的子元素。
你可以更精细地选择具体属性值的属性。
div[title=dna]上面选择了所有具有确切名称?dna?的div,虽然有选择器算法可以处理每种情况(以及更多),但这里不会选择 “dna is awesome”?或 “dnamutation” 的标题。
注意:在大多数情况下,属性选择器中不需要引号,但是我使用它们,因为我相信它可以提高清代码的可读性,并确保边界用例能够正常工作。
如果你想选择?title?包含?dna?的元素,如 “my beautiful dna” 或者 “mutating dna is fun!” ,可以使用?波浪号(~)。
div[title~=dna]如果你想匹配以?dna?结尾的?title,如 “dontblamemeblamemydna” 或 “his-stupidity-is-from-upbringing-not-dna” ,可以使用?$?标志符:
[title$=dna]如果你想匹配以?dna?开头的?titlle如“dnamutants” 或 “dna-splicing-for-all” ,可以使用`^`标志符:
[title^=dna]虽然精确匹配是有帮助的,但它可能选择太紧,并且?^?符号匹配可能太宽而无法满足你的需要。例如,可能不想选择 “genealogy” 的标题,但仍然选择“gene”和“gene-data”。**管道特征(|)**就是这样,属性中必须是完整且**唯一**的单词,或者以?–?分隔开。
?[title|=gene]最后,还有一个匹配任何子字符串的模糊搜索属性操作符,属性中做字符串拆分,只要能拆出来?dna?这个词就行:
[title*=dna]使这些属性选择器更加强大的是,它们是可堆叠的,允许你选择具有多个匹配因子的元素。
如果你需要找到一个?a?标签,它有一个title?,并且有一个以“genes” 结尾的 class,可以使用如下方式:
a[title][class$=genes]你不仅可以选择 html 元素的属性,还可以使用伪类型元素来打印出文本:
<span?class=joke?title=gene?editing!>what’s?the?first?thing?a?biotech?journalist?does?after?finishing?the?first?draft?of?an?article?</span><br>.joke:hover:after { content: answer: attr(title); display: block;}上面的代码在鼠标悬停时将显示一串自定义的字符串。
最后要知道的是,您可以添加一个标志,让属性搜索不区分大小写。在结束方括号之前添加?i:
[title*=dna?i]因此它会匹配?dna, ?dna, dna 等。
现在我们已经看到了如何使用属性选择器进行选择,让我们看看一些用例。我将它们分为两类:一般用途和诊断。
?一般用途
输入类型样式的设置
你可以对输入类型使用不同的样式,例如电子邮件和电话。
input[type=email] { color: papayawhip;}input[type=tel] { color: thistle;}显示电话链接
你可以隐藏特定尺寸的电话号码并显示电话链接,以便在手机上轻松拨打电话。
span.phone { display: none;}a[href^=tel] { display: block;}内部链接 vs 外部链接,安全链接 vs 非安全链接
你可以区别对待内部和外部链接,并将安全链接设置为与不安全链接不同:
a[href^=http]{ color: bisque;}a:not([href^=http]) { color: darksalmon;}
a[href^=http://]:after { content: url(unlock-icon.svg);}a[href^=https://]:after { content: url(lock-icon.svg);}下载图标
html5 给我们的一个属性是“下载”,它告诉浏览器,你猜对了,下载该文件而不是试图打开它。这对于你希望人们访问但不希望它们立即打开的 `pdf` 和 `doc` 非常有用。它还使得连续下载大量文件的工作流程更加容易。下载属性的缺点是没有默认的视觉效果将其与更传统的链接区分开来。通常这是你想要的,但如果不是,你可以做类似下面的事情:
a[download]:after { content: url(download-arrow.svg);}还可以使用不同的图标(如pdf与docx与odf等)来表示文件类型,等等。
a[href$=pdf]:after { content: url(pdf-icon.svg);}a[href$=docx]:after { content: url(docx-icon.svg);}a[href$=odf]:after { content: url(open-office-icon.svg);}你还可以通过叠加属性选择器来确保这些图标只出现在可下载链接上。
a[download][href$=pdf]:after { content: url(pdf-icon.svg);}覆盖或重新使用已废弃/弃用的代码
我们都遇到过时代码过时的旧网站,在 html5 之前,你可能需要覆盖甚至重新应用作为属性实现的样式。
<div?bgcolor=#000000?color=#ffffff>old,?holey?genes</div>
div[bgcolor=#000000] { /*override*/ background-color: #222222 !important;}
div[color=#ffffff] { /*reapply*/ color: #ffffff;}重写特定的内联样式
有时候你会遇到一些内联样式,这些样式会影响布局,但这些内联样式我们又没修改。那么以下是一种方法。
如果你想要覆盖的确切属性和值,并且希望在它出现的任何地方覆盖它,那么这种方法的效果最好。
对于此示例,元素的边距以像素为单位设置,但需要在?em?中进行扩展和设置,以便在用户更改默认字体大小时可以正确地重新调整元素。
<div style=color: #222222; margin: 8px; background-color: #efefef;teenage mutant ninja myrtle</div>
div[style*=margin: 8px] { margin: 1em !important;}显示文件类型
默认情况下,文件输入的可接受文件列表是不可见的。通常,我们使用伪元素来暴露它们:
<input type=file accept=pdf,doc,docx>
[accept]:after { content: acceptable file types: attr(accept);}html 手风琴菜单
details?和?summary?标签是一种只用**html**做扩展/手风琴菜单的方法,details 包括了summary标签和手风琴打开时要展示的内容。点击?summary?会展开?details?标签并添加?open?属性,我们可以通过 open 属性轻松地为打开的?details?标签设置样式:
details[open] { background-color: hotpink;}打印链接
在打印样式中显示url使我走上了理解属性选择器的道路。你现在应该知道如何自己构建它, 你只需选择带有`href`的所有标签,添加伪元素,然后使用?attr()?和content?打印它们。
a[