十二月 7th, 2009@font-face

@font-face

@font-face

语法:
@font-face { font-family : name ; src : url( url ) ; sRules }

说明:
name : 字体名称
url : 使用绝对或相对地址指定OpenType字体
sRules : 样式表定义
设置嵌入HTML文档的字体。
嵌入HTML文档的字体是指将OpenType字体(压缩的TrueType字体)文件映射到客户端系统,用来提供HTML文档使用该字体,或取代客户端系统已有的同名字体。

示例:

<html><head><title>hello world</title>
<style>
@font-face {font-family: dreamy; font-weight: bold; src: url(My-Hand-Fights-LS.ttf); }
#hello{font-family: dreamy;font-size:98px;}
</style>
</head>
<body><div id=”hello”>hello world</div></body></html>

浏览器支持:
@font-face  IE(≥ 4,仅支持 OpenType)Firefox(≥ 3.5) Opera(≥ 10.0) Safari(≥ 3.1)

看这一切都是因为秦歌和玉伯:
《默认WEB字体样式》

《再谈 Web 默认字体》

《三谈 Web 默认字体》

你说英文字体都是二三十K的,中文字体都是二三M的,这可怎么办啊!

1
好文啊

十一月 27th, 2009新Google搜索展示

新Google搜索展示

新Google搜索展示

单击看大图,看高清吧!

百度的框计算算个燕子啊!

据说这个还在测试,你一个凡人是看不到的,但是有办法,我来告诉你:

1、在浏览器地址栏输入www.Google.com/en,进入谷歌英文站点;

2、在浏览器的地址栏中输入以下代码:

javascript:void(document.cookie=”PREF=ID=20b6e4c2f44943bb:U=4bf292d46faad806:TM=1249677602:LM=1257919388:S=odm0Ys-53ZueXfZG;path=/; domain=.google.com”); 看得懂这行代码啊!

3、按F5键刷新Google.com页面,稍等片刻,谷歌便可以进入新界面模式了。

看上去好像搜索+筛选是人类最习惯的寻找! 电子商务网站都这么做的,而且提供的是更加强大和精准的刷选,如淘宝alibaba.com

1
好文啊

十一月 24th, 2009创业网站

翻东西

翻东西

这就是一个创业网站一个主导航下的一个页面,回想起现在要是公司出现了这样的页面,那我今晚肯定没有时间煮泡面了!而且会大动干戈!

又想现在网站如此复杂的产品和不那么高效的流程,真是捏喊、、、

这就是创业网站,不怕出错,但行动迅速,目空一切…

1
好文啊

十一月 14th, 2009精点雨露,感谢收藏

1.无理取闹,必有所图!
2.幸福是个比较级,要有东西垫底才感觉得到。
3.一句“拿着”胜过两句“我会给你的”。
4.问候不一定郑重其事,但一定要真诚感人。
5.做与不做的最大区别是:后者拥有对前者的评论权。
6.当男人遇见女人,从此只有纪念日,没有独立日。
7.闭上眼睛,我看到了我的前途……
8.路见不平一声吼,吼完继续往前走。
9.当裤子失去皮带,才懂得什麽叫做依赖。
10.人生有时就像电脑,说死机就死机,没得商量。

11.海阔凭鱼跃,破鼓任人捶。
12.有钱的捧个钱场,没钱的回家取点钱来捧个钱场。
13.能够说出的委屈,便不算委屈;能够抢走的爱人,便不算爱人。
14.烟不听话,所以我们“抽烟”。
15.人长得漂亮不如活得漂亮!
16.不能自拔的,除了爱情,还有别人地里的萝卜。
17.我以为“隐身”别人就找不到我了,没用的,像我这样的人,无论在哪里都像漆黑夜里的萤火虫,够鲜明够出众。
18.有些事,明知是错的也要去坚持,因为不甘心;有些人,明知是爱的也要去放弃,因为没结局;有时候,明知路没了却还在前行,因为习惯了。
19.钻石恒久远,一颗就破产!
20.铁公鸡还会留点铁锈呢,你根本就是个不锈钢公鸡

21.还没来得及区沾花惹草,就被人拔光了。
22.女为悦己者容,男为悦己者穷。
23.每个人出生的时候都是原创,可悲的是,很多人渐渐都成了盗版!
24.不要说别人脑子有病,脑子有病的前提是必须有个脑子。
25.在哪里摔倒就在哪里躺下。
26.“浪漫”是一袭美丽的晚礼服,但你不能一天到晚都穿着它。
27.把一切平凡的事做好即不平凡,把一切简单的事做对即不简单。
28.我又不是王子,为什莫女孩遇见我总认为自己应该成为公主!
29.情侣间最矛盾的地方就是幻想彼此的未来,却惦记着对方的过去。
30.所谓缘分,就是爱情成功时的理由,失败时的借口;所谓婚礼,就是有情人终成“家属”的仪式;所谓分手,就是女人说了一百次也未必能做到,而男人说一次就能实现的事。

