浏览器内核

今天面试碰到了一个浏览器内核的问题。
当时自己懵的状态,我没有进行联想,其实现在想想应该是跟css兼容和js兼容相关的问题。
浏览器厂商不同,内核不同。
所谓的“浏览器内核”无非指的是一个浏览器最核心的部分——“Rendering Engine”,直译这个词汇叫做“渲染引擎”,不过我们也常称其为“排版引擎”、“解释引擎”。这个引擎的作用是帮助浏览器来渲染网页的内容,将页面内容和排版代码转换为用户所见的视图。

注:有时候我们所说的“浏览器内核”甚至“渲染引擎”,其实除了渲染引擎,也悄悄包含了javascript引擎,如WebKit,它由渲染引擎WebCore和javascript引擎JSCore组成。

常见的浏览器内核(或者说渲染引擎)有很多个,如Trident、Gecko、WebKit等等,不同的内核对网页编写语法的解释也有不同,进而导致同一个页面在不同内核的浏览器下显示出来的效果也会有所出入,这也是前端工程师需要让作品兼容各种浏览器的原因。

我们常常喜欢把浏览器内核与某浏览器名称直接挂钩起来,如IE内核、Chrome内核,其实是不全面的说法。比如Opera在7.0版本到12.16版本中采用的是独立研发的Presto引擎,但在后续跟随了Chrome的脚步加入了WebKit大本营,放弃了Presto;另外即使名称相同,但版本不同的引擎也可能存在较大差别。比如IE6使用的是Trident早期版本,存在许多bug,性能也较低。而最新的IE11所使用的Trident7.0版本已经可以支持WebGL(3D绘图标准)以及HTML5大部分标准。

下面按照各个主流浏览器,介绍下它们所使用的浏览器内核的历程。

Internet Explorer:
IE开发计划开始于1994年夏天,微软为抵抗当时主流的网景Netscape Navigator,要在Windows中开发适合自己的浏览器,但微软并没有时间从零开始。因此和Spyglass合作,于是IE从早期一款商业性的专利网页浏览器Spyglass Mosaic派生出来,虽然Spyglass Mosaic与NCSA Mosaic(首款应用得最广泛的网页浏览器)甚为相似,但Spyglass Mosaic则相对地较不出名并使用了NCSA Mosaic少量的源代码。

1996年,微软通过给予季度费用和部分收入从Spyglass中取得了Spyglass Mosaic的源代码和授权。从而使IE逐渐成为微软专属软件。它采用的排版引擎(俗称内核)为Trident。每一次新的IE版本发布,也标志着Trident内核版本号的提升。

下面是各Trident版本信息:

冷知识:除Trident之外,微软还有另一个网页浏览器排版引擎,称为Tasman,它是使用在「Internet Explorer for Mac」的排版引擎。相较于Trident,Tasman引擎对网页标准有较佳的支持,但微软自04年开始已经停止了Mac计算机版本的 Internet Explorer的开发。

Safari
Safari是苹果公司开发的浏览器,使用了KDE(Linux桌面系统)的KHTML作为浏览器的运算核心,Safari所用浏览器内核的名称是大名鼎鼎的WebKit。 Safari在2003年1月7日首度发行测试版,并成为Mac OS X v10.3与之后版本的默认浏览器,也成为苹果其它系列产品的指定浏览器(也已支持Windows平台)。

如上述可知,WebKit前身是KDE小组的KHTML引擎,可以说WebKit是KHTML的一个开源的分支。当年苹果在比较了Gecko和KHTML后,选择了后者来做引擎开发,是因为KHTML拥有清晰的源码结构和极快的渲染速度。

需要了解的是,虽然我们称WebKit为浏览器内核(或浏览器引擎),但不太适合直接称之为我们开头提到的Rendering Engine(渲染引擎),因为WebKit本身主要是由两个引擎构成的,一个正是渲染引擎“WebCore”,另一个则是javascript解释引擎“JSCore”,它们均是从KDE的渲染引擎KHTML及javascript解释引擎KJS衍生而来。

在2010年4月,苹果公司宣布了其浏览器引擎Webkit的最新项目 Webkit2。Webkit2的目标是实现独立进程与非阻断式API。

WebKit可以说是苹果公司给开源世界的一大贡献,基于此开源引擎,衍生了多个WebKit分支,如下面要介绍的Chrome的浏览器引擎。

Chrome / Chromium
谷歌Chrome/Chromium浏览器从08年创始至今一直使用苹果公司的WebKit作为浏览器内核原型,是WebKit的一个分支,我们可以称之为Chromium引擎(注意我们这里说的是Chromium引擎,而不是Chromium浏览器)。

