成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

CSS語(yǔ)義思維

hqman / 2656人閱讀

摘要:除了其本身的語(yǔ)法規(guī)則,我們必須自我約束,引入語(yǔ)義規(guī)則,不僅僅是為了提高可讀性這樣的理由,而是拉近人與機(jī)器的距離,讓我們?cè)谒季S上更加和代碼契合,這樣才能寫(xiě)出優(yōu)秀的程序。

前一陣子在項(xiàng)目組中講了一個(gè)關(guān)于CSS的Session,在講之前我曾收到了許多意見(jiàn),大部分是希望能講講CSS實(shí)用性的技術(shù),比如盒模型,CSS3之類的。干貨人人都喜歡,因?yàn)榭吹靡?jiàn)摸得著,拿來(lái)就有用,但我最后還是決定講一些”濕貨“。因?yàn)樵贑ode Diff的時(shí)候我發(fā)現(xiàn)了許多樣式的問(wèn)題不是由于不會(huì)寫(xiě)CSS導(dǎo)致的,而是由于在錯(cuò)誤的地方使用了寫(xiě)在錯(cuò)誤地方的樣式。

其實(shí)CSS很簡(jiǎn)單,沒(méi)有計(jì)算沒(méi)有流程,只是一直描述,無(wú)論什么復(fù)雜的效果,你只要Google一下就知道怎么寫(xiě)了,甚至可以直接copy。但CSS又很復(fù)雜,一個(gè)元素的表現(xiàn)會(huì)受到它旁邊的兄弟元素,也會(huì)受到內(nèi)部的子元素影響,還會(huì)受到父元素影響,在這種多重影響下,一個(gè)元素的顯示邏輯會(huì)變得錯(cuò)綜復(fù)雜。有沒(méi)有面對(duì)塌陷的塊級(jí)元素而束手無(wú)策?無(wú)論怎么改它的屬性就是得不到自己想要的,但看看似乎一模一樣的示例程序卻安然無(wú)恙,是不是恨得咬牙切齒?我想這就是本文所要解決的主要問(wèn)題,讓你學(xué)會(huì)如何優(yōu)雅的寫(xiě)CSS。

涇渭分明 - 明確書(shū)寫(xiě)意圖和表現(xiàn)語(yǔ)義

其實(shí)我們只要稍微接觸過(guò)CSS,一定都學(xué)過(guò)盒模型,我假設(shè)你已經(jīng)對(duì)margin、padding和border已經(jīng)很熟悉。好了,我們經(jīng)常會(huì)遇到一種情況,想讓父元素和子元素之間有一些空間,比如布局的時(shí)候,container和content之間的留白。一般來(lái)說(shuō)有兩種方式,一種是給父元素加padding內(nèi)邊距,另一種是給子元素加margin外邊距?,F(xiàn)在想想,你是否慎重考慮過(guò)用哪一種方式?你是否明白兩者的區(qū)別?如果你從未考慮過(guò)這些,現(xiàn)在考慮也不遲,這真的很重要,如果你真的想優(yōu)雅的運(yùn)用CSS,而不是被它耍的團(tuán)團(tuán)轉(zhuǎn),如果你真的想把CSS寫(xiě)出規(guī)模,那你就要認(rèn)真的思考這里面的邏輯。

先說(shuō)說(shuō)父元素的container加上padding的方式,子元素的背景將不會(huì)延伸到空白區(qū)域,另一種給子元素加margin的方式則反之。但我想先拋下這個(gè)表象,看看此時(shí)加上padding的父元素的邏輯。它意味著,我創(chuàng)建了一個(gè)容器,并且該容器的內(nèi)部有一些區(qū)域是被看不見(jiàn)的東西填充的,無(wú)論放入什么都不應(yīng)該占據(jù)這個(gè)區(qū)域。在你的腦海中想象一個(gè)厚厚的玻璃瓶,它就好像是在說(shuō)“雖然我是透明的,但是在這厚厚的玻璃之內(nèi)才是你應(yīng)該呆的地方,無(wú)論是什么只要你想放在瓶子里”?,F(xiàn)在來(lái)看看子元素,是的,其背景也應(yīng)該并且確實(shí)在內(nèi)部,而不該占據(jù)那段空白的區(qū)域。如果是為子元素加上margin,這意味著我在容器中創(chuàng)建了某個(gè)東西,而這個(gè)東西有一個(gè)自己的地盤(pán),容器內(nèi)的其他東西都不能進(jìn)入這里。