31.逆风的方向,更适合飞翔。我不怕万人阻挡,只怕自己投降。
32.你发怒一分钟,便失去60秒的幸福。
33.快乐要懂得分享,才能加倍快乐。
34.忙碌是一种幸福,让我们没时间体会痛苦;奔波是一种快乐,让我们真实的感受生活;疲惫是一种享受,让我们无暇空虚。
35.生活就像“呼吸”,“呼”是为了出一口气,“吸”是为了争一口气。
36.我问过烦恼了,他根本不爱你,让我转告你不要自作多情;健康让我带封情书给你:他对你一生不变!
37.知识就像内裤,看不见但很重要。
38.爱一个人好难,爱两个人好玩,爱三个人好烦,爱四个人翻船,爱五个人彻底玩儿完。
39.女人吻男人是一种幸福,男人吻女人是一种口福。
40.结婚就是给自由穿件棉衣,活动起来不方便,但会很温暖。

41.英雄难过美人关,我不是英雄,美人让我过了关。
42.玩命:要在有命的情况下才能玩,命都没了,拿什末玩啊!
43.别人一夸我,我就担心,担心别人夸得不够。
44.爱情永远比婚姻圣洁,婚姻永远比爱情实惠。
45.探索的旅程不在于发现新大陆,而在于培养新视角。
46.本无意与众不同,怎奈何品味出众。
47.一个人能走多远,要看他与谁同行;一个人有多优秀,要看他有谁指点;一个人有多成功,要看他有谁相伴。
48.叹气是最浪费时间的事情,哭泣是最浪费力气的行径。
49.男人的大脑喜欢女人的内心,但是眼睛喜欢女人的外表。
50.有钱就败家,没钱就拜神。

51.当初结婚是看上眼了,后来离婚是看走眼了。
52.咸鱼翻身,还是咸鱼。
53.我可以选择放弃,但不能放弃选择。
54.作为失败的典型,你实在是太成功了。
55.不是人人都能活的低调,可以低调的基础是随时都能高调。
56.女人喜欢长得坏坏的男人,不是喜欢长坏了的男人.
57.古人说:“女为悦己者容”,其实应该是“女为己悦者容”.
58.我们的爱情在这天夭折了,只为了让彼此有重生的机会.
59.老板用你的时候你就是人才,不用你的时候就变成裁人!
60.一个成功的男人就是能够挣到比妻子花的钱更多的钱,一个成功的女人就是能够找到这样一个男人.

61.跌倒了,爬起来再哭.
62.婚姻的杀手有时不是外遇,而是时间.
63.一个月亮一个你,两个影子我和你,三生有幸认识你,四个西施不如你.
64.绝口不提不是因为忘记,而是因为铭记.
65.有人说爱情是上辈子欠下的情债这辈子来还,我上辈子一定俗不可耐,所以今生无债可还!
66.让未来到来,让过去过去.
67.微小的幸福就在身边,容易满足就是天堂.
68.个头大就一定厉害吗?恐龙不是照样灭绝了!
69.善意的谎言:就是给自己的欺骗找一个很好的借口。
70.父母忽悠孩子叫教育;孩子忽悠父母叫欺骗;互相忽悠叫代沟。

71.孤单是一个人的狂欢,狂欢是一群人的孤单。
72.别跟我谈感情,谈感情伤钱。
73.幽默就是一个人想哭的时候还有笑的兴致。
74.感觉不到痛苦的爱情不是真正的爱情,感觉不到幸福的婚姻必是悲哀的婚姻。
75.一道幸福之门关闭时,另一道就会打开。我们经常盯着关闭的门,对开启的门却视若无睹。
76.咖啡苦与甜,不在于怎末搅拌,而在于是否放糖;一段伤痛,不在于怎末忘记,而在于是否有勇气重新开始。
77.人之所以活的累,是因为放不下架子、撕不开面子、解不开情结。
78.爱是费尽心力地全身投入,然后再百转千回地抽身而出!
79.我自横刀向天笑,笑完之后去睡觉!
80.人生最精彩的不是实现梦想的瞬间,而是坚持梦想的过程!

81.老婆和老妈掉进了河里,我先救老妈,因为是老妈给了我生命,我找不到任何理由丢下她不管。老婆如果没救上来,我可以再给她陪葬,在墓里继续我们的爱情
82.某天,我弟弟去某小学打篮球,听到一低年级女生问一个低年级男生:“你到底爱不爱我???”那男生无奈道:“我妈一天给我3元钱,其中两块五都让你拿去买零食了,你说我爱不爱你!!!”
83.USYD=U Sleep You Die UNSW=U Never Sleep Well
84.去趟珠江路,一共有3个人和我搭讪,一个是查我省份证的pol.ice叔叔,再来两个是卖毛片的 ……….
85.SARS,,,是病毒名字?还是汽水名字?(亚洲汽水)
86.除了萝莉,还是御姐
87.”早睡”和”早起”并不总是一一映射的关系…..

4
好文啊

InteractionDesign2