这里顺便介绍下Chrome和Chromium两个浏览器的区别——Chromium浏览器是谷歌为发展自家的浏览器Chrome而开启的计划,所以Chromium相当于Chrome的工程版或称实验版(尽管Chrome自身也有β版阶段),新功能会率先在Chromium上实现,待验证后才会应用在Chrome上。Chromium一天最多可以更新十几二十个版本,实验性的新特性都会现在这里放出,但是Chromium本身其实并不稳定;而Chrome总共有四个更新分支:Canary、Dev、Beta、Stable,稳定性依次增强。

我们说回引擎。Chromium引擎虽然是属于WebKit的分支,却把WebKit的代码梳理得可读性提高很多,所以以前可能需要一天进行编译的代码,现在只要两个小时就能搞定。因此Chromium引擎和其它基于WebKit的引擎所渲染页面的效果也是有出入的。基于以上原因,有的地方会把Chromium引擎跟WebKit区分开来,有的地方则直接把Chromium引擎归为WebKit(比如维基百科),其实都有其道理。

然而在13年发布的Chrome 28.0.1469.0版本开始,Chrome放弃Chromium引擎转而使用最新的Blink引擎(基于WebKit2——苹果公司于2010年推出的新的WebKit引擎),Blink对比上一代的引擎精简了代码、改善了DOM框架,也提升了安全性。

Opera
Opera浏览器,是一款挪威Opera Software ASA公司制作的支持多页面标签式浏览的网络浏览器。是跨平台浏览器可以在Windows、Mac和Linux三个操作系统平台上运行。Opera浏览器创始于1995年4月,到2014年3月4日,官方发布的个人电脑用的最新版本为Opera20。

Opera的一个里程碑作品是Opera7.0,因为它使用了Opera Software自主开发的Presto渲染引擎,取代了旧版Opera 4至6版本使用的Elektra排版引擎。

Presto加入了动态功能,例如网页或其部分可随着DOM及Script语法的事件而重新排版。Presto在推出后不断有更新版本推出,使不少错误得以修正,以及阅读Javascript效能得以最佳化,并成为当时速度最快的引擎。

然而为了减少研发成本,Opera在2013年2月宣布放弃Presto,转而跟随Chrome使用WebKit分支的Chromium引擎作为自家浏览器核心引擎。

在Chrome与2013年推出Blink引擎(也是基于WebKit的分支)之后,Opera也紧跟其脚步表示将转而使用Blink作为浏览器核心引擎。

Firefox
Mozilla Firefox是一个开源网页浏览器,原名是Firebird,2004年2月9日,Mozilla Firebird决定改称Mozilla Firefox。Firefox浏览器使用的是Gecko内核,其发展历程如下:

1997年,网景收购了DigitalStyle。当时,网景浏览器在各方面的表现已经比不上她的主要竞争对手Internet Explorer。网景开始研发下一代的排版引擎,并期望把新的排版引擎应用于下一版本的网景浏览器上。

1998年初,Mozilla计划开始执行。这个新的排版引擎名为Raptor,以开发源码的方式发放于互联网上。后来,因为商标问题,Raptor改名为NGLayout(即next generation layout之意)。而最后NGLayout就被网景重新命名为Gecko。

2003年7月15日时代华纳解散了网景公司,大部分开发者被解雇。Mozilla基金会亦在当天成立,继续推动着Gecko的发展。时至今天,Gecko仍继续由Mozilla的雇员和义工所维护和发展。

最后还是再谈谈javascript引擎(后面统称JS引擎)这东西。我们上述的渲染引擎主要是负责HTML、CSS以及其他一些东西的渲染,而JS引擎则主要负责对javascript的渲染,一个JS引擎的好坏决定了一个浏览器对脚本的加载和执行速度,也影响了其跑分。

下方列出各种主流浏览器各自的JS引擎,了解下即可:

Firefox:
SpiderMonkey:第一款JavaScript引擎,由Brendan Eich在Netscape Communications时编写,用于Mozilla Firefox 1.0~3.0版本。

Rhino:由Mozilla基金会管理,开放源代码,完全以Java编写。

TraceMonkey:基于实时编译的引擎,其中部份代码取自Tamarin引擎,用于Mozilla Firefox 3.5~3.6版本。

JaegerMonkey:德文Jäger原意为猎人,结合追踪和组合码技术大幅提高性能,部分技术借凿了V8、JavaScriptCore、WebKit:用于Mozilla Firefox 4.0以上版本。

IonMonkey:可以对JavaScript编译后的结果进行优化,用于Mozilla Firefox 18.0以上版本。