所以他們的本質(zhì)區(qū)別在于其所表達(dá)的意義,也就是語(yǔ)義,一個(gè)是容器上的語(yǔ)義,另一個(gè)是容器內(nèi)元素的語(yǔ)義,主語(yǔ)也不同,謂語(yǔ)意義也不同。那么這能說(shuō)明什么呢,不得不提一下高級(jí)語(yǔ)言中的高級(jí),這代表某個(gè)語(yǔ)言將機(jī)器語(yǔ)言封裝的更好,接口更接近自然語(yǔ)言,其強(qiáng)大不言而喻。其實(shí)編程語(yǔ)言的發(fā)展軌跡就是不斷把機(jī)器語(yǔ)言往自然語(yǔ)言翻譯,讓人們可以更容易的跟機(jī)器溝通,終極目標(biāo)自然是人工智能,和機(jī)器用自然語(yǔ)言自由溝通。所以雖然代碼或者說(shuō)CSS的語(yǔ)法并沒(méi)有什么變化,但我們應(yīng)該在思維上清楚的區(qū)分代碼片段的意圖和語(yǔ)義來(lái)寫(xiě)CSS。

語(yǔ)言學(xué)家喬姆斯基曾構(gòu)造過(guò)一句符合語(yǔ)法的話:

  

“Colorless green ideas sleep furiously”

意思是無(wú)色的綠色想法憤怒的睡覺(jué)。想法睡覺(jué)是違反常識(shí)的,無(wú)色的綠色是矛盾的,憤怒的睡覺(jué)是不合常理的。僅僅符合語(yǔ)法是不夠的,僅僅不報(bào)錯(cuò)也是不夠的,尤其是CSS這種描述性的語(yǔ)言很少會(huì)報(bào)錯(cuò),所以我想說(shuō)的是,其描述性質(zhì)讓我們有更多選擇來(lái)實(shí)現(xiàn)我們所期望的效果,但我們卻應(yīng)該慎重,要讓語(yǔ)義分明,而不是在有限的語(yǔ)法規(guī)則下任意妄為,那樣寫(xiě)不出好的CSS代碼。除了其本身的語(yǔ)法規(guī)則,我們必須自我約束,引入語(yǔ)義規(guī)則,不僅僅是為了提高可讀性這樣的理由,而是拉近人與機(jī)器的距離,讓我們?cè)谒季S上更加和代碼契合,這樣才能寫(xiě)出優(yōu)秀的程序。

言歸正傳,究竟如何語(yǔ)義化CSS呢。之前有講過(guò)OOCSS,其實(shí)面向?qū)ο蟮乃枷刖褪且环N語(yǔ)義化,將虛擬的元素看作實(shí)際的對(duì)象,用常識(shí)來(lái)構(gòu)造代碼,就像是用戶體驗(yàn)中的用戶習(xí)慣一樣,這是一種遍及全人類的用戶習(xí)慣,讓代碼更友好,即所謂的優(yōu)雅。

比如最常見(jiàn)的布局,我們一般都會(huì)有header、body和footer,這樣無(wú)需任何說(shuō)明和規(guī)則,誰(shuí)都會(huì)理解,header在前,footer在后,中間是body。有趣的是table中的thead、tbody和tfoot,由于加載優(yōu)化,我們即使把tfoot放在tbody前面,讓其先加載,但顯示的時(shí)候tfoot仍然會(huì)在tbody下面,由此可見(jiàn)語(yǔ)義化的重要,否則你一定會(huì)以為不是W3C的人弄錯(cuò)了標(biāo)準(zhǔn),就是瀏覽器廠商搞出了Bug。雖然這是HTML標(biāo)簽不是CSS,但我覺(jué)得這個(gè)例子很恰當(dāng)?shù)恼f(shuō)明了一點(diǎn),顯示邏輯是獨(dú)立的,不應(yīng)該和其他邏輯混為一談,它應(yīng)該只關(guān)心如何顯示。