没有保存的关闭需要确认吗?哦,是的,的确是需要确认的。但是这个确认框为什么总是在屏幕的最中间弹出呢,我的鼠标在叉叉那儿,要是这个不可缺少的确认框能在叉叉的边上那就爽多了,,,其实我们很不想鼠标移来移去。

到现在为止,我没看过有这样的设计!欢迎尝试!!

2
好文啊

疯子项目实验室,非疯勿入!

不要想念哥,哥只是搬去D4

佩服阿里巴巴的这些牛逼的人!

3
好文啊

创造
用了两年的Win主机和PJBlog终于退场了,主机是用钱买的,没必要感谢。PJBlog是免费用的,感谢下腾讯的PuterJam同学,此asp博客已经灰常不错了!

既然都换了,但是数据还是要啊,所以得把原来在PJBlog中的数据导入到WP中,这里介绍我使用的一种简单方法。

WP支持多种格式的导入,常见的有SQL等,我用的RSS标准的XML文件,这个及其方便。

使用RSS2.0 XML文件从PJBlog博客导入数据岛WP平台

1. 首先要修改feed.asp文件,找到SQL = “SELECT TOP 10 L.log_ID,L.log_Title,l.log_Author,L.log省略,这里TOP 10是你要修改的数值,要全部导出就删掉TOP 10好了,数字多少自己斟酌,因为WP默认只能导入2M以内的文件。

2. 然后在你浏览器里访问http://你的域名/feed.asp,然后保存源文件。

3. 我以为现在直接导入就OK了,在这里我告诉你,不行的。两者的定义是不一样的。主要有一个,WP的内容定义是<content:encoded></content:encoded>,然后你在编辑器里批量替换就行了。WP的定义很多,我没有一一核对,当然你要向知道,可去读文档(我不知道文档在哪儿),你也可以随便发片文章,然后在WP导出,看看他导出是什么样子的,对比下就清楚了!我就是这么搞的!

我没有把以前所有的文章都导进来,因为我之前很多的文章都是转的,现在我要开始原创。伟人说:当你不会的时候你要先学会模仿,当你会了,你要学会创造。

PS:最早之前的订阅的地址有变化,麻烦又订阅的重新订阅!

2
好文啊

好久没写东西了,随便搞点东西填补一下。

在发布产品淘宝选好类目之后,出现以下:

一个大按钮和一个链接,照理应该是直接“好了,去发布宝贝”,可是那个或之后是说用宝贝模板也有效减少你的工作量,这不正适合我,点进去:

怎么是这样的界面,这思路没有连贯性啊,糊涂。看看文案说让我先搜索,好吧,我搜,我先后搜索了“被子”,“家居用品”,“家纺”,“他妈的”,界面除了从新加载了一遍没有任何变化。。。

请淘宝的同学看下是怎么回事,可能这个页面的到达率不是很高,但这的确让人很失望!!!

2
好文啊

九月 5th, 2009Mag & Die – Going Away

歌曲名: Going Away
歌手: Mag & Die
音乐风格: 摇滚
专辑:Here, Here And Here
发行时间: 2009年06月
韩裔美籍姐妹所组成的摇滚 双人组Meg & Dia,妹妹Dia是乐队的主唱,而姐姐Meg则是乐队的吉他手,她们已经参加过很多大大小小的巡回演出,受到歌迷们的好评,并且积累了很多丰富的经验, 这为她们未来的音乐创作奠定了基础。她们的首张专辑Something Real于2006年发行,这张是她们2009年的第二张大碟,整张专辑都是抒情缓慢的摇滚歌曲,音乐中充满了年轻人那种活力和积极向上的感觉,轻松、活 泼的旋律总能抓住你的耳朵

going away
meg&dia
Please don’t forget me, I’m going away.
I’m taking a taxi to Kentucky,
Where they don’t even know
All about me; I just need to feel safe.
I’ve got a thousand sweaters, and shoes,
And paintings to hide;
The skeletons in my way, don’t ask where I’m going
I’m going away, I’m going my way.
Finally, it’s my time, to be lonely enough. unloved and I can’t wait.
Dont forget what I said, don’t forget my letter.
Every night I pray for you.
I don’t got a religion. Isnt that something? I miss those days.
I see that bottle, it’s now ten years aged.
I’ve got the marbles I could sell for money, got a pair of fresh shaved legs.
Won’t you baby come with me?
I’ve got a extra space
In my car, in my heart, in my mind
Look there’s the passenger seat by the boat that you gave
Don’t know where I’m going…
I’m going away, I’m going my way.
finally it’s my time, to be lonely enough. unloved and I can’t wait.
Don’t forget what I said; don’t forget my letter.
Every night I pray for you,
I don’t got a religion. Isnt that something? I miss those days.
Well he said, slow down; slow down;
Think it over, weve all got wretched closets.
A silly girl pride kills more than AIDS
Lately I say come on, I’ve thought it over,
I don’t wanna die here; I’ve no desire to get married.
I can’t read the others anymore.
Alone, I must learn to race myself
I’m going away, I’m going my way
Finally it’s my time, to be lonely enough. Unloved and I can’t wait
please forget what I said, please forget my letter.
Every night I pray for you;
I don’t got a religion to think that something will make those days.
I, I’m not going halfway (I’ll find my way)
I, I, Every night I pray for you,
Don’t believe in Heaven or that it could be a happy place
I,
I’m going away

