-
CSS选择器、优先级以及匹配原理
最近在研究jQuery的选择器,大家知道jQuery的选择器和css的选择器非常相似,所以整理一下css选择器;
css1-css3提供非常丰富的选择器,但是由于某些选择器被各个浏览器支持的情况不一样,所以很多选择器在实际css开发中很少用到。
1.基础的选择器
选择器
含义
示例
*
通用元素选择器,匹配任何元素
* { margin:0; padding:0; }
E
标签选择器,匹配所有使用E标签的元素
p { font-size:2em; }
.info和E.info
class选择器,匹配所有class属性中包含info的元素
.info { background:#ff0; }
p.info { background:#ff0; }
#info和E#info
id选择器,匹配所有id属性等于footer的元素
#info { background:#ff0; }
p#info { background:#ff0; }
2.组合选择器
选择器 含义
示例
E,F
多元素选择器,同时匹配所有E元素或F元素,E和F之间用逗号分隔
Div,p { color:#f00; }
E F
后代元素选择器,匹配所有属于E元素后代的F元素,E和F之间用空格分隔
#nav li { display:inline; }
li a { font-weight:bold; }
E > F
子元素选择器,匹配所有E元素的子元素F
div > strong { color:#f00; }
E + F
毗邻元素选择器,匹配所有紧随E元素之后的同级元素F
p + p { color:#f00; }
3.CSS 2.1 属性选择器
选择器 含义
示例
E[att]
匹配所有具有att属性的E元素,不考虑它的值。(注意:E在此处可以省略,比如“[cheacked]”。以下同。)
p[title] { color:#f00; }
E[att=val]
匹配所有att属性等于“val”的E元素
div[class=”error”] { color:#f00; }
E[att~=val]
匹配所有att属性具有多个空格分隔的值、其中一个值等于“val”的E元素
td[class~=”name”] { color:#f00; }
E[att|=val]
匹配所有att属性具有多个连字号分隔(hyphen-separated)的值、其中一个值以“val”开头的E元素,主要用于lang属性,比如“en”、“en-us”、“en-gb”等等
p[lang|=en] { color:#f00; }
注:CSS 2.1 属性选择器还有一个特点就是使用多个选择器,同事满足这多个选择器:blockquote[class=quote][cite] { color:#f00; }
4.CSS 2.1 中的伪类
选择器 含义
示例
E:first-child
匹配父元素的第一个子元素
p:first-child { font-style:italic; }
input[type=text]:focus { color:#000; background:#ffe; }
input[type=text]:focus:hover { background:#fff; }
q:lang(sv) { quotes: “\201D” “\201D” “\2019″ “\2019″; }
E:link
匹配所有未被点击的链接
E:visited
匹配所有已被点击的链接
E:active
匹配鼠标已经其上按下、还没有释放的E元素
E:hover
匹配鼠标悬停其上的E元素
E:focus
匹配获得当前焦点的E元素
E:lang(c)
匹配lang属性等于c的E元素
5.CSS 2.1中的伪元素
选择器 含义
示例
E:first-line
匹配E元素的第一行
p:first-line { font-weight:bold; color;#600; }
.preamble:first-letter { font-size:1.5em; font-weight:bold; }
.cbb:before { content:””; display:block; height:17px; width:18px; background:url(top.png) no-repeat 0 0; margin:0 0 0 -18px; }
a:link:after { content: ” (” attr(href) “) “; }
E:first-letter
匹配E元素的第一个字母
E:before
在E元素之前插入生成的内容
E:after
在E元素之后插入生成的内容
6.CSS 3的同级元素通用选择器
选择器
含义
示例
E ~ F
匹配任何在E元素之后的同级F元素
p ~ ul { background:#ff0; }
7.CSS 3 属性选择器
选择器 含义
示例
E[att^=”val”]
属性att的值以”val”开头的元素
div[id^="nav"] { background:#ff0; }
E[att$=”val”]
属性att的值以”val”结尾的元素
E[att*=”val”]
属性att的值包含”val”字符串的元素
8. CSS 3中与用户界面有关的伪类
选择器 含义
示例
E:enabled
匹配表单中激活的元素
input[type="text"]:disabled { background:#ddd;}
E:disabled
匹配表单中禁用的元素
E:checked
匹配表单中被选中的radio(单选框)或checkbox(复选框)元素
E::selection
匹配用户当前选中的元素
9. CSS 3中的结构性伪类
选择器 含义
示例
E:root
匹配文档的根元素,对于HTML文档,就是HTML元素
p:nth-child(3) { color:#f00; }
p:nth-child(odd) { color:#f00; }
p:nth-child(even) { color:#f00; }
p:nth-child(3n+0) { color:#f00; }
p:nth-child(3n) { color:#f00; }
tr:nth-child(2n+11) { background:#ff0; }
tr:nth-last-child(2) { background:#ff0; }
p:last-child { background:#ff0; }
p:only-child { background:#ff0; }
p:empty { background:#ff0; }
E:nth-child(n)
匹配其父元素的第n个子元素,第一个编号为1
E:nth-last-child(n)
匹配其父元素的倒数第n个子元素,第一个编号为1
E:nth-of-type(n)
与:nth-child()作用类似,但是仅匹配使用同种标签的元素
E:nth-last-of-type(n)
与:nth-last-child() 作用类似,但是仅匹配使用同种标签的元素
E:last-child
匹配父元素的最后一个子元素,等同于:nth-last-child(1)
E:first-of-type
匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1)
E:last-of-type
匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1)
E:only-child
匹配父元素下仅有的一个子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1)
E:only-of-type
匹配父元素下使用同种标签的唯一一个子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
E:empty
匹配一个不包含任何子元素的元素,注意,文本节点也被看作子元素
10.CSS 3的反选伪类
选择器 含义
示例
E:not(s)
匹配不符合当前选择器的任何元素
:not(p) { border:1px solid #ccc; }
11. CSS 3中的 :target 伪类
选择器 含义
E:target
匹配文档中特定”id”点击后的效果
CSS选择器浏览器支持情况,其中包括最新的CSS3和Safari 4.0 Beta的支持情况。感谢Estelle Weyl的总结。注:绿色 / √ 表示目前支持。橙色/ Δ 表示浏览器部分支持当前CSS选择器。红色/ Χ 表示浏览器完全不支持。CSS选择器浏览器支持情况,其中包括最新的CSS3和Safari 4.0 Beta的支持情况。感谢Estelle Weyl的总结。
没有评论 -
windows 7 五笔输入法与QQ、IE不兼容解决办法
从03年开始使用windows 2003一直到前几天,难以置信啊。
终于这昨天转到windows 7了怀抱了,虽然暂时还不习惯,我不是一个贪新厌旧的人,不知道需要多长时间来适应。
昨晚安装了一贯使用的念青五笔输入法简体字版和繁体字版,简体版跟IE 8/9不兼容,繁体版跟QQ 2012 不兼容,有时候程序重启,有时候输入法假死,输入不了任何东西。ctrl+space一切换输入法就导致程序崩溃掉,我人也快跟着崩溃掉了。其实这个问题早两年的时候朋友买个华硕本回来的时候就已经发现了,没想到念青那家伙到现在也不解决一下,极品五笔也有同样情况。
一个简单想法的人,喜欢用纯朴的输入法,钟情于五笔,而且是王码系的五笔。所以QQ五笔,万能五笔,搜狗五笔,极点五笔都不在考虑范围内,今天无意中看到一个叫新极品五笔的,下载下来安装,开IE,开QQ/TM发现都正常使用,泪奔啊,终于可以使用了,但是新极品五笔的词库顺序跟念青的有点出入,因为都是属于标准输入法,应该词库是通用的,于是试着把词库替换成念青的,成功了。原本新极品五笔只有简体版,我再复制一份出来做了个繁体版的,同样用了念青的繁体词库。
现在只有一个小小的问题,输入法默认英文标点,还没时间去研究。
在此感谢新极品五笔作者何云峰同学,云峰工作室网址:http://www.wb98.com/
-
[原创]迅雷离线下载模拟登录
花了接近8个小时的时间,终于搞定了迅雷离线下载会员中心的模拟登录问题。
使用工具:firefox, ie & httpwatch, php
主要障碍:cookie验证,md5算法;
未完待续。。。
-
离职的这些天
-
上好最后一天的班
有好长一段时间没有写日志了,没有时间也没有心情。
每天都在忙得天昏地暗,却见不到有任何的成效。
可能是前两天喝酒喝太多了,眼珠子都红透了,别人问起,我只是苦笑着说,看得有钱有多了,眼红。
一个公司客户的需求搞3点半才搞完,天快亮了,也许还可以睡两个小时。天亮后,是在现在公司里的最后一天班。
-
[转]Redis在Windows、linux平台下的安装配置
为了方便查阅资料,特将网上搜索到的Redis相关安装配置进行归档整理:
=============================================================
window平台Redis安装下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload
Redis文件夹有以下几个文件
redis-server.exe:服务程序redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).
指定redis的配置文件,如没有指定,则使用默认设置
解压目录:\>redis-server.exe redis.confredis-cli.exe:命令行客户端,测试用
解压目录:\>redis-cli.exe -h 127.0.0.1 -p 6379
设置一个Key并获取返回的值:
$ ./redis-cli set mykey somevalue
OK
$ ./redis-cli get mykey
Somevalue如何添加值到list:
$ ./redis-cli lpush mylist firstvalue
OK
$ ./redis-cli lpush mylist secondvalue
OK
$ ./redis-cli lpush mylist thirdvalue
OK
$ ./redis-cli lrange mylist 0 -1
1. thirdvalue
2. secondvalue
3. firstvalue
$ ./redis-cli rpop mylist
firstvalue
$ ./redis-cli lrange mylist 0 -1
1. thirdvalue
2. secondvalueredis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的 ab 工具).
./redis-benchmark -n 100000 –c 50
====== SET ======
100007 requests completed in 0.88 seconds (译者注:100004 查询完成于 1.14 秒 )
50 parallel clients (译者注:50个并发客户端)
3 bytes payload (译者注:3字节有效载荷)
keep alive: 1 (译者注:保持1个连接)
58.50% <= 0 milliseconds(译者注:毫秒)
99.17% <= 1 milliseconds
99.58% <= 2 milliseconds
99.85% <= 3 milliseconds
99.90% <= 6 milliseconds
100.00% <= 9 milliseconds
114293.71 requests per second(译者注:每秒 114293.71 次查询)Windows下测试并发客户端极限为60
=============================================================
linux平台Redis安装:
wget http://code.google.com/p/redis/downloads/detail?name=redis-2.0.4.tar.gz
tar xvzf redis-2.0.4.tar.gz
cd redis-2.0.4
make
mkdir /home/redis
cp redis-server /home/redis
cp redis-benchmark /home/redis
cp redis-cli /home/redis
cp redis.conf /home/redis
cd /home/redis
启动./redis-server redis.conf
进入命令交互模式,两种:
1: ./redis-cli
2: telnet 127.0.0.1 6379 (ip接端口)
=============================================================
配置文件参数说明:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 绑定的主机地址
bind 127.0.0.1
5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
12. 指定本地数据库存放目录
dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport>
14. 当master服务设置了密码保护时,slav服务连接master的密码
masterauth <master-password>
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)appendfsync everysec
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32
25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4
27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
activerehashing yes
30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf
=============================================================
问题讨论:
1. Redis官方文档对VM的使用提出了一些建议: 当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大. 当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value. 最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件. vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
2. 关于Redis新的存储模式diskstore(http://timyang.net/data/redis-diskstore),节选:
适合Web 2.0数据访问最佳的方式就是完全基于内存,比如用Memcached或者Redis snapshot方式。但是更多的业务场景是数据规模会超过RAM容量,因此有几种不同的设计模式。
VM方式: 将数据分页存放,由应用(如Redis)或者操作系统(如Varnish)将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中。应用实现VM缺点是代码逻辑复杂,如果业务上冷热数据边界并不分明,则换入换出代价太高,系统整体性能低。不少抢鲜的网友在微博上也反馈过使用VM种种不稳定情况。操作系统实现缺点在于主要OS的VM换入换出是基于Page概念,比如OS VM1个Page是4K, 4K中只要还有一个元素即使只有1个字节被访问,这个页也不会被SWAP,换入也同样道理,读到一个字节可能会换入4K无用的内存。而Redis自己实现则可以达到控制换入的粒度。另外访问操作系统SWAP内存区域时block进程,也是导致Redis要自己实现VM原因之一。
磁盘方式: 所有的数据读写访问都是基于磁盘,由操作系统来只能的缓存访问的数据。由于现代操作系统都非常聪明,会将频繁访问的数据加入到内存中,因此应用并不需要过多特殊逻辑。MongoDB就是这种设计方式。这种方式也有一些已知的缺点,比如操作MMap写入磁盘由操作系统控制,操作系统先写哪里后写哪里应用并不知情,如果写入过程中发生了crash则数据一致性会存在问题。这个也是MongoDB饱受争议的单机Durability问题 硬盘存储+cache方式: 实际原理和mysql+memcache方式类似,只不过将两者功能合二为一到一个底层服务中,简化了调用。 在上面几种方式中,除去VM,antirez觉得MongoDB方式也不太适合,因此选择了disktore方式来实现新的磁盘存储,具体细节是
1) 读操作,使用read through以及LRU方式。内存中不存在的数据从磁盘拉取并放入内存,内存中放不下的数据采用LRU淘汰。2) 写操作,采用另外spawn一个线程单独处理,写线程通常是异步的,当然也可以把cache-flush-delay配置设成0,Redis尽量保证即时写入。但是在很多场合延迟写会有更好的性能,比如一些计数器用Redis存储,在短时间如果某个计数反复被修改,Redis只需要将最终的结果写入磁盘。这种做法作者叫per key persistence。由于写入会按key合并,因此和snapshot还是有差异,disk store并不能保证时间一致性。由于写操作是单线程,即使cache-flush-delay设成0,多个client同时写则需要排队等待,如果队列容量超过cache-max-memory,Redis设计会进入等待状态,造成调用方卡住。Google Group上有热心网友迅速完成了压力测试,当内存用完之后,set每秒处理速度从25k下降到10k再到后来几乎卡住。虽然通过增加cache-flush-delay可以提高相同key重复写入性能;通过增加cache-max-memory可以应对临时峰值写入。但是diskstore写入瓶颈最终还是在IO。
3) rdb 和新 diskstore 格式关系 rdb是传统Redis内存方式的存储格式,diskstore是另外一种格式,那两者关系如何?
1.通过BGSAVE可以随时将diskstore格式另存为rdb格式,而且rdb格式还用于Redis复制以及不同存储方式之间的中间格式。
2.通过工具可以将rdb格式转换成diskstore格式。 =============================================================
相关链接:
国内:
Redis几个认识误区
Redis新的存储模式diskstore
Redis使用系列:配置文件篇
Redis在Windows下的使用
深入Redis,读redis-from-the-ground-up有感国外:
http://code.google.com/p/redis/
http://blog.mjrusso.com/2010/10/17/redis-from-the-ground-up.html
http://antirez.com/post/redis-virtual-memory-story.html
http://code.google.com/p/redis/wiki/VirtualMemorySpecification -
雨淋沐风归来
-
天下无不散之筵席
天下之大,必有容身之所,我信。
能在一个公司里从21岁做到28岁,我以前想都不敢想的事情。
我居然坚持下来了。
能对一个女孩从23岁认识,由26岁追到28岁都不肯放弃,以前也是不敢想的事情。
因为我发觉自己有时候是三分钟热度的人,但不代表我不专一。
初定于3月15号离开一个呆了7七年的环境,真的呆了。
有些迷茫,虽然我已经知道了自己的方向。
我也需要勇气去实现,谢谢妳,给了我这样的鼓励。
-
世界末日的情人节
-
写给未来
2012-02-13,一个全新的心态去面对所有的事情,昨天红肿的眼睛已经成为过去,人最糊涂的就是不知道自己在做什么,我的前六年就是这样过了。不知道自己的方向,糊里糊涂就颓废过去了。不知道是谁说的,每一次撕心裂肺的流泪都会使一个人成长,我想这次我要成长了。虽然我的躯体已经长到中年了,思想还停留在小孩子里。
未完待续…