再比如,一個(gè)導(dǎo)航條一般分為左右兩邊,里面各有若干鏈接。你會(huì)如何命名?navbar-left和navbar-right是Bootstrap所使用的class,但當(dāng)寬度減少,Responsive響應(yīng)式的Bootstrap會(huì)讓這些鏈接都收進(jìn)下拉菜單中,左和右又從何談起呢?同樣是Bootstrap中的顏色命名就做的十分成熟,不是green、blue、red這些詞匯,而是success、primary、warning這些詞,它們的區(qū)別是表現(xiàn)化與語(yǔ)義化的區(qū)別,我喜歡把這個(gè)叫做顯示邏輯。也就是說(shuō)在class層面我們應(yīng)該只關(guān)注元素(或者說(shuō)對(duì)象)是用來(lái)做什么的(意圖)以及它應(yīng)該表示什么(語(yǔ)義)。這里三種顏色代表成功、重要和警告,至于我們是用綠、藍(lán)和紅來(lái)表示還是通過(guò)其他什么顏色甚至形狀,應(yīng)該在style層面寫(xiě)CSS屬性表示。如此我們使用class時(shí)無(wú)需迷茫于表示成功應(yīng)該用綠色還是紅色,意圖明確無(wú)誤。回到導(dǎo)航欄的例子,我們應(yīng)該使用main和sub之類的詞語(yǔ)標(biāo)識(shí)導(dǎo)航欄中重要的和次要的鏈接,即使在某些實(shí)現(xiàn)下,主要和次要沒(méi)有區(qū)別也不用擔(dān)心,那是該實(shí)現(xiàn)的顯示邏輯,我們不應(yīng)該橫加干涉。

狡兔三窟 - 善用class與style多對(duì)多的復(fù)雜關(guān)系

說(shuō)到class和style(樣式屬性),這又是一段混亂不清的關(guān)系。其實(shí)每當(dāng)我們要實(shí)現(xiàn)一個(gè)樣式,自覺(jué)或不自覺(jué)的都會(huì)考慮,是將元素和class一一對(duì)應(yīng),然后為元素上的class寫(xiě)style,還是用class和幾條style對(duì)應(yīng)之后在元素上搭配組合。前者的好處是每個(gè)class中的style不會(huì)影響其他class,但可用性十分的低,極端點(diǎn)說(shuō)這已經(jīng)不算是在編程了,而是在畫(huà)頁(yè)面;后者的好處可以靈活使用不同的樣式搭配給元素使用,組合出元素需要的效果,但很難維護(hù),牽一發(fā)動(dòng)全身,樣式很難測(cè)試,無(wú)法保證在你動(dòng)了一條style之后,沒(méi)有影響其他的地方。甚至最要命的是大部分CSS代碼都是無(wú)意識(shí)的游走在這兩種情況之間,所以我們要做的不是選擇一種極端,而是找到一個(gè)平衡點(diǎn),并使用一些方法使得我們的CSS既能靈活復(fù)用在各種元素上,又能易于維護(hù),不致修了這破壞那的情況。

分組

首先,對(duì)于一個(gè)或一套元素的樣式,我們應(yīng)該有自己的創(chuàng)建原則,而不是想到哪寫(xiě)到哪。比如,我一般使用這樣的步驟來(lái)創(chuàng)建元素:

1. 結(jié)構(gòu)

首先僅關(guān)注結(jié)構(gòu)布局,以站點(diǎn)整體為基準(zhǔn),將元素抽象為一個(gè)或多個(gè)結(jié)構(gòu)。