下载地址:http://www.rayfile.com/files/396a1075-99d2-11de-b7dd-0014221b798a/

1
好文啊

九月 1st, 2009征服高级CSS选择器

CSS是对网页设计师可用的最强大的工具之一。使用它我们可以在几分钟内改变一个网站的界面,而不用改变页面的标签。但是尽管事实上,我们每个人也都意识到了它是有用的,CSS 选择器远未发挥它们的潜力,有的时候我们还趋向于使用过多的和无用的class、id、div、span等把我们的HTML搞的很凌乱。

 

避免让这些“瘟疫”在你的标签中传播并保持其简洁和语义化的最佳方式,就是使用更复杂的CSS选择器,它们可以定位于指定的元素而不用使用额外的class或id,而且通过这种方式也可以让我们的代码和样式更加灵活

CSS的优先级

在深入研究高级CSS选择器领域之前,理解CSS优先级是如何工作的是很重要的,这样我们就知道如何适当的使用我们的选择器并避免浪费大量的时间来调试一些只要我们注意到优先级的话就很容易被搞定的问题

当我们写CSS的时候我们必须注意有些选择器在级联(cascade)上会高于其它选择器,我们写在最后面的选择器将不一定会覆盖前面我们写在同一个元素的样式。

那么你如何计算指定选择器的优先级?如果你考虑到将优先级表示为用逗号隔开的四个数字就会相当简单,比如:1, 1, 1, 1 或0, 2, 0, 1

  1. 第一个数字(a)通常就是0,除非在标签上使用style属性;
  2. 第二个数字(b)是该选择器上的id的数量的总和;
  3. 第三个数字(c)是用在该选择器上的其它属性选择器和伪类的总和。这里包括class (.example) 和属性选择器(比如 li[id=red]);
  4. 第四个数字(d)计算元素(就像table、p、div等等)和伪元素(就像:first-line等);
  5. 通用选择器(*)是0优先级;
  6. 如果两个选择器有同样的优先级,在样式表中后面的那个起作用。

让我们看几个例子,这样或许比较容易理解些:

  • #sidebar h2 — 0, 1, 0, 1
  • h2.title — 0, 0, 1, 1
  • h2 + p — 0, 0, 0, 2
  • #sidebar p:first-line — 0, 1, 0, 2

在下面的例子中,第一个将会起作用,因为它比第二个优先级高:

  • #sidebar p#first { color: red; } — 0, 2, 0, 1
  • #sidebar p:first-line { color: blue; } — 0, 1, 0, 2

至少基本理解优先级是如何工作的是很重要的,但是一些工具比如Firebug,在我们审查指定元素的时候,按照选择器的优先级列出所有的css选择器对让我们知道在指定元素上哪个选择器是有效的是很有用的。


让你非常容易的看到那个选择器作用于一个元素上了。

有用的文章:

1. 属性选择器

属性选择器(Attribute selector)让你可以基于属性来定位一个元素。你可以只指定该元素的某个属性,这样所有使用该属性——而不管它的值——的这个元素都将被定位,也可以更加明确并定位在这些属性上使用特定值的元素 —— 这就是属性选择器展示它们的威力的地方。

有6个不同类型的属性选择器:

  • [att=value]
    该属性有指定的确切的值。
  • [att~=value]
    该属性的值必须是一系列用空格隔开的多个值,(比如,class=”title featured home”),而且这些值中的一个必须是指定的值”value”。
  • [att|=value]
    属性的值就是“value”或者以“value”开始并立即跟上一个“-”字符,也就是“value-”。(比如lang=”zh-cn”)
  • [att^=value]
    该属性的值以指定值开始。
  • [att$=value]
    该属性的值包含指定的值(而无论其位置)。
  • [att*=value]
    该属性的值以指定的值结束

比如,如果你想要改变你的博客上的日志部分元素的背景颜色,你可以使用一个指定每一个class属性值以“post-”开始的div的属性选择器:

div[class|="post"] {
	background-color: #333;
	}

该语句将匹配所有class属性包含”post”并带”-”字符的div元素。(注:此处英文原文有些上下文不对应,我已经更正——译者,神飞)

属性选择器的另一个很有用的用处是定位不同类型的input元素。比如,如果你想让你的文本输入框使用一个特定的宽度,你可以使用下面的属性选择器:

input[type="text"] {
	width: 200px;
	}

这将匹配所有type属性值等于“text”的input元素。

现在我们可能像为网站上不同的文件类型的链接添加不同的图标,这样你的网站的访客就会知道他们将获得一个图片、或者PDF文件、或者是一个word文档等。这就可以使用属性选择器来实现:

a[href*=".jpg"] {
	background: url(jpeg.gif) no-repeat left 50%;
	padding: 2px 0 2px 20px;
	}
 