OdinMonkey:可以对asm.js进行优化,用于Mozilla Firefox 22.0以上版本。

Chrome:
V8:开源,由Google丹麦开发,是Google Chrome的一部分。

注:我们上面提到Chrome是基于WebKit的分支,而WebKit又由渲染引擎“WebCore”和JS解释引擎“JSCore”组成,可能会让你搞不清V8和JSCore的关系。你可以这样理解——WebKit是一块主板,JSCore是一块可拆卸的内存条,谷歌实际上认为Webkit中的JSCore不够好,才自己搞了一个V8 JS引擎,这就是Chrome比Safari在某些JS测试中效率更高的原因。

IE:
Chakra:中文译名为查克拉,用于Internet Explorer 9的32位版本及IE10+。

Opera:
Linear A:用于Opera 4.0~6.1版本。

Linear B:用于Opera 7.0~9.2版本。

Futhark:用于Opera 9.5~10.2版本。

Carakan:由Opera软件公司编写,自Opera10.50版本开始使用。

其它:
KJS:KDE的ECMAScript/JavaScript引擎,最初由Harri Porten开发,用于KDE项目的Konqueror网页浏览器中。

Narcissus:开放源代码,由Brendan Eich编写(他也参与编写了第一个SpiderMonkey)。

Tamarin:由Adobe Labs编写,Flash Player 9所使用的引擎。

Nitro(原名SquirrelFish):为Safari 4编写。

避免被洗脑

今天打开oppo的测试机,一如既往的首页推荐好多好多新闻。以前当成乐子看,现在觉得既浪费时间又洗脑自己。
上面有一篇报道,什么千万富翁冒雨排队购房排队离婚之类,太过搞笑,
因为这个报道的就是我刚好出差每天上班经过的地方,深圳南山大冲华润城三期工程,这报道写的简直就是为了博人眼球,一派胡言。让我以为不是我每天经过的地方,而且还强调下雨和排队。我的天哪
因为不下雨,面对买所好房子,也会有很多人排队还不如下雨排队,为什么?!因为,在深圳这个季节六月份的天气,每天至少一场雨。下雨排队总比顶着大太阳40度高温要强得多。对于南方人来说下雨就跟正常的工作日是一样的。根本没有什么下雨冒雨前行是多么大惊小怪的事情。6月的夏季下雨是多么的正常事情啊,尤其是对于深圳来说。
你想买好房排队不是正常的吗?
你就是,想买个好水果去水果摊都要排队付款啊。
简直不明白媒体的脑回路,渲染成房价多么多高,有钱人是多么多。简直脑残。所以有些手机浏览器,整天放一些耸人听闻的新闻。还是比较Safari清晰干爽啊。现在好像是骂房价是正统,导致哪个媒体提到房价就要骂一骂才觉得正常。这样的话,你看看就好,你要是真信了,可就真买不上房子了。

力的三要素

ceshicehciehi
3123123
力的三要素

力的作用点

力的大小

力的方向

力的三要素是力对物体的作用效果取决于力的大小、方向与作用点。 

学一门技艺的同理

投入技艺课程时间的多少、学习的课程是一门还是两门的作用点、学习课程的方向是否正确

 

嘿,我不知道你们在看《北京女子图鉴》是怎么了?不要侮辱北漂的女子了

我很奇怪,这两天有人在讲《北京女子图鉴》,关注的微信公众号竟然也有好多在讲这个电影,让我觉得卧槽 我们有那么辛苦吗?还是说辛苦而不自知?

前几天有个男同事吃饭的时候聊天说我觉得《北京女子图鉴》挺真实的,挺辛苦,推荐你去看看。我说噢,还是偶尔看看小说和自己计划看的书籍。

有一位大姨家的姐姐,研究生博士在北师大毕业,回老家济南教书。我一直以为她在北京,昨天才知道她已经回济南教书了。我看了她的朋友圈,在3月份的时候还在找北京广安门附近的房子,最近的一条信息是讲备课的时候,肠胃疼很折磨。聊天两次,每次都会问我在北京习惯吗?生活的适应吗?

这让我很深思,我生活在有空调的房子,我办公在有空调的房子。这有什么辛苦?

当然我刚来北京的时候租的床位20几个人在几个房间,也有刚开始还没有找到工作投奔了老乡,住的大兴平房,有一次我们曾经四个女孩挤过一张大床,幸好当时是冬天,挤挤很暖和。去年她和内蒙的老公攒钱在北京郊区买了房结婚,我们其他三个人去当伴娘,提到这个事情跟她讲的时候,她竟然说忘记了不记得了。我也知道是真的忘记了,因为有很多事情我自己也都忘记了。只有老家的老同学说你在北京真辛苦啊,也不安稳。太辛苦了,也压力太大了,你赶紧回老家,不然找不到对象了。我可以说自己一脸大写的懵逼吗?!