比如制作一個(gè)按鈕,你也許會(huì)發(fā)現(xiàn)它的尺寸和導(dǎo)航上的鏈接一致,而內(nèi)外邊距以及display和overflow之類的屬性又和頁(yè)面容器一樣,這時(shí)你就可以把按鈕的結(jié)構(gòu)拆成兩個(gè)結(jié)構(gòu),一個(gè)是尺寸,一個(gè)是邊界邏輯,這種情況時(shí)常發(fā)生,所以有的CSS理論認(rèn)為應(yīng)該把width和height這對(duì)尺寸屬性和padding以及margin這對(duì)邊距屬性徹底的分開(kāi)也是這個(gè)道理。其實(shí)并不是說(shuō)它們4個(gè)放一起就決定不行,只是一般它們都有各自復(fù)用的價(jià)值,所以常常被拆開(kāi)使用,歸根揭底這是由顯示邏輯決定的。

2. 皮膚

一般由于設(shè)計(jì)統(tǒng)一性,我們可以借助設(shè)計(jì)指導(dǎo),輕松的制作出標(biāo)準(zhǔn)皮膚。但要注意的是,皮膚指的不僅僅甚至不一定是顏色之類的。繼續(xù)用Bootstrap舉例,有5種基礎(chǔ)顏色,但這并不是皮膚,5種顏色的語(yǔ)義不同,它們只是默認(rèn)用了5種顏色,勉強(qiáng)可以看作默認(rèn)皮膚,而真正的皮膚是theme,讓按鈕變得有立體感。還有一個(gè)誤區(qū)就是認(rèn)為哪幾種屬性是皮膚,哪幾種不是。就像前面所說(shuō)的,我們要在語(yǔ)義上進(jìn)行劃分。一個(gè)屬性在某些意圖下可能是結(jié)構(gòu),在另外的意圖中可能是皮膚。

舉個(gè)極端的例子,在一個(gè)Workshop中我用CSS和HTML制作了左邊這樣的Logo,Logo本身應(yīng)該完全算是皮膚,因?yàn)橐话銇?lái)說(shuō)就是一張圖片,所以制作它的所有CSS屬性都應(yīng)該算作皮膚。下面的CSS代碼中,無(wú)論是定位還是文字的處理,以及尺寸等,都是為了構(gòu)造Logo,所以這些屬性都是皮膚。

css#logo i, #logo b {
  position: relative;
}
#logo i {
  left: -30px;
  transform: rotate(-30deg);
  font-size: 60px;
  letter-spacing: -11px;
  opacity: 0.3;
}
#logo b {
  top: -43px;
  left: 40px;
  font-size: 68px;
  word-break: break-all;
  width: 3px;
  line-height: 10px;
  text-indent: 6px;
}
3. 狀態(tài)

除了結(jié)構(gòu)和皮膚,其實(shí)還有一類很容易被人忽視的樣式,即使是設(shè)計(jì)人員也經(jīng)常忘了它,那就是狀態(tài)。最常見(jiàn)的是hover,鼠標(biāo)觸碰元素與否的狀態(tài),以及active,當(dāng)前選中的標(biāo)簽,當(dāng)前所在的分頁(yè)等等。通常人們會(huì)把它劃分到皮膚中,但你要明白我們劃分的依據(jù)是意圖,很顯然,狀態(tài)不是皮膚,僅僅是通常為表達(dá)某些狀態(tài)時(shí)會(huì)使用一些顏色,畢竟顏色是最好的表示方法。它還與各種邏輯有著千絲萬(wàn)縷的聯(lián)系,經(jīng)常會(huì)使用JavaScript來(lái)加以控制,所以將狀態(tài)多帶帶分出來(lái)是極有必要的,JavaScript只需要更改一個(gè)class就可以實(shí)現(xiàn)狀態(tài)的切換,而不是在執(zhí)行的時(shí)候才想起來(lái)應(yīng)該把哪里隱藏把哪里顯示,或者是變個(gè)顏色出個(gè)動(dòng)畫(huà)之類的。

使用