a[href*=".pdf"] {
	background: url(pdf.gif) no-repeat left 50%;
	padding: 2px 0 2px 20px;
	}
 
a[href*=".doc"] {
	background: url(word.gif) no-repeat left 50%;
	padding: 2px 0 2px 20px;
	}

在此例中,我们使用了一个定位所有的链接(a)的href属性分别以.jpg,.pdf或.doc结束(*)的属性选择器。详细可查看前端观察之前的一篇文章《使用CSS选择器创建个性化链接样式

浏览器支持

除了Internet Explorer 6,所有的主流浏览器都支持属性选择器。这意味着,如果你在你的网站上使用了属性选择器,你应该确保IE6用户将仍能获得一个可用的网站。比如我们的第三个例子,为链接添加图标可以给你的网站带来另一个级别的可用性,但是如果这些链接不显示任何图标,该网站仍然还是可用的。

2. 子选择器

子选择器用符号“>”表示。它允许你定位某个元素的第一级子元素

比如,如果你想匹配所有的作为你的网站侧栏的div的子元素的h2元素,而不是可能是在div元素内的所有h2元素,也不是div的孙元素(或者更低级别的),你就可以使用下面的选择器:

div#sidebar &gt; h2 {
	font-size: 20px;
	}

你当然也可以同时使用子元素和后代元素。比如,如果你想定位只有在body元素的子级div元素内的blockquote元素(比如你想匹配主要的div内的blockquotes,而不是其它部分的:

body &gt; div &gt; div blockquote {
	margin-left: 30px;
	}

浏览器支持

和属性选择器一样,子选择器不被IE6支持。如果你通过这种方式要实现的效果和网站的可用性或总体设计息息相关,你可以考虑使用一个class,或者使用只针对IE6的样式,但是这将有悖使用子选择器的目的。

3. 兄弟组合

有两类兄弟组合:临近兄弟组合和普通兄弟组合

临近兄弟组合

该选择器使用加号“+”来链接前后两个选择器。选择器中的元素有同一个父亲,而且第二个必须紧紧的跟着第一个

临近兄弟组合可以灰常有用,比如,在处理文字的时候。比如我们想对段落后面的h2标题添加一个顶间距“margin-top”(当然或许你无需为h1标签后面的h2添加,或者它可能是页面的第一个元素):

p + h2 {
	margin-top: 10px;
	}

你甚至可以更加具体,你想定位某个特定的div后面的h2:

div.post p + h2 {
	margin-top: 10px;
	}

或者你可以搞得更加复杂:页面的第一个段落的第一行字母显示为小写字母。

.post h1 + p:first-line {
	font-variant: small-caps;
	}

因为可能大部分日志/文章的第一个段落都会紧紧的在H1标签的后面。你可以在你的选择器中借助于h1标签。

普通兄弟组合

普通兄弟组合和临近兄弟组合的工作原理很像,不同的是第二个选择其无需紧紧跟随第一个

如果你需要定位所有的某个特定的div里面并且跟在h1标签后面的p标签的话(你可能想要这些p标签比拟的日志的标题前面的文字大些),你就可以使用这个选择器:

.post h1 ~ p {
	font-size: 13px;
	}

注:这两个选择器太像了,所有不是很好理解,可以试一试下面的这个例子:

CSS:

p + h2{color:red;
	}
	p ~ h2{font-weight:700;
	}

HTML:

<p>咳咳,内容。</p>
<h2>标题1</h2>
<h2>标题2</h2>

看看第二个h2的颜色就可以理解了吧?临近兄弟组合只能匹配第一个选择器后面的第一个兄弟选择其,普通兄弟组合则能匹配所有。注:该部分英文原文没有,是神飞翻译时自己添加。

浏览器支持

Internet Explorer 6依然不能理解兄弟选择器,但是,另一种情况,如果你的用户中只有一小部分是IE6用户,而且网站的结构不会被破坏或者受到严重影响,这是实现很多很酷的效果而无需在你的HTML代码中添加无用的class或id。

4. 伪类

动态伪类

之所以被称为动态伪类是因为它们并不存在于HTML中——而是只有当用户和网站交互的时候才会呈现。

有两类动态伪类:链接用户行为。链接就是:link 和:visited,而用户行为包括:hover、:active 和:focus。

在本文中提到的css选择器中,这几个应该是最常用到的。

:link伪类用于链接尚未被用户访问的时候,而:visited 伪类用于用户访问过的链接,也就是说它们是相反的。

:hover伪类用于用户移动他们的鼠标在元素上,而尚未触发或点击它的时候。:active伪类应用于用户点击元素的情况。最后,:focus伪类用于元素成为焦点的时候——最常用于表单元素。

你可以在你的样式表中使用多种用户行为动态伪类,这样你就可以,比如,根据用户的鼠标只是滑过或悬停的时候,为一个输入框定义不同的背景色:

input:focus {
	background: #D2D2D2;
	border: 1px solid #5E5E5E;
	}
input:focus:hover {
	background: #C7C7C7;
	}
浏览器兼容性

动态伪类被所有的现代浏览器支持,甚至IE6,但是请注意,对于IE系列浏览器来说,IE6只允许:hover 伪类应用于链接元素(a标签)而且只有IE8接受:active状态。

:first-child

:first-child伪类允许你定位某个元素第一个子元素。比如,如果你想给你的无须列表的第一个li添加一个margin-top,你就可以这样写:

ul &gt; li:first-child {
	margin-top: 10px;
	}

让我们来看一看另一个例子:比如你想让你的博客的侧栏的H2标签都有个顶部边距,以将标题和它们前面的内容区分开来,但是第一个h2不需要,你就可以使用下面的代码:

#sidebar &gt; h2 {
	margin-top: 10px;
	}
 