跟大学宿舍没有什么区别,或者好多了,有空调有洗衣机有冰箱有热水器洗澡方便做饭方便就是有的时候需要排队。但是当时公司也在路对面的崇文门新世界大楼。那时候无所畏惧,然后也认识了美食家宏兰,今年年初她已经在国外学过潜水了,照片很棒。然后发展后续我们一起租房子,有了自己的空间。

当然我遇到过被总监骂得跑到厕所哭,哭完继续回来改图。但是那是在济南的时候,我来到北京还没有这样被骂过。因为每个人都不敢确认周围的人是什么来头,她是普渡大学留学的 他是百度跳槽的,他是北大研究生的,,,因为你遇到每个人都有你不知道的背景,大家都文明以待。

也有我们四个女生(我们的队伍越来越壮大)租住在自建房筒子楼,为了用一个好的大立柜,我们从一个东边的房间拖动到楼梯西边的另一个房间。倾斜着小心翼翼的过去,也有搬家为了省钱,我们几个女生一点一点用双肩包把行李运到新租住的房子里。

后来四个女生租了三室一厅,感觉自己好幸福。终于有我们自己的私人空间。我们办了公园年票去颐和园,去天坛去玉渊潭,去北海公园,然后到了13年跨年夜14年的时候我们集体去世贸天阶看跨年倒计时,全北京一起向上看的最大LED屏幕。然后步行长安街去看14年的升旗仪式,我们等了一个通宵,然后兴冲冲的看完升旗仪式听完仪仗队演奏和放飞的鸽子,体力有剩余的我又看了毛主席的遗体。然后大家当当当的坐地铁回家。竟然集体睡过了头。傻逼了一次,感觉也很畅快!总之我们觉得自己既傻逼又开心!

在北京我也遇到过,黑中介房东,花臂外露,大金链子,威胁要打我们,别说退押金了。我们去找警察,说我们是民事松松要找法院,然后我第一次参加法庭,看到法官和记事员。感觉很新奇,最后私了,也要回了我们的押金。

现在租住在自如家,有自如管家有电子锁有保洁人员两周去打扫厨房和卫生间的卫生,洗衣机进行紫外线消毒。啊 我这不是打广告,我只是说这样的房子对于我这种死宅的女子太友好了。然后最近计划买个小房子,发现13的时候比较任性,断交了社保,只能继续等待明年2019年了.

在北京从来没有觉得自己苦,因为你都拼尽全力生活了,怎么还有时间考虑苦不苦的事情。14年公司刚进了第一个手机端的App的项目,只有仨人负责,一个前端开发是我一个后台设计是康平还有一我们的项目经理澳洲留学生楠老大,天天加班,老大还会开着车送我们到地铁。我当时每次都是赶着13号线最后一班车,到龙泽站刚好12:08. 但是也不觉得辛苦,每天每天走路一万步。当然我不是说我觉得不辛苦,你们就会觉得不辛苦。我只是表达下我作为北京北漂的女子的一种方式。因为每天学到新的东西每天还眼睛放亮的知道自己在做什么,还想着未来去国外怎样怎样。

我觉得现在条件好多了,你可以租美好的房子有人帮你做保洁,你可以省出来更多的时间做自己喜欢做的事情,写写小说,旅游,尤其是看看北京巨大的资源建设,比如国图、国博、首博等等。就像当年,南昌海昏侯墓被挖出来展览的时候,首先就到了首都博物馆。我的天,看看那些马蹄金 麟趾金等等。毕竟事实这是举全国之力建设的。然后你在这里发展五年就可以买房子。大城市更公平,也更轻松,对于我这种家境太穷的人来讲,北京是美好的。上大学办贷款勤工助学的时候是比较艰难的。因为那时候有着太过敏感脆弱的心,看着同学能坐在包间吃饭,我要端菜过去,无论冷热,更煎熬的是当时的心理状况吧。而现在我的心已经成长,脚踏实地的让自己一步一步的前进,而不是自怨自艾,比较他人了。

真不想这种电影损坏我们的形象,玷污我们的努力。

待续。。

不要侮辱北漂的女子了。