接著,無(wú)論我們是已經(jīng)把各種寫(xiě)好的CSS屬性分好了組,還是正準(zhǔn)備以這種方式開(kāi)始寫(xiě)CSS,我先引入一個(gè)語(yǔ)言學(xué)的術(shù)語(yǔ) 語(yǔ)塊(Lexical chunk),創(chuàng)造這一術(shù)語(yǔ)的 Michael Lewis 認(rèn)為語(yǔ)言并非由傳統(tǒng)語(yǔ)法和詞匯組成,而是由多個(gè)詞匯的預(yù)制語(yǔ)塊組成。我們現(xiàn)在分好的組其實(shí)就是一個(gè)個(gè)CSS的語(yǔ)塊,CSS本身就是這種預(yù)制功能,我們要做的就是把style語(yǔ)塊化,然后在HTML中寫(xiě)上代表它的class名稱,當(dāng)HTML元素上的多個(gè)class組合在一起時(shí)就組成完整的語(yǔ)義。

比如表示步驟的元素,這是一個(gè)形狀類似標(biāo)簽,一個(gè)挨一個(gè)的排列的元素。我將它的尺寸等屬性抽出來(lái)命名為label,然后把布局的屬性組命名為float-left,如果我的設(shè)計(jì)風(fēng)格是扁平化的,我可以把相關(guān)的皮膚屬性命名為flat,你知道雖然扁平化一般用不著特別的屬性,但我也可以寫(xiě)一些強(qiáng)制去掉圓角和漸變背景的屬性。作為步驟,會(huì)分為當(dāng)前的步驟,之前的步驟,以及還沒(méi)到的步驟,當(dāng)前的步驟可以命名為current,或者is—active,后面的步驟不能點(diǎn)所以可以命名為is-disable,這些都是狀態(tài)。而現(xiàn)在我們來(lái)看看當(dāng)前步驟元素是什么樣的

    

總結(jié)成一句話就是“The flat label which float left is active”。這就是語(yǔ)義化的CSS。把組織好的語(yǔ)塊像說(shuō)話一樣作用于元素上,對(duì)元素發(fā)出指令,讓其變成想要的樣式。而且你應(yīng)該會(huì)發(fā)現(xiàn),一組該元素所獨(dú)有的屬性,或者是尺寸之類的一般是主語(yǔ),布局是動(dòng)賓短語(yǔ),而皮膚多是一些形容詞,最后狀態(tài)可以用表語(yǔ)。

總之,CSS作為一個(gè)描述性的語(yǔ)言,有很多人覺(jué)得不能算一種語(yǔ)言,但我反而覺(jué)得這是一種高級(jí)語(yǔ)言,因?yàn)楦咏匀徽Z(yǔ)言。當(dāng)然其主要作用是在視覺(jué)渲染上,所以應(yīng)該是一種受限的語(yǔ)言,可以看作是接近自然語(yǔ)言的子集。所以它的性質(zhì)覺(jué)得了其重語(yǔ)義輕語(yǔ)法的特點(diǎn),寫(xiě)CSS不能僅靠語(yǔ)法規(guī)則,一定要用上語(yǔ)義規(guī)則,最好是能和項(xiàng)目中所有人達(dá)成共識(shí),CSS框架其實(shí)就是一種通用共識(shí)。


  

原文

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/49566.html

