选择器,或者选择符,selector,是构建整个CSS的基础。
选择器,让我们可以样式化(X)HTML的元素(h1, p, ul, ol等)或者XML的元素(BOOKTITLE, QUOTE等,具体看XML的元素);可以样式化id(#header, #content, #footer等);可以样式类(.warning, .more等);可以样式化伪元素(:first-letter, :first-line, :before, :after等);可以样式化伪类(:link, :visited, :focus, :hover, :active, :first-child, :lang()等);可以样式化伪元素(:first-letter, :first-line, :before, :after等)……。
相信我上述所列举的选择器中,有几个你没有见过,就算见过就不知道怎么用,比如:first-child, :lang(),我无权责怪你,但希望你能冲出IE的束缚,即使在支持上IE缺席,我们还是可以学习了解更多更强大的CSS选择器,这不仅对支持的浏览器有好处,对IE也有好处,比如可以做针对IE的过滤器(filter),想想我们现在的web世界,全靠hacks , tricks and filters来应付。不是有本书叫做:CSS Hacks and Filters : Making Cascading Stylesheets Work么,呵呵。
针对CSS 2.x的这些不常用(还是那句话,IE支持的缺席使它们变得寂寞)但十分强大灵活得选择器,我将逐步讲述它们,今天,我要写的是,属性选择器,Attribute Selectors。
实际上,你不应该对属性选择器感到陌生,从本质上说,id跟类选择器其实就是属性选择器,只不过是选择了id或者类的值(value)而已。
属性选择器的格式是元素后跟中括号,中括号内带属性,或者属性表达式(不知道描述是否正确,自创的词),比如h1[title], h1[title="Logo"]等,你可以从我下面的论述中看到4种具体形式。
简易属性选择器
只顾其名不顾其值,这是简易属性选择器的特点。
h1[class] {color: silver;}将会作用于任何带class的h1元素,不管class的值是什么。所以<h1 class="hoopla">Hello</h1>、<h1 class="severe">Serenity</h1>、<h1 class="fancy">Fooling</h1>的h1都会受到这条规则的影响。
当然,这个“属性”不仅仅是class或者id,可以是该元素所有合法属性,比如img的alt,这样img[alt]{css declarations here;}将会作用于任何带有alt属性的img元素。那么a[href][title] {font-weight: bold;}呢?聪明的你一定已经知道,这会作用于同时带href和title属性的a元素,比如<a href="http://www.w3.org/" title="W3C Home">W3C</a>。
精确属性值选择器
id和类本质上就是精确属性值选择器,没错,h1#logo等于h1[id="logo"]。如前所述,我们不要局限于id或者class,我们可以使用任何属性!例如a[href="http://www.w3.org/"][title="W3C Home"] {font-size: 200%;}将会作用于<a href="http://www.w3.org/" title="W3C Home">W3C</a>。
部分属性值选择器
如其名,只要属性值部分匹配(这里的部分,实际上要匹配整个单词)就会作用于该元素。让我们来看个例子:
<p class="urgent warning">When handling plutonium, care must be taken to avoid the formation of a critical mass.</p>
p[class~="warning"] {font-weight: bold;}和
p[class~="urgent"] {font-weight: bold;}中任何一条都可以让这个p的字体变粗。
该选择器十分有用,比如你要样式化插图,其title中都含字符串”Figure”,如 title= "Figure 5:xxx说明",则你可以使用img[title~="Figure"] 。
需要注意的是,如我第一句就强调的,你需要匹配的是整个单词,img[title~="Figure"] 不会匹配 title= "Figure5:xxx说明"。
另外,我做了个小小的测试,你把例子中的“Figure”改成“插图”,把img[title~="Figure"] 改成img[title~="插图"] ,在Firefox中依然可以匹配,不管编码(encoding)是GB2312还是UTF-8。看来CSS对中文的支持还不赖。
特殊属性选择器
有点怪,这个选择器。它是这样工作的,嗯,举个例子比描述更容易。
*[lang|="en"] {color: white;},这条规则(rule)将会选择属性lang的值en或者en-打头的元素。就是说,它可以匹配<h1 lang="en">Hello!</h1>、<p lang="en-us">Greetings!</p>和<div lang="en-au">G'day!</div>而不匹配<p lang="fr">Bonjour!</p>和<h3 lang="cy-en">Jrooana!</h3>。
说完了,呼……CSS因你而强大,好好练吧。
参考文献:Cascading Style Sheets: The Definitive Guide, 2nd Edition。
August 29th, 2005
by 宇蠢
~=实际上是选取以空格分隔的词
还有一个好像是以“-”分隔的
可能就是|=了
记不清楚了
August 30th, 2005
by bone
好是好,可惜好多浏览器都不支持
August 30th, 2005
by Neo
The Author
不要说“好多”好不好,主流浏览器不就IE一家不支持么?
Gecko, Opera都支持的……
November 13th, 2005
by bimzcy
对我太有用了,很好!
April 1st, 2006
by popzone
i’m studying!
想知道2.1如何控制滚动条呢,查了半天没有查到
June 12th, 2006
by realazy » JavaScript习作–优化IE的表单交互
[...] 当前的IE并不支持属性选择器,所以对于表单,你得不厌其烦地为每种类型(type)加上相应的class。最让人不能接受的是,IE不支持:focus,所以不得不求助于JavaScript。 [...]
July 8th, 2006
by battery
不知道国外IE 应用情况和国内是否差不多!方正好像现在做网站都是以IE为检测标准!很少人会用各种浏览器去检测!
December 4th, 2006
by jane
以IE为标准已经成为历史了,,
(可以看看microsoft 的网站,,之前不支持FF,现在已完全支持了)
现在情况已经不一样了,,,
现在国内设计师很大一部分都是以 FF 为标准的了。。
尤其是做国际化的网站,和 web2.0的网站,,
都是以 FF 为标准的,,
October 31st, 2007
by qingqing
要是能在详细一些就好了。有些东西看不懂。