實(shí)話說(shuō),在過(guò)去這一年,這已經(jīng)成為我好心情的固定來(lái)源。即不斷地告訴一波波想要像在 TeX、Microsoft Word 等常見的文檔處理工具中那樣方便地控制 HTML 文檔的樣式的人們說(shuō)——安全帶系好,受傷別怪我:“很不好意思,你完蛋了!” —— 馬克·安德森 1994年
在1991年,蒂姆·伯納斯·李首次提出 HTML 的時(shí)候,并沒(méi)有給頁(yè)面添加樣式的方法。給定的 HTML 該如何渲染決定于瀏覽器本身,常常還受到用戶偏好輸入的影響。然而,這看起來(lái)確實(shí)是一個(gè)不錯(cuò)的想法,為網(wǎng)頁(yè)創(chuàng)建標(biāo)準(zhǔn),用戶可以提供“建議”該以什么樣的風(fēng)格渲染頁(yè)面。
但要知道五年后才有 CSS,十年后 CSS 才獲得全面的實(shí)現(xiàn)。因此這是一個(gè)群雄逐鹿的時(shí)代,很多多熱心的工作和變革,產(chǎn)生了多個(gè)互相競(jìng)爭(zhēng)的樣式方案,看上去很有可能成為標(biāo)準(zhǔn)。
盡管這些語(yǔ)言在今天并沒(méi)有用起來(lái),但是我發(fā)現(xiàn)思考彼時(shí)的未來(lái)會(huì)變成什么樣子真的很有奇妙。更讓人驚訝的是,碰巧這些可能成為 CSS 的語(yǔ)言包含的一些特性正是如今開發(fā)者希望出現(xiàn)在 CSS 中的。
第一個(gè)提案
1993年年初,Mosaic 還沒(méi)有發(fā)布 1.0,當(dāng)時(shí)其他已有的瀏覽器還在搞怎么處理 HTML。并沒(méi)有什么方法可以來(lái)給 HTML 添加樣式。總之就是,<h1>的樣式完全取決于瀏覽器。
在這年的6月,Robert Raisch 在www-talk的郵件列表中給出了一個(gè)提案,創(chuàng)建了“一個(gè)解析容易與 Web 文檔一起發(fā)布的樣式信息的格式”,賜名 RRP。
@BODY fo(fa=he,si=18)
看不懂這段代碼也很正常。在沒(méi)有 gzip,網(wǎng)絡(luò)傳輸速度只有 14.4k 的時(shí)代,盡力壓縮新格式的大小是非常合理的。這段規(guī)則的實(shí)際上是設(shè)置字體(font family -> fa)為helvetica(he),字號(hào)(font size -> si)為 18 像素。
這個(gè)提案缺少一個(gè)有意思的東西就是單位,所有數(shù)字對(duì)應(yīng)的單位決定于他們使用的上下文(例如字體的大小都是以像素為單位的)。這可以說(shuō)明 RRP 設(shè)計(jì)的目的是作為“一系列指導(dǎo)渲染的指示或者建議的集合”,而不是作為標(biāo)準(zhǔn)。這是值得考慮的,因?yàn)橥环輼邮奖肀仨氃?common line mode 瀏覽器和圖形瀏覽器(例如 [Lynx](https://en.wikipedia.org/wiki/Lynx_(web_browser))都能正常工作,后一種瀏覽器變得越來(lái)越流行。
有趣的是,RRP 包含設(shè)置列布局的方式,這個(gè)特性直到2011年才引入到 CSS 中。例如,3列每列80單位就是下面這樣子:
@P co(nu=3,wi=80)
這解析起來(lái)有點(diǎn)困難,但應(yīng)該沒(méi)有white-space: nowrap難。
值得一提的是,RRP 并不支持如今所用的“層疊”樣式表。一個(gè)文檔同一時(shí)刻只能激活一個(gè)樣式表,這從邏輯上來(lái)說(shuō)是合理的,但是今天看來(lái)就有點(diǎn)奇怪了。
馬克·安德森(一個(gè)曾經(jīng)最流行的瀏覽器 Mosaic 的創(chuàng)造者)知道 RRP 提案,但是并沒(méi)有在 Mosaic 中實(shí)現(xiàn)它。Mosaic 很快(同時(shí)也是遺憾地)就采用了通過(guò) HTML 來(lái)定義樣式的方案,引入像<FONT>和<CENTER>這樣的標(biāo)簽。
Viola 以及原始瀏覽器之戰(zhàn)
現(xiàn)在臺(tái)面上已經(jīng)有多個(gè)樣式表的提案,為什么你不選其中一個(gè)實(shí)現(xiàn)之?只要正確地實(shí)現(xiàn)了問(wèn)題就將得到解決。
因此,我必須告訴大家,“好了,你需要學(xué)習(xí)這種語(yǔ)言來(lái)撰寫你的文檔,然后學(xué)習(xí)另外種語(yǔ)言來(lái)來(lái)把你的文檔定義成你想要的樣子。”噢,他們會(huì)喜歡這樣的。 —— 馬克·安德森 1994
反直覺的是,Mosaic 并不是第一個(gè)圖形化的瀏覽器。ViolaWWW 要比它還早,Pei-Yuan Wei 起初花了四天時(shí)間寫出的圖形化的瀏覽器。
Pei-Yuan Wei 創(chuàng)建了一個(gè)樣式表語(yǔ)言,支持某種嵌套式的結(jié)構(gòu),這已經(jīng)被我們用在了今天的 CSS 之中:
(BODY fontSize=normal BGColor=white FGColor=black (H1 fontSize=largest BGColor=red FGColor=white) )
在上例中,為 body 設(shè)置顏色,并給出現(xiàn)在 body 中的 h1 設(shè)置樣式。PWP 并沒(méi)有采用重復(fù)的選擇器來(lái)表示層級(jí),而是使用圓括號(hào)系統(tǒng)。這讓我聯(lián)想到了想 Stylus 和 SASS 使用的縮進(jìn)系統(tǒng),如今這在某些 CSS 開發(fā)者中很流行。從這方面來(lái)講,PWP 的語(yǔ)法比 CSS 更好,不過(guò)后者已經(jīng)成為了 Web 的通用語(yǔ)言。
值得一提的是 PWP 還是引用外部樣式表方法的提出者,到今天也一直在用:
<LINK REL="STYLE" HREF="URL_to_a_stylesheet">
遺憾的是,ViolaWWW 只能在 X Window System 下工作,后者只在 Unix 系統(tǒng)上受歡迎。當(dāng) Mosaic 移植到到 Windows 后,Viola 就消失不見了。
Web 之前的樣式表
只有計(jì)算機(jī)科學(xué)家才能接受 HTML 這種東西。它確實(shí)可以表達(dá)一個(gè)文檔的內(nèi)在結(jié)構(gòu),但一個(gè)文檔不只包含文本數(shù)據(jù)的結(jié)構(gòu)。它們需要有視覺的沖擊力。HTML 完全抹殺了文檔設(shè)計(jì)者本應(yīng)該有的視覺創(chuàng)造力。—— Roy Smith 1993
實(shí)時(shí)上,對(duì)定義文檔樣式語(yǔ)言的需求早在互聯(lián)網(wǎng)出現(xiàn)之前就有了。
你要知道 HTML 也是基于一種互聯(lián)網(wǎng)之前就存在的語(yǔ)言 SGML 制定的。早在1987年,美國(guó)國(guó)防部就決定調(diào)研 SGML 是否可以簡(jiǎn)化文檔的存儲(chǔ)和傳輸,他們有大量的文檔需要處理。與其他好的政府項(xiàng)目一樣,沒(méi)有時(shí)間浪費(fèi)在起一個(gè)好聽的名字上。這個(gè)小組名字一開始叫做 Computer-Aided Logistics Support(計(jì)算機(jī)輔助后勤支持),后來(lái)更名為 Computer-aided Acquisition and Logistics Support(計(jì)算機(jī)輔助采集和后勤支持),最后是 Continuous Acquisition and Life-cycle Support(持續(xù)采辦與全壽命支持計(jì)劃)。總之首字母縮寫就是 CALS。
CALS 團(tuán)隊(duì)創(chuàng)造了一門語(yǔ)言來(lái)定義 SGML 文檔的樣式,名為 FOSI,毫無(wú)疑問(wèn)也是某四個(gè)單詞的縮寫。他們發(fā)布了一份語(yǔ)言規(guī)范,盡管全面,但理解不能。
互聯(lián)網(wǎng)一個(gè)不變的鐵律就是:在你能證明某人錯(cuò)誤之前必須做更多的事情。1993年,在 Pei-Yuan 給出提案的第四天,Steven Heaney 提出使用 FOSI 一個(gè)變體來(lái)定義 Web 的樣式,他并沒(méi)有“重新發(fā)明輪子”。
FOSI 文檔直接就用 SGML 寫成,這對(duì)于熟悉 SGML 變體 HTML 的 Web 開發(fā)者來(lái)說(shuō)有一種邏輯上的轉(zhuǎn)換。文檔示例:
<outspec> <docdesc> <charlist> <font size="12pt" bckcol="white" fontcol="black"> </charlist> </docdesc> <e-i-c gi="h1">\<font size="24pt" bckcol="red", fontcol="white"\></e-i-c> <e-i-c gi="h2">\<font size="20pt" bckcol="red", fgcol="white"\></e-i-c> <e-i-c gi="a"><font fgcol="red"></e-i-c> <e-i-c gi="cmd kbd screen listing example"><font style="monoser"></e-i-c> </outspec>
你搞不清楚docdesc和charlist是什么意思對(duì)吧?www-talk成員也搞不清楚。唯一可以給出上下文信息的只有e-i-c,即“element in context”。FOSI 值得傲嬌的是引入了 em 作為字體的單位,現(xiàn)在已經(jīng)作為熟悉 CSS 的開發(fā)者的首選方式。
語(yǔ)言之間的戰(zhàn)爭(zhēng)就如語(yǔ)言本身一樣古老。當(dāng)時(shí)正值“lisp-style”函數(shù)式語(yǔ)言與申明式語(yǔ)言的戰(zhàn)爭(zhēng)。Pei-Yuan 把自己的語(yǔ)法描述為是“LISP式的”,但這只是時(shí)間的問(wèn)題,LISP 真正的變種語(yǔ)言馬上就要出現(xiàn)了。
圖靈完備的樣式表
受累于復(fù)雜性,F(xiàn)OSI 被看做是解決文檔格式問(wèn)題的臨時(shí)過(guò)度方案。長(zhǎng)遠(yuǎn)的方案是基于函數(shù)式語(yǔ)言 Scheme 創(chuàng)建一門新的語(yǔ)言,基于強(qiáng)大的能力,能對(duì)文檔進(jìn)行任何你可以想到的轉(zhuǎn)換。這門語(yǔ)言叫做 DSSSL。用貢獻(xiàn)者 Jon Bosak 的話來(lái)講:
把 DSSSL 和腳本語(yǔ)言放在一起是一種錯(cuò)誤。沒(méi)錯(cuò),DSSSL 是圖靈完備的,它確實(shí)是一枚編程語(yǔ)言。但是腳本語(yǔ)言(至少我是這么叫的)是程序化的;DSSSL 則完全不一樣。它完全就是函數(shù)式的,完全沒(méi)有副作用。在 DSSSL 樣式表沒(méi)有任何影響,樣式表是一個(gè)巨大的函數(shù),它的價(jià)值是一個(gè)抽象的,與設(shè)備無(wú)關(guān)的,非過(guò)程化的,對(duì)文檔格式的描述,作為一種規(guī)范(也可稱其為申明)送到顯示區(qū)域逐級(jí)渲染過(guò)程中。
得益于它的簡(jiǎn)潔,DSSSL 實(shí)際上是一種很容易理解的樣式語(yǔ)言:
(element H1 (make paragraph font-size: 14pt font-weight: 'bold))
同時(shí)作為編程語(yǔ)言,你甚至可以定義函數(shù):
(define (create-heading heading-font-size) (make paragraph font-size: heading-font-size font-weight: 'bold)) (element h1 (create-heading 24pt)) (element h2 (create-heading 18pt))
還可以在樣式中使用計(jì)算,比如定義一個(gè)黑白相間的表格:
(element TR (if (= (modulo (child-number) 2) 0) … ;even-row …)) ;odd-row
最后還有讓你嫉妒心爆棚的特性,DSSSL 甚至可以把繼承的屬性值作為變量,在上面進(jìn)行計(jì)算。
(element H1 (make paragraph font-size: (+ 4pt (inherited-font-size))))
不幸的是,DSSSL 同時(shí)具備了所有 Scheme 類語(yǔ)言的致命弱點(diǎn):括號(hào)太多了。更糟糕的是,規(guī)范最終發(fā)布時(shí),認(rèn)為其太過(guò)復(fù)雜的聲音不絕于耳,這讓瀏覽器開發(fā)者感到膽怯。DSSSL 標(biāo)準(zhǔn)包含了超過(guò)210項(xiàng)獨(dú)立的樣式屬性。
這個(gè)團(tuán)隊(duì)繼續(xù)創(chuàng)建了 XSL,用來(lái)定義文檔的轉(zhuǎn)化,雖然依然讓人困惑,但是確實(shí)更流行一些。
為什么樣式表達(dá)到了終點(diǎn)
CSS 并沒(méi)有包含父選擇符(一種用來(lái)定義包含特定子節(jié)點(diǎn)的節(jié)點(diǎn)樣式定義方法)。這個(gè)問(wèn)題在 Stack Overflow 上頻繁地被問(wèn)道,但事實(shí)證明這個(gè)特性的缺失事出有因。尤其在互聯(lián)網(wǎng)的早期,有一個(gè)重要的觀點(diǎn)被普遍認(rèn)可,在文檔被完全加載之前,頁(yè)面必須是可渲染的。換句話說(shuō),大家希望在構(gòu)成頁(yè)面底部的 HTML 全部加載完成之前,就可以渲染頁(yè)面起始的 HTML。
一個(gè)父選擇器意味著隨著 HTML 文檔的加載樣式可能會(huì)有變化。像 DSSSL 這樣的語(yǔ)言,如果被完全實(shí)現(xiàn),因?yàn)樗鼈冏约嚎梢圆僮魑臋n,所以在開始渲染時(shí),頁(yè)面很可能是不可用的。
第一個(gè)貢獻(xiàn)者 Bert Bos,在1995年3月提出了這個(gè)問(wèn)題,并給出了一個(gè)工作良好的語(yǔ)言,他的提議中包含了“smiley”表情 :-) 的一個(gè)早期版本。
這枚語(yǔ)言一定程度上來(lái)說(shuō)是“面向?qū)ο蟮?rdquo;:
*LI.prebreak: 0.5 *LI.postbreak: 0.5 *OL.LI.label: 1 *OL*OL.LI.label: A
使用.來(lái)指定直接子節(jié)點(diǎn),使用*來(lái)指定祖先節(jié)點(diǎn)。
他的語(yǔ)言里還有很酷的屬性,可以在樣式表中定義像超鏈接這樣的特性:
*A.anchor: !HREF
在上例中,把超鏈接的HREF屬性設(shè)置為它的目的地址。像這種可以在樣式表中控制元素的行為的想法在多個(gè)提案中非常流行。在還沒(méi)有 JavaScript 出現(xiàn)的日子里,并沒(méi)有什么可以控制元素的方法,因此這些新的提案看上去是合理的。
其中一個(gè)函數(shù)式的提案,也同樣包含類似的行為。這個(gè)提案由名為 C.M. Sperberg-McQueen 的紳士提出:
(style a (block #f) ; format as inline phrase (color blue) ; in blue if you’ve got it (click (follow (attval 'href))) ; and on click, follow url
他的語(yǔ)言同時(shí)還引入了content關(guān)鍵字,提供了一種在樣式表中控制 HTML 元素內(nèi)容的方法。在 CSS 2.1 中也引入了這個(gè)概念。
最大的可能
在我開講 CSS 語(yǔ)言前身之前,還有另外一個(gè)語(yǔ)言值得一提,全都是因?yàn)樗鼜哪撤N程度上來(lái)說(shuō),是早期 Web 開發(fā)者夢(mèng)寐以求的東西。
它就是 PSL96,按照當(dāng)年的命名約定,1996年版的“Presentation Specification Language”,從核心上看,PSL 與 CSS 很像。
H1 { fontSize: 20; }
而且它馬上變得更有趣了。例如,你不但可以基于元素所設(shè)置的尺寸(Width)來(lái)設(shè)置其位置,也可以基于瀏覽器渲染后的真實(shí)尺寸(Actual Width):
LI { VertPos: Top = LeftSib . Actual Bottom; }
注意你甚至可以使用元素的左鄰右舍作為約束條件。
你還可以在樣式中使用邏輯表達(dá)式。例如,只對(duì)有href屬性的超鏈接應(yīng)用樣式:
A { if (getAttribute(self, "href") != "") then fgColor = "blue"; underlineNumber = 1; endif }
這種樣式可以擴(kuò)展實(shí)現(xiàn)全部今天我們用樣式類做的事情。
LI { if (ChildNum(Self) == round(NumChildren(Parent) / 2 + 1)) then VertPos: Top = Parent.Top; HorizPos: Left = LeftSib.Left + Self.Width; else VertPos: Top = LeftSib.Actual Bottom; HorizPos: Left = LeftSib.Left; endif }
支持如此的功能或許真的可以實(shí)現(xiàn)完美拆分內(nèi)容和樣式的代碼。遺憾的是這門語(yǔ)言讓人望而生畏,畢竟太易于擴(kuò)展了。這意味著對(duì)于不同的瀏覽器很可能實(shí)現(xiàn)會(huì)很不一樣。而且,它以學(xué)術(shù)界中的數(shù)篇論文發(fā)表出現(xiàn),并沒(méi)有 www-talk 郵件列表上進(jìn)行研討,要知道大部分的工作都是在這郵件列表里確定的。因此這門語(yǔ)言并沒(méi)有被集成到主流的瀏覽器中。
CSS 的元魂
有一門語(yǔ)言,直接引出了 CSS,至少?gòu)拿稚鲜沁@樣,它的名字是 CHSS(Cascading HTML Style Sheets),于1994年由 Håkon W Lie 提出。
與很多優(yōu)秀的點(diǎn)子一樣,這個(gè)提案的原始版本看上很瘋狂。
h1.font.size = 24pt 100% h2.font.size = 20pt 40%
注意在行尾的百分比,表示當(dāng)前這個(gè)樣式表對(duì)這個(gè)值有多大的權(quán)重。例如,如果之前的樣式表定義h2的字體大小為30pt,有60%的權(quán)重,而加上這個(gè)樣式表h2 20px的40%,根據(jù)權(quán)重將這兩個(gè)值合到一起大概就是26pt。
在基于文檔的 HTML 頁(yè)面的年代里,可以想象該提案的結(jié)果了,畢竟妥協(xié)的設(shè)計(jì)是沒(méi)法在我們面向應(yīng)用的世界里工作的。不過(guò),它已經(jīng)具備了最根基的思想——樣式表是可以疊加的。換句話說(shuō),在它的眼里同一個(gè)頁(yè)面可以同時(shí)應(yīng)用多個(gè)樣式表。
這初步的構(gòu)想被認(rèn)為是很重要的,是因?yàn)闉橛脩籼峁┝艘环N可以控制文檔展現(xiàn)的方法。頁(yè)面自己有一個(gè)樣式表,Web 用戶也可能有自己的樣式表,這兩個(gè)樣式表一起影響頁(yè)面的渲染。支持多個(gè)樣式表被看做是維護(hù)了 Web 的個(gè)人自由,并不是提供的一種方式給開發(fā)者(他們?nèi)匀皇止さ鼐帉憜为?dú)的 HTML)。
用戶可以控制給到頁(yè)面作者建議樣式多少權(quán)重,就如提案中的一個(gè) ASCII 圖表表示的那樣:
User Author Font o——x———————o 64% Color o-x—————————o 90% Margin o——————x———o 37% Volume o————x—————o 50%
和其他提案相似的,它所包含的一些特性并沒(méi)有帶到 CSS 中,至少十多年來(lái)都沒(méi)有。例如,這個(gè)提案中允許基于用戶的環(huán)境編寫表達(dá)式:
AGE \> 3d ? background.color = pale\_yellow : background.color = white DISPLAY\_HEIGHT \> 30cm ? http://NYT.com/style : http://LeMonde.fr/style
如未來(lái)科幻描述的那樣,瀏覽器很可能知道內(nèi)容的中的哪些部分與你更相關(guān),于是可以針對(duì)你顯示更大的字體:
RELEVANCE \> 80 ? h1.font.size \*= 1.5
接下來(lái)就是你所知的 CSS
Microsoft 對(duì)開源標(biāo)準(zhǔn)的貢獻(xiàn)是絕對(duì)的,尤其是在互聯(lián)網(wǎng)領(lǐng)域。—— John Ludeman 1994
Håkon Lie 簡(jiǎn)化他的提案,并與 Bert Bos 合作,在1996年11月發(fā)布了 CSS 規(guī)范的第一版。最終他把 CSS 的誕生寫入到了自己的博士論文中,也就是這個(gè)文檔幫助我寫下了這篇文章。
與其他提案相比,CSS 最值的一提的就是它的簡(jiǎn)單。它易于解析、編寫和閱讀。這種例子在互聯(lián)網(wǎng)的歷史里屢見不鮮。最終取勝的技術(shù)是那些初學(xué)者容易入門的,而不是那些給專家用的。
這波變革具有很大的偶然性,CSS 就可以作為一個(gè)活生生的例子。例如,只有上下文選擇器(body ol li)得以支持,因?yàn)?Netscape 已經(jīng)有方法可以移除超鏈接內(nèi)圖片的邊框,而且看上去實(shí)現(xiàn)有所主流瀏覽器的功能更重要些。這個(gè)功能本身就大大拖延了 CSS 的實(shí)現(xiàn),畢竟那個(gè)時(shí)候大部分瀏覽器在解析 HTML 的時(shí)候都不會(huì)把 tag 保存成一個(gè)棧。因此解析器需要重新設(shè)計(jì)才能完整的支持 CSS。
有如此的挑戰(zhàn)(外加非標(biāo)準(zhǔn)標(biāo)簽定義樣式被大量使用)導(dǎo)致1997年以前 CSS 都沒(méi)法用。直到2000年3月才有瀏覽器完整支持它。每個(gè)工程師都會(huì)告訴你,直到最近幾年瀏覽器的實(shí)現(xiàn)才真正與標(biāo)準(zhǔn)保持一致,這里 CSS 首次發(fā)布已經(jīng)過(guò)去超過(guò)15年。
終極大 Boss
如果 Netscape 4 忽略在 <body> 上的 CSS 規(guī)則,然后在每個(gè)結(jié)構(gòu)化的元素之前添加隨機(jī)數(shù)量的空格;如果 IE4 正確處理了 <body>,但 padding 上卻全是問(wèn)題。那寫什么樣的 CSS 才是安全的?有的開發(fā)者直接選擇完全不用 CSS,還有的可能就為 IE4 寫一個(gè)樣式表,再為 Netscape 4 寫一個(gè),以彌補(bǔ)后者犯的錯(cuò)。 — Jeffrey Zeldman
Internet Explorer 3 以發(fā)布時(shí)帶著對(duì) CSS 的支持(有可能有點(diǎn)糟糕)而聞名遐邇。為了與之競(jìng)爭(zhēng),網(wǎng)景公司決定 Netscape 4 也應(yīng)該支持這門語(yǔ)言。與其把寶壓在第三方語(yǔ)言上,考慮到 HTML 和 JavaScript,決定實(shí)現(xiàn)方案應(yīng)該是將 CSS 轉(zhuǎn)化為 JavaScript 執(zhí)行。而且,確定 Web 開發(fā)者也可以訪問(wèn)這個(gè)“JavaScript 樣式表“中間語(yǔ)言。
語(yǔ)法直接使用 JavaScript,然后增加一些樣式相關(guān)的 API:
tags.H1.color = "blue"; tags.p.fontSize = "14pt"; with (tags.H3) { color = "green"; } classes.punk.all.color = "#00FF00" ids.z098y.letterSpacing = "0.3em"
你甚至可以定義函數(shù),每次解析到對(duì)應(yīng)的標(biāo)簽時(shí)就會(huì)執(zhí)行一次該函數(shù):
evaluate\_style() { if (color == "red"){ fontStyle = "italic"; } else { fontWeight = "bold"; } } tag.UL.apply = evaluate\_style();
我們應(yīng)該簡(jiǎn)化樣式和腳本之間的分界線無(wú)疑是合理的,在如今的 React 社區(qū)這種觀點(diǎn)又開始復(fù)現(xiàn)了。
當(dāng)時(shí),JavaScript 自己雖然是一門比較新的語(yǔ)言,但通過(guò)一些反向工程,Internet Explorer 已經(jīng)在 IE3 中以 JScript 的方式支持它了。更大的問(wèn)題在于社區(qū)已經(jīng)團(tuán)結(jié)在 CSS 周圍了,而且,彼時(shí)的 Netscape 已經(jīng)被標(biāo)準(zhǔn)社區(qū)視作小霸王,當(dāng)它向標(biāo)準(zhǔn)委員會(huì)提交 JSSS 時(shí),委員會(huì)充耳不聞。三年后,Netscape 6 也放棄了對(duì) JSSS 的支持,而且自己也差不多要安樂(lè)死了。
最大的可能
鑒于 W3C 引起的一些輿論壓力,2000年 Internet Explorer 5.5 發(fā)布,幾乎完全支持 CSS1。當(dāng)然,如大家所知,瀏覽器 CSS 的實(shí)現(xiàn) Bug 無(wú)限多,十年以來(lái)都很難用。今天現(xiàn)狀已經(jīng)有了戲劇性的改善,真正實(shí)現(xiàn)了開發(fā)者的夢(mèng)想,編寫一次代碼,有信心代碼可以在瀏覽器之間一樣地工作。
看了這么多,我個(gè)人的結(jié)論就是,無(wú)論這些決定是武斷還是有理有據(jù)的,都決定著我們目前的工具是什么樣子的。如果 CSS 當(dāng)時(shí)的設(shè)計(jì)只是為了滿足1996年的需求,那可以肯定的是,20年后的今天我們做事情的方式至少是有些不一樣的。
原文:https://eager.io/blog/the-languages-which-almost-were-css/
掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料
- 本文固定鏈接: http://www.wangchenghua.com/post/5256/
- 轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載必須在正文中標(biāo)注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費(fèi)視頻資料