相關(guān)文章

  • CSS語(yǔ)義思維

    摘要:除了其本身的語(yǔ)法規(guī)則,我們必須自我約束,引入語(yǔ)義規(guī)則,不僅僅是為了提高可讀性這樣的理由,而是拉近人與機(jī)器的距離,讓我們?cè)谒季S上更加和代碼契合,這樣才能寫(xiě)出優(yōu)秀的程序。 前一陣子在項(xiàng)目組中講了一個(gè)關(guān)于CSS的Session,在講之前我曾收到了許多意見(jiàn),大部分是希望能講講CSS實(shí)用性的技術(shù),比如盒模型,CSS3之類的。干貨人人都喜歡,因?yàn)榭吹靡?jiàn)摸得著,拿來(lái)就有用,但我最后還是決定講一些濕貨...

    icattlecoder 評(píng)論0 收藏0
  • HTML,CSS,JavaScript的思維導(dǎo)圖

    摘要:一個(gè)思維導(dǎo)圖是把抽象的事物具體化,以一個(gè)東西為思想核心內(nèi)容,映射出一系列的組成及作用影響的內(nèi)容。的思維導(dǎo)圖是層疊樣式表語(yǔ)言,是對(duì)的語(yǔ)言進(jìn)行樣式化。我設(shè)計(jì)的思維導(dǎo)圖如下簡(jiǎn)介,對(duì)象,編程語(yǔ)言基礎(chǔ),客戶端,參考,創(chuàng)建與調(diào)試等等內(nèi)容。 一個(gè)思維導(dǎo)圖是把抽象的事物具體化,以一個(gè)東西為思想核心內(nèi)容,映射出一系列的組成及作用 影響的內(nèi)容。 HTML的思維導(dǎo)圖 HTML是一種超文本標(biāo)記語(yǔ)言。我認(rèn)為要學(xué)...

    n7then 評(píng)論0 收藏0
  • HTML,CSS,JavaScript的思維導(dǎo)圖

    摘要:一個(gè)思維導(dǎo)圖是把抽象的事物具體化,以一個(gè)東西為思想核心內(nèi)容,映射出一系列的組成及作用影響的內(nèi)容。的思維導(dǎo)圖是層疊樣式表語(yǔ)言,是對(duì)的語(yǔ)言進(jìn)行樣式化。我設(shè)計(jì)的思維導(dǎo)圖如下簡(jiǎn)介,對(duì)象,編程語(yǔ)言基礎(chǔ),客戶端,參考,創(chuàng)建與調(diào)試等等內(nèi)容。 一個(gè)思維導(dǎo)圖是把抽象的事物具體化,以一個(gè)東西為思想核心內(nèi)容,映射出一系列的組成及作用 影響的內(nèi)容。 HTML的思維導(dǎo)圖 HTML是一種超文本標(biāo)記語(yǔ)言。我認(rèn)為要學(xué)...

    chanjarster 評(píng)論0 收藏0
  • HTML,CSS,JavaScript的思維導(dǎo)圖

    摘要:一個(gè)思維導(dǎo)圖是把抽象的事物具體化,以一個(gè)東西為思想核心內(nèi)容,映射出一系列的組成及作用影響的內(nèi)容。的思維導(dǎo)圖是層疊樣式表語(yǔ)言,是對(duì)的語(yǔ)言進(jìn)行樣式化。我設(shè)計(jì)的思維導(dǎo)圖如下簡(jiǎn)介,對(duì)象,編程語(yǔ)言基礎(chǔ),客戶端,參考,創(chuàng)建與調(diào)試等等內(nèi)容。 一個(gè)思維導(dǎo)圖是把抽象的事物具體化,以一個(gè)東西為思想核心內(nèi)容,映射出一系列的組成及作用 影響的內(nèi)容。 HTML的思維導(dǎo)圖 HTML是一種超文本標(biāo)記語(yǔ)言。我認(rèn)為要學(xué)...

    defcon 評(píng)論0 收藏0
  • 前端知識(shí)歸納

    摘要:繼承性子標(biāo)簽會(huì)繼承父標(biāo)簽樣式優(yōu)先級(jí)行內(nèi)樣式選擇器類選擇器標(biāo)簽選擇器通配符繼承機(jī)制創(chuàng)建了的元素中,在垂直方向上的會(huì)發(fā)生重疊。 技能考察: 一、關(guān)于Html 1、html語(yǔ)義化標(biāo)簽的理解; 結(jié)構(gòu)化的理解; 能否寫(xiě)出簡(jiǎn)潔的html結(jié)構(gòu); SEO優(yōu)化 a、理解:根據(jù)內(nèi)容的結(jié)構(gòu)化(內(nèi)容語(yǔ)義化),選擇合適的標(biāo)簽(代碼語(yǔ)義化)便于開(kāi)發(fā)者閱讀和寫(xiě)出更優(yōu)雅的代碼的同時(shí) 讓瀏覽器的爬蟲(chóng)和...

    sixleaves 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

hqman

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<