#sidebar &gt; h2:first-child {
	margin-top: 0;
	}
浏览器兼容性

IE6 不支持 :first-child 伪类。根据伪类应用到的设计的不同,它或许不会成为关注的主要问题。比如,如果你使用:first-child 选择器来移除标题或段落上的头部或底部的间距,你的布局在IE6中不会坏掉,它只会看起来有些不同。但是如果你使用:first-child选择器从一个,比如浮动元素,移除左边距或右边距,将会让你的设计乱掉。

语言伪类

语言伪类:lang(),允许你匹配一个基于它的语言的元素。

你如,你想让你的网站的某个特定的链接根据页面的语言有不同的背景颜色:

:lang(en) &gt; a#flag {
	background-image: url(english.gif);
	}
 
:lang(fr) &gt; a#flag {
	background-image: url(french.gif);
	}

这个选择器将会匹配相关的链接——如果页面的语言等于“en”或“fr”,或者以“en”或“fr”开头并在后面带个连字符“-”的话。

浏览器兼容性

不幸的是,只有IE浏览器中只有IE8支持该选择器,其它的主要浏览器都支持该伪类选择器。

5. CSS 3 伪类

:target

当你使用锚点(片段标识符 fragment identifier)的时候,比如,http://www.smashingmagazine.com/2009/08/02/bauhaus-ninety-years-of-inspiration/#comments,这“#comments”就是一个片段标识符,你就可以使用:target伪类来控制目标的样式。

举个例子,比如你有一个很长的使用了很多文字和h2标题的页面,然后在页面的头部有一个对这些标题的索引。如果在点击索引内的某个链接时,相应的标题以某种方式高亮,然后滚动到相应的位置,对读者就会很有用。很简单。

h2:target {
	background: #F2EBD6;
	}
浏览器兼容性

这一次,IE浏览器完全不支持:target伪类,另一个小问题就是Opera 在使用“前进”和后退按钮时不支持该选择器。但是其它的各个主流浏览器都支持该选择器。

UI元素状态伪类

有些HTML元素有enable 或disabled 状态(比如,文本输入框)和 checked 或unchecked 状态(单选按钮和复选框)。这些状态就可以使用:enabled:disabled:checked 伪类来分别定位。

那么你就会想,如果任意一个禁用的(disabled)文本框应该使用浅灰色的背景和虚线边框:

input:disabled {
	border:1px dotted #999;
	background:#F2F2F2;
	}

你也可能会想让所有选中的复选框有个左边距(这样就可以在众多的复选框中很容易认出来):

input[type=”checkbox”]:checked {
	margin-left: 15px;
	}
浏览器兼容性

所有的主流浏览器,除了我们常常不报希望的IE系列浏览器,都支持UI元素状态伪类。如果你考虑只是添加附加级别的细节和增强网站的可用性,这个仍然是可以采用的。

6. CSS 3 结构伪类

:nth-child

:nth-child()伪类允许你定位某个父级元素的一个或多个特定的子元素.

你可以通过定义它的值为一个整数来定位某个单个子元素:

ul li:nth-child(3) {
	color: red;
	}

这将会让ul元素的第三个li元素的文字变成红色。注意如果在ul里面有个其它类型的元素(不是li),它也会算作其子元素。

你可以使用表达式来定位子元素。比如,下面的表达式将从第四个开始匹配每第三个元素。

ul li:nth-child(3n+4) {
	color: yellow;
	}

在上面的这个例子中,第一个黄色的li元素将会是第四个。如果也想从第一个开始匹配,你可以使用一个简单的表达式:

ul li:nth-child(3n) {
	color: yellow;
	}

这样的话,第一个黄色的li元素将会是第三个子元素,然后是它后面的每隔第三个。现在想象一下如果你只想匹配列表中的前四个子元素:

ul li:nth-child(-n+4) {
	color: green;
	}

:nth-child的值同样也可以被定义为“even” 或“odd”,和“2n” (第偶数个) 或“2n+1” (第奇数个)的效果是一样的。

:nth-last-child

:nth-last-child伪类基本上和:nth-child伪类的作用相同,但是它从最后一个元素开始算。

使用上面的一个例子来看看:

ul li:nth-child(-n+4) {
	color: green;
	}