反正,每一个来北京的都在享受这里。只有没来北京的认为这里是地狱。你以后看到谁对你说,不要去大城市,大城市压力大。那么你就知道这个人不想让你发达!你就可以挥起拳头打他一顿!因为大城市的机会更多,人才更多,相互融合的观念也更多。如果你不趁着年轻来一趟大城市,你自己的一生说是要超脱世人,求稳定,那就是太可笑了。历经千帆过后才是超脱世人,你现在仅仅是逃避和懦弱而已。我是一个俗人,仅此而已。

因为一无所有,才会无所畏惧。

有的时候要遵守一个城市的规则,有的时候要自己清楚规则。打破规则会付出怎样的代价,自己是否付得起。好多事情都是如此啊,明白了后的才不会后悔,也不会回头看。

现在这些事情就不用总是回头看了,向前走吧~ step by step~

贯古今于须臾,抚四海于一瞬

贯古今于须臾,抚四海于一瞬

 -西晋 陆机《文赋》

今天读到这句,感觉就像是武侠高手发大招一掌定局的感觉,幻影如风,飘逸似仙,气定神闲的一击。

然后又让我想到了苏东坡的

寄蜉蝣于天地,渺沧海之一粟,哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。

-北宋 苏东坡《前赤壁赋》

 

公众号与小程序的区别

 

作者:微动天下
链接:https://www.zhihu.com/question/53845035/answer/153364018
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1、定位不同(公众号服务于营销与信息传递,小程序面向产品与服务)

公众号主要用于信息的传递实现人与信息的连接,借助H5 能够实现简单的交互,主要以营销和信息传递为主简单的服务为辅,而小程序从功能上与公众号有严格区分(不支持关注、消息推送等营销手段),一方面使得产品与服务不至于淹没在公众号营销信息中,另一方支持公众号、朋友圈、群与小程序之间的互动与导流,使得开发者专心做产品与服务,从而为微信带来大量长尾服务叠加微信自身重度服务打造从社交到信息连接再到服务的生态圈。

2、实现技术区别(公众号基于H5,小程序基于微信自身开发环境与开发语言)

小程序是微信内的云端应用(所以无需安装),不是原生App,通过WebSocket 双向通信(保证无需刷新即时通信)、本地缓存(图片与UI 本地缓存降低与服务器交互延时)以及微信底层技术优化实现了接近原生APP 的体验。

公众号是基于传统H5 开发与运行,传统H5 运行环境是浏览器,微信小程序运行环境并非完整的浏览器,开发过程中用到H5 相关的技术,微信小程序的运行环境是微信基于浏览器内核完全重构的一个内置解析器,针对小程序专门做了优化,配合自己定义的开发语言标准(基于H5 进行了优化),提升了小程序的性能。系统权限方面,微信小程序能够通过微信APP 获得更多的系统权限,比如网络通信状态、数据缓存能力等,在此微信APP 相当于架在原有系统中的新的操作系统,小程序借助微信与系统间接交互,使得能够拥有原生APP 的体验。而这一点恰巧是HTML5 web 应用的不足,导致其主要用于业务逻辑与交互简单的应用中。

3、功能不同(公众号功能围绕信息展示与营销,小程序面向产品与服务)

微信与公众号在开发语言、设计规范、营销方式、审核机制等功能方面均有较大不同。公众号是一种账号类型,为用户提供信息与咨询发布平台,提供了一种新的信息传播方式,构建与读者之间更好的沟通与管理模式,结合H5以后公众号也能够提供一些简单交互功能。小程序主要旨在提供服务,相比公众号运行更流畅,能够提供更加复杂的产品与服务。公众号功能主要围绕信息传递与营销展开,小程序对营销功能进行了严格控制以与公众号区别,使得小程序的服务在使用体验与便捷性能够得到提升,不至于淹没在公众号过度营销信息中。

4、体验上的差别(公众号操作延时较大,小程序体验接近原生App)

公众号中点击应用功能后顶部出现绿色进度需要等一段时间,对于业务逻辑复杂交互要求高的应用使用起来体验较差。而小程序将会非常流畅几乎无需等待,类似普通APP 操作一样流畅。主要原因是公众号没有本地缓存,所以每次打开都是会请求服务器刷新页面,造成延时较长体验下降,小程序对UI 与图片本地缓存,只需要对服务器请求交互数据,页面切换无需刷新,所以体验能够接近原生APP 的流畅程度。

 

长尾关键词

长尾关键词(Long Tail Keyword)是指网站上的非目标关键词但与目标关键词相关的也可以带来搜索流量的组合型关键词
长尾关键词的特征是比较长,往往是2-3个词组成,甚至是短语,存在于内容页面,除了内容页的标题,还存在于内容中。 搜索量非常少,并且不稳定。 长尾关键词带来的客户,转化为网站产品客户的概率比目标关键词高很多,因为长尾词的目的性更强。 存在大量长尾关键词的大中型网站,其带来的总流量非常大。例如,目标关键词是服装,其长尾关键词可以是男士服装、冬装、户外运动装等。长尾关键词基本属性是:可延伸性,针对性强,范围广。长尾关键词是长尾理论在关键词研究上的延伸。“长尾”具有两个特点:细和长。细,说明长尾是份额很少的市场,在以前这是不被重视的市场;长,说明这些市场虽小,但数量众多。众多的微小市场累积起来就会占据市场中可观的份额——这就是长尾的思想。

总结伪类与伪元素

熟悉前端的人都会听过css的伪类与伪元素,然而大多数的人都会将这两者混淆。本文从解析伪类与伪元素的含义出发,区分这两者的区别,并且列出大部分伪类与伪元素的具体用法,即使你有用过伪类与伪元素,但里面总有一两个你没见过的吧。

1.伪类与伪元素

先说一说为什么css要引入伪元素和伪类,以下是css2.1 Selectors章节中对伪类与伪元素的描述

CSS introduces the concepts of pseudo-elements and pseudo-classes  to permit formatting based on information that lies outside the document tree.

 

直译过来就是:css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或者是列表中的第一个元素。下面分别对伪类和伪元素进行解释:

伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:hover来描述这个元素的状态。虽然它和普通的css类相似,可以为已有的元素添加样式,但是它只有处于dom树无法描述的状态下才能为元素添加样式,所以将其称为伪类。

伪元素用于创建一些不在文档树中的元素,并为其添加样式。比如说,我们可以通过:before来在一个元素前增加一些文本,并为这些文本添加样式。虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。

 

2.伪类与伪元素的区别

这里通过两个例子来说明两者的区别。

下面是一个简单的html列表片段:

如果想要给第一项添加样式,可以在为第一个<li>添加一个类,并在该类中定义对应样式:

HTML:

CSS:

如果不用添加类的方法,我们可以通过给设置第一个<li>的:first-child伪类来为其添加样式。这个时候,被修饰的<li>元素依然处于文档树中。

HTML:

CSS:

下面是另一个简单的html段落片段:

如果想要给该段落的第一个字母添加样式,可以在第一个字母中包裹一个<span>元素,并设置该span元素的样式:

HTML:

CSS:

如果不创建一个<span>元素,我们可以通过设置<p>的:first-letter伪元素来为其添加样式。这个时候,看起来好像是创建了一个虚拟的<span>元素并添加了样式,但实际上文档树中并不存在这个<span>元素。

HTML:

CSS:

 

从上述例子中可以看出,伪类的操作对象是文档树中已有的元素,而伪元素则创建了一个文档数外的元素。因此,伪类与伪元素的区别在于:有没有创建一个文档树之外的元素。

 

3.伪元素是使用单冒号还是双冒号?

CSS3规范中的要求使用双冒号(::)表示伪元素,以此来区分伪元素和伪类,比如::before和::after等伪元素使用双冒号(::),:hover和:active等伪类使用单冒号(:)。除了一些低于IE8版本的浏览器外,大部分浏览器都支持伪元素的双冒号(::)表示方法。

然而,除了少部分伪元素,如::backdrop必须使用双冒号,大部分伪元素都支持单冒号和双冒号的写法,比如::after,写成:after也可以正确运行。

对于伪元素是使用单冒号还是双冒号的问题,w3c标准中的描述如下:

Please note that the new CSS3 way of writing pseudo-elements is to use a double colon, eg a::after { … }, to set them apart from pseudo-classes. You may see this sometimes in CSS. CSS3 however also still allows for single colon pseudo-elements, for the sake of backwards compatibility, and we would advise that you stick with this syntax for the time being.

大概的意思就是:虽然CSS3标准要求伪元素使用双冒号的写法,但也依然支持单冒号的写法。为了向后兼容,我们建议你在目前还是使用单冒号的写法。

实际上,伪元素使用单冒号还是双冒号很难说得清谁对谁错,你可以按照个人的喜好来选择某一种写法。

 

4.伪类与伪元素的具体用法

这一章以含义解析和例子的方式列出大部分的伪类和伪元素的具体用法。下面是根据用途分类的伪类总结图和根据冒号分类的伪元素总结图:

伪类

伪元素

某些伪类或伪元素仍然处于试验阶段,在使用前建议先在Can I Use等网站查一查其浏览器兼容性。处于试验阶段的伪类或伪元素会在标题中标注。

 

伪类

状态