不是匹配最前面的四个li元素,该选择器匹配最后面的四个元素。

你同样可以使用“even” 或“odd”只,同样与nth-child不同的是,这是从最后面的元素开始算的:

ul li:nth-last-child(odd) {
	color: grey;
	}

:nth-of-type

:nth-of-type伪类和:nth-child也很像,不同的是它只计算选择器中指定的那个元素。

这对定位元素中包含大量不同的元素的情况会很有用。比如,我们想控制一个文本块中的每隔一个段落,但是我们又想要无视其它元素比如图片和引用块:

p:nth-of-type(even) {
	color: blue;
	}

你也可以使用一些值,就像在:nth-child中使用的一样。

:nth-last-of-type

你能猜到它吧?!:nth-last-of-type 伪类可以像前面提到的:nth-last-child一样使用,但是这次,它将之匹配你在选择器中指定的元素类型:

ul li:nth-last-of-type(-n+4) {
	color: green;
	}

我们可以更加的聪明一些,在一个大的块级选择器中结合多种这样的伪类。比如我们想让文章中的所有的图片左浮动,除了第一个和最后一个(我们可以假设他们是满宽的,无须浮动):

.post img:nth-of-type(n+2):nth-last-of-type(n+2) {
	float: left;
	}

所以在这个选择器的第一部分,我们从第二个图片开始定位每一个图片。在第二部分中,我们定位所有的图片,除了最后一个。因为这两个选择器并非互斥的,我们可以同时使用它们,这样就可以一下子排除第一个和最后一个元素!

:last-child

:last-child伪类的作用类似于:first-child 伪类,但是会定位父级元素的最后一个子元素

让我们假设你不想让你的日志的div的最后一个段落也有一个底部边距:

.post &gt; p:last-child {
	margin-bottom: 0;
	}

该选择器将定位class为”post”的元素的最后一个直接子级段落。

:first-of-type 和:last-of-type

:first-of-type 伪类用于定位一个父级元素下的第一个同类子元素

比如,你可以定位某个特定的div的第一个子级段落(p),并让其第一行字母大写:

.post &gt; p:first-of-type:first-line {
	font-variant: small-caps;
	}

在这个选择器中,你可以确定你是在只定位class为”post”的元素的直接子级p元素,而且还是匹配第一个子级p元素。

:last-of-type伪类与此类似,只是匹配最后一个子元素。

:o nly-child

:o nly-child伪类表示一个元素是它的父级元素的唯一一个子元素

比如说,你有一些盒子(“news”),里面有一些文字段落,当你有多于一个段落的时候,你想让文字比只有一个段落的时候小一些:

div.news &gt; p {
	font-size: 1.2em;
	}
 
div.news &gt; p :o nly-child {
	font-size: 1.5em;
	}

第一个选择器中,我们定义”news”div的所有子级p元素的字体大小。在第二个中,我们覆盖之前的字体大小,如果该p元素是“news” div的唯一子元素的时候,它的字体大小会比较大一些。

:o nly-of-type

:o nly-of-type伪类表示一个元素是它的父级元素的唯一一个相同类型的子元素

这有用什么用?假设你有一些日志,每一篇都有个class为”post”的div,他们中的一些有多于一张图片,但是有些可能就只有一张图片。你想让后者中的图片水平居中,而在其它的有多于一张图片的日志中,就将它左浮动。这个需求用这个选择器就很容易实现:

.post &gt; img {
	float: left;
	}
 
.post &gt; img :o nly-of-type {
	float: none;
	margin: auto;
	}

:empty

:empty伪类表示一个元素里面没有任何内容

这个选择器可以用很多种用途。比如,你在你的“sidebar”中有若干个盒子,但是不想让空盒子显示出来:

#sidebar .box:empty {
	display: none;
	}

注意,就算”box”div里面只有一个空格,它也不会被css当作空标签的,这样就不能匹配该选择器了。

浏览器支持

Internet Explorer (直到8.0版本)都不支持结构伪类。Firefox、Safari 和Opera 在其最新版本的浏览器中指出这些选择器。这意味着,使用这些选择器对网站的可用性和可访问性是很有用的,或者如果网站的用户中的大部分是使用IE而且你不想在某些细节上无视他们,最好还是保持使用通用的class和简单的选择器来迎合这些选择器。否则你会被搞疯的!

7. 否定选择器

否定选择器:not(),可以让你定位不匹配该选择器的元素

比如,如果你需要定义表单元素中的input元素,但是又不想包括submit类型的input的时候会灰常有用——你想它们有不同的样式,以看起来像按钮:

input:not([type="submit"]) {
	width: 200px;
	padding: 3px;
	border: 1px solid #000000;
	}

另一个例子,你想你的日志的div中的所有段落(p)有比较大的字体,除了表示时间和日期的段落:

.post p:not(.date) {
	font-size: 13px;
	}

你可以想象这个选择器能带给你的潜力了吧,你能够从你的CSS文件中剥离(剔除)的无用的大量选择器也被它广泛支持吗?

浏览器支持

Internet Explorer在这里常常是让我们感到扫兴的东西:一点都不支持,甚至在IE8中。这大概意味着这些选择器将仍不得不等到一些开发者开始不再顾虑将它添加到他们的样式表中才会普及。

8. 伪元素

伪元素允许你操作HTML中不是真实存在的元素,比如一个文本块的第一行或者第一个字母。

伪元素在CSS 2.1中就已经存在,但是CSS 3说明书表示他们应该使用双冒号“::”,以与伪类区分开来。在CSS 2.1中,他们也是使用单个冒号“:”的。浏览器会将能够接受两种格式,除非这些伪元素只存在于CSS3中。

::first-line

::first-line伪元素将匹配block、inline-block、table-caption、table-cell等等级别元素的第一行

这对在你的文字块上添加一些微妙的排版细节相当有用,比如,将一片文章的第一行文字改成小写字母:

h1 + p::first-line {
	font-variant: small-caps;
	}

如果你专心的阅读了我们前面的内容,你将会了解到上面的语法意味着,紧紧的跟在H1标签之后(+)的段落会将其第一行文字显示为小写字母。

你也可以针对相关的div的第一行,而不用针对实际的段落标签(p):

div.post p::first-line { font-variant: small-caps; }

或者更进一步,定位某个特低的div的第一个段落的第一行:

div.post &gt; p:first-child::first-line {
	font-variant: small-caps;
	}

这里,“>”符号表示你指定的是post div的直接子级元素,这样如果段落被包括在第二级div中,它就不会匹配这个选择器。

::first-letter

::first-letter伪元素将会匹配一个文本块的第一个字母,除非在同一行里面包含一些其它元素,比如图片。

和::first-line伪类一样,::first-letter通常用于给文本元素添加排版细节,比如下沉字母或首字母。

这里是如何使用::first-letter伪元素创建首字下沉的例子:

p {
	font-size: 12px;
	}
 
p::first-letter {
	font-size: 24px;
	float: left;
	}

注意如果你在某些元素中同时使用::first-line 和::first-letter ,::first-letter 属性将覆盖从::first-line中继承下来的某些属性。

如果你不知道W3C规则的话,这个元素有时会产生意想不到的结果:它事实上是使用最长的规则的选择器!所以如果你计划使用它的话最好仔细的阅读一下 (其它选择器也一样)。

::before 和 ::after

::before和::after 伪元素用于在一个元素的前面或后面插入内容,纯CSS方法。

这些元素将继承它们将附加的元素的大部分属性。

假设你想在你的页面中的图标的描述前面添加文字“Graphic number x:”。你将无需写文字“Graphic number”,或者自己手动添加数字:

.post {
	counter-reset: image;
	}
 
p.description::before {
	content: "Figure number " counter(image) ": ";
	counter-increment: image;
	}

那么这会产生什么?

首先,我们告诉HTML来创建“image”计数器。比如我们可以添加该属性到页面的body。同样我们也可以给该计数器起任何一个名字,只要你想,只要我们常常使用同样的名字引用它:自己试试吧!

那么我们想在class为”description”的每一个段落之前添加这一块内容: “Figure number ” — 注意只有我们在引号里面写的内容才会被创建到页面中,所以我们也要添加一个空格!

然后,我们就有了counter(image):这将用到我们之前在.post选择器中定义的属性。它默认会从数字1开始。

下一个属性在那里表示计数器知道对于每一个p.description,它需要将image计数器增加1 (counter-increment: image)。

它并不像看起来的那么复杂,而且还会灰常的有用。

::before和::after伪元素常常只使用content属性,来添加一些短语或排版元素,但是这里我们展示了我们如果以一种更加强大的结合counter-reset和counter-increment属性的方式来使用它们。

有趣的是: ::first-line 和::first-letter 伪元素可以匹配使用::before伪元素生成的内容,如果存在的话。

浏览器支持

如果使用单个冒号的话(比如, :first-letter, 而不是::first-letter),这些伪元素被IE8支持(但是不被IE7或6支持)。但是左右其他的主流浏览器都支持这些选择器。

结语

乏味的讲述终于结束了,现在该你来领悟本文的要义并自己尝试了: 开始通过创建实验性的页面并测试所有的这些选择器,在有疑问的时候返回这里并确保总是遵循W3C的规则,但是请不要只是坐在那里想这些选择器尚未被完全支持你就无视它们。

如果你敢于冒险,或者你不害怕放弃之前的遍地无用和非语义化的class和id,为什么不尝试一两个这些强大的CSS选择器到你的下一个项目中呢?我们保证你不会回头的!

参考

扩展资源

关于作者

Inayaili de León 是一个葡萄牙网页设计师。她对网页设计和前端编码有特别的爱好,而且喜欢漂亮和间接的网站。她居住在伦敦。你可以在Web Designer Notebook看到她的更多文章并follow her on Twitter

0
好文啊

© 到永远,就不让你轻拳 | 行骏-IT Player | Powered by Wordpress | 备案中 |