由于状态伪类的用法大家都十分熟悉,这里就不用例子说明了。

1 :link

选择未访问的链接

2 :visited

选择已访问的链接

3 :hover

选择鼠标指针浮动在其上的元素

4 :active

选择活动的链接

5 :focus

选择获取焦点的输入字段

 

结构化

1 :not

一个否定伪类,用于匹配不符合参数选择器的元素。

如下例,除了第一个<li>元素外,其他<li>元素的文本都会变为橙色。

HTML:

CSS:

2 :first-child

匹配元素的第一个子元素。

如下例,第一个<li>元素的文本会变为橙色。

HTML:

CSS:

3 : last-child

匹配元素的最后一个子元素。

如下例,最后一个<li>元素的文本会变为橙色。

HTML:

CSS:

4 first-of-type

匹配属于其父元素的首个特定类型的子元素的每个元素。

如下例,第一个<li>元素和第一个<span>元素的文本会变为橙色。

HTML:

CSS:

5 :last-of-type

匹配元素的最后一个子元素。

如下例,最后一个<li>元素的文本会变为橙色。

HTML:

CSS:

6 :nth-child

:nth-child根据元素的位置匹配一个或者多个元素,它接受一个an+b形式的参数,an+b匹配到的元素示例如下:

  • 1n+0,或n,匹配每一个子元素。
  • 2n+0,或2n,匹配位置为2、4、6、8…的子元素,该表达式与关键字even等价。
  • 2n+1匹配位置为1、3、5、7…的子元素、该表达式与关键字odd等价。
  • 3n+4匹配位置为4、7、10、13…的子元素。

如下例,有以下HTML列表:

CSS:

选择第二个元素,”Beta”会变成橙色:

选择位置序号是2的倍数的元素,”Beta”, “Delta”, “Zeta”, “kappa”会变成橙色:

选择位置序号为偶数的元素:

选择从第6个开始,位置序号是2的倍数的元素,”Zeta”, “Theta”, “Kappa”会变成橙色:

7 :nth-last-child

:nth-last-child与:nth-child相似,不同之处在于它是从最后一个子元素开始计数的。

8 :nth-of-type

:nth-of-type与nth-child相似,不同之处在于它是只匹配特定类型的元素。

如下例,第二个<p>元素会变为橙色。

HTML:

CSS:

9 :nth-last-type

:nth-last-of-type与nth-of-type相似,不同之处在于它是从最后一个子元素开始计数的。

10 :only-child

当元素是其父元素中唯一一个子元素时,:only-child匹配该元素。

HTML:

CSS:

11 :only-of-type

当元素是其父元素中唯一一个特定类型的子元素时,:only-child匹配该元素。

如下例,第一个ul元素只有一个li类型的元素,该li元素的文本会变为橙色。

HTML:

CSS:

12 :target

当URL带有锚名称,指向文档内某个具体的元素时,:target匹配该元素。

如下例,url中的target命中id值为target的article元素,article元素的背景会变为黄色。

URL:

http://example.com/#target

HTML:

CSS:

表单相关

1 :checked

:checked匹配被选中的input元素,这个input元素包括radio和checkbox。

如下例,当复选框被选中时,与其相邻的<label>元素的背景会变成黄色。

HTML:

CSS:

2 :default

:default匹配默认选中的元素,例如:提交按钮总是表单的默认按钮。

如下例,只有提交按钮的背景变成了黄色。

HTML:

CSS:

3 :disabled

:disabled匹配禁用的表单元素。

如下例,被禁用input输入框的透明度会变成50%。

HTML:

CSS:

4 :empty

:empty匹配没有子元素的元素。如果元素中含有文本节点、HTML元素或者一个空格,则:empty不能匹配这个元素。

如下例,:empty能匹配的元素会变为黄色。

第一个元素中有文本节点,所以其背景不会变成黄色;

第二个元素中有一个空格,有空格则该元素不为空,所以其背景不会变成黄色;

第三个元素中没有任何内容,所以其背景会变成黄色;

第四个元素中只有一个注释,此时该元素是空的,所以其背景会变成黄色;

HTML:

CSS:

5 :enabled

:enabled匹配没有设置disabled属性的表单元素。

6 :in-range

:in-range匹配在指定区域内元素。

如下例,当数字选择器的数字在5到10是,数字选择器的边框会设为绿色。

HTML:

CSS:

7 :out-of-range

:out-of-range与:in-range相反,它匹配不在指定区域内的元素。

8 :indeterminate

indeterminate的英文意思是“不确定的”。当某组中的单选框或复选框还没有选取状态时,:indeterminate匹配该组中所有的单选框或复选框。

如下例,当下面的一组单选框没有一个处于被选中时,与input相邻的label元素的背景会被设为橙色。

HTML:

CSS:

9 :valid

:valid匹配条件验证正确的表单元素。

如下例,当email输入框内的值符合email格式时,输入框的边框会被设为绿色。

HTML:

CSS:

10 :invalid

:invalid与:valid相反,匹配条件验证错误的表单元素。

11 :optional

:optional匹配是具有optional属性的表单元素。当表单元素没有设置为required时,即为optional属性。

如下例,第一个input的背景不会被设为黄色,第二个input的背景会被设为黄色。

HTML:

CSS:

12 :required

:required与:optional相反匹配设置了required属性的表单元素。

13 :read-only

:read-only匹配设置了只读属性的元素,表单元素可以通过设置“readonly”属性来定义元素只读。

如下例,input元素的背景会被设为黄色。

HTML:

CSS:

14 :read-write

:read-write匹配处于编辑状态的元素。input,textarea和设置了contenteditable的HTML元素获取焦点时即处于编辑状态。

如下例,input输入框和富文本框获取焦点时,背景变成黄色。

HTML:

CSS:

15 :scope(处于试验阶段)

:scope匹配处于style作用域下的元素。当style没有设置scope属性时,style内的样式会对整个html起作用。

如下例,第二个section中的元素的文本会变为斜体。

HTML:

注:目前支持这个伪类的浏览器只有火狐。

语言相关

1 :dir(处于实验阶段)

:dir匹配指定阅读方向的元素,当HTML元素中设置了dir属性时该伪类才能生效。现时支持的阅读方向有两种:ltr(从左往右)和rtl(从右往左)。目前,只有火狐浏览器支持:dir伪类,并在火狐浏览器中使用时需要添加前缀( -moz-dir() )。

如下例,p元素中的阿拉伯语(阿拉伯语是从右往左阅读的)文本会变成橙色。

HTML:

CSS:

如下例,p元素中的英语文本会变成蓝色

HTML:

CSS:

2 :lang

:lang匹配设置了特定语言的元素,设置特定语言可以通过为了HTML元素设置lang=””属性,设置meta元素的charset=””属性,或者是在http头部上设置语言属性。

实际上,lang=””属性不只可以在html标签上设置,也可以在其他的元素上设置。

如下例,分别给不同的语言设置不同的引用样式:

HTML:

CSS:

其他

1 :root

:root匹配文档的根元素。一般的html文件的根元素是html元素,而SVG或XML文件的根元素则可能是其他元素。

如下例,将html元素的背景设置为橙色

2.:fullscreen

:fullscreen匹配处于全屏模式下的元素。全屏模式不是通过按F11来打开的全屏模式,而是通过Javascript的Fullscreen API来打开的,不同的浏览器有不同的Fullscreen API。目前,:fullscreen需要添加前缀才能使用。

如下例,当处于全屏模式时,h1元素的背景会变成橙色

HTML:

JAVASCRIPT:

CSS:

 

伪元素

1 ::before/:before

:before在被选元素前插入内容。需要使用content属性来指定要插入的内容。被插入的内容实际上不在文档树中。

HTML:

CSS:

2 ::after/:after

:after在被元素后插入内容,其用法和特性与:before相似。

3 ::first-letter/:first-letter

:first-letter匹配元素中文本的首字母。被修饰的首字母不在文档树中。

CSS:

4 ::first-line/:first-line

:first-line匹配元素中第一行的文本。这个伪元素只能用在块元素中,不能用在内联元素中。

CSS:

5 ::selection

::selection匹配用户被用户选中或者处于高亮状态的部分。在火狐浏览器使用时需要添加-moz前缀。该伪元素只支持双冒号的形式。

CSS:

6 ::placeholder

::placeholder匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效。

该伪元素不是CSS的标准,它的实现可能在将来会有所改变,所以要决定使用时必须谨慎。

在一些浏览器中(IE10和Firefox18及其以下版本)会使用单冒号的形式。

HTML:

CSS:

7 ::backdrop(处于试验阶段)

::backdrop用于改变全屏模式下的背景颜色,全屏模式的默认颜色为黑色。该伪元素只支持双冒号的形式

HTML:

CSS:

参考文章

1. An Ultimate Guide To CSS Pseudo-Classes And Pseudo-Elements

2. CSS伪类与CSS伪元素的区别及由来

原创文章转载请注明:

转载自AlloyTeam:http://www.alloyteam.com/2016/05/summary-of-pseudo-classes-and-pseudo-elements/