国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Web語義化標準解讀

vspiders / 2612人閱讀

摘要:為什么說最佳實踐是呢簡單來說,就是這類預處理器在提供一定的抽象能力的同時,也不會破壞自身的特性。就語義化這件事情而言,如果你的是基于標準來編寫的,意味著你的頁面具備更多的可能性。

原文:https://github.com/kuitos/kuitos.github.io/issues/33

15年年末寫了篇關于BEM方法論(實踐上內容并不是原BEM)的文章,文末給自己挖了個坑說要聊聊web語義化,跳票至今?。16年第一篇用來填坑好了!

什么是語義化

The Semantic Web provides a common framework that allows data to be shared and reused across application, enterprise, and community boundaries. --Wikipedia

語義化Web具備讓數據跨終端共享/重用的能力。

對于HTML體系而言,Web語義化是指使用語義恰當的標簽,使頁面有良好的結構,頁面元素有含義,能夠讓人和機器都容易理解。

語義化說起來好像都懂,但是實際情況并不是那么樂觀。

再談各種所謂的CSS設計模式

OOCSS (Object Oriented CSS)

...a CSS “object” is a repeating visual pattern, that can be abstracted into an independent snippet of HTML, CSS, and possibly JavaScript. That object can then be reused throughout a site. — Nicole Sullivan

  • ...

目標:

減少對HTML結構的依賴

增加CSS class重復性的使用

SMACSS(Scalable and Modular Architecture for CSS)

...an attempt to document a consistent approach to site development when using CSS. — SMACSS

一種css架構風格

BEM(Block,Element,Modular)

The BEM approach ensures that everyone participating in the development of a website is working with the same codebase and using the same terminology — BEM Methodology

    

與SMACSS類似

METACSS | ATOMCSS (原子CSS)

WTFSS

為什么會有這么多層出不窮(千奇百怪)的CSS設計模式

Cascading Style Sheets (CSS) are a stylesheet language used to describe the presentation of a document written in HTML or XML (including XML dialects like SVG or XHTML). CSS describes how elements should be rendered on screen, on paper, in speech, or on other media. --MDN

CSS本身的不足,不具備邏輯表達能力 & 抽象能力

We had to maintain a shit。。。所以我們需要更有效的去減少讓自己惡心的成本。。

但這些都只是部分客觀原因,主要原因在于我們對于Web語義化的理解度不夠以及非正確的工作流

以表現為中心(面向UI) VS 以信息為中心(面向語義)

以表現為中心的工作流: 需求原型 --> UI設計稿 --> 以HTML/CSS實現設計稿

以信息為中心的工作流: 需求原型 --> 分析需求并以HTML描述 --> UI設計稿 --> 分析樣式并以CSS實現

兩者最大的區別在于,對于面向UI的工作流而言,HTML/CSS只是實現UI的手段,而對于純正的Web開發(面向語義的工作流)而言,我們應該是以信息為中心的,即首先考慮信息的本質(語義),并以合適的標簽來標記,最后再考慮樣式和行為(UI)。

之所以會有那么多層出不窮(不知所謂)的CSS設計模式,是因為它們大都是以表現為中心提出的“最佳實踐”,而這兩種方法論本身又是不適配的。

為什么說面向語義(以信息為中心)才是純正的Web開發

Web誕生的目的是用于在網絡上傳遞資源跟信息的。HTML設計之初是用來作為互聯網上主要的內容載體,其本身是用來描述信息的。在最早期的Web時代,HTML作為一種通用的描述語言用來表述在互聯網上傳輸/共享的文檔的信息。
Web 萬維網

The World Wide Web (WWW) is an open source information space where documents and other web resources are identified by URLs, interlinked by hypertext links, and can be accessed via the Internet.

HTML 作為一種對計算機而言通用易懂的母語

To publish information for global distribution, one needs a universally understood language, a kind of publishing mother tongue that all computers may potentially understand.

Web領域的一套基礎架構跟技術(包括HTTP、REST、HTML等),是按照語義中心的方式設計出來的。如果采用UI中心的方法論,必然導致阻抗不匹配。

w3c官方也在致力于推廣Web語義化

各種表現型標簽/屬性在HTML5中被廢棄/不推薦使用(center、big、width等)

HTML5中新增的各種語義化標簽(header、nav等),而這些標簽在表現上跟div無二。

CSS語義化?

通常意義上我們說的CSS語義指的是class的語義。class作為HTML與CSS之間的主要鉤子,卻是被我們誤解最深的一個東西。

There are no additional restrictions on the tokens authors can use in the class attribute, but authors are encouraged to use values that describe the nature of the content, rather than values that describe the desired presentation of the content. --w3c

class屬性本意是用來描述元素內容的,而不是描述元素展現的。其典型‘反模式’代表就是METACSS。
看看這兩段代碼,哪一個更容易理解?


userName:Kuitos

class作為HTML描述屬性集的一部分,本身是用來細化內容語義的,所謂的CSS語義化本質上就是HTML語義化。

符合標準的最佳實踐

在CSS領域發展的初期,嚴格意義上的“最佳實踐”都是不存在的,這主要受制于CSS的支持度,大部分瀏覽器的CSS的支持不夠好,所以也導致我們很難在表現及語義之間做平衡。所以我們在翻看HTML標簽的時候會看到諸如

這類純樣式的歷史性標簽(這些標簽已經不被HTML5 spec推薦使用)。

但是為什么到了CSS已經如此強大(且瀏覽器支持度也都挺好)的年代,依然會出現那么多實質還是以表現為中心提出的所謂“最佳實踐”?其實,這歸結起來,源于我們對于CSS復用的這種剛性需求。

以OOCSS為例,我們寫一組按鈕可能會這么寫:


.button-primary {
    width: 80px;
    height: 40px;
    background-color: green;
    ...
}

.button-error {
    width: 80px;
    height: 40px;
    background-color: red;
    ...
}

我不能每寫一個button都重復一遍寬高啊,要復用,所以我們可能會把公共部分提取出來


.button {
    width: 80px;
    height: 40px;
}

如果你秉承這個思路,當哪天產品要求第一個按鈕要左排第二個要右排的時候,我估摸著你會很自然的這么去寫:


.float-left {
    float: left;
}
.float-right {
    float: right;
}

更甚者,哪天產品要求第二個按鈕跟右邊隔10像素,你會不會這么寫?

css我就不寫了mr10什么意思我猜你已經知道了。。
且不說這種寫法中button本身就是一種冗余信息(我當沒看見也罷),mr10 則基本上無法忍受了,仔細想想這跟直接寫inline-style有什么差別?相反我寫inline-style更符合標準,至少我是掛載在專門用于描述表現的style屬性上面,而不是用來描述內容的class上面。

基于這樣的一連串演進,最后大概會誕生出兩個癥狀:

樣式類 即一系列諸如 mr10 fl之類的class

多class癥 即幾乎每個元素上都要掛載至少一個class。

原因在于,如果我們需要達到復用的效果,最后必定會魔障出一條理念:樣式需具備獨立性與上下文無關,同時粒度需要夠小(樣式類/通用原子類)。

其中也有一個主要原因是我們對CSS的誤解

css = 層疊樣式表,其關鍵詞在層疊

“復用”需求最后一定會導致我們樣式退化到平級的單class規則定義,因為這樣才能足夠無狀態。但實際上CSS最獨特的地方在于層疊,你避開這種機制從而來滿足復用需求,最后不單單喪失了CSS的能力,反而會催生出一系列不符合語義化標準的反模式。

但是我也說過,復用是剛需,而CSS又不具備抽象能力,所以我們只能眼睜睜的看著一坨坨屎流行么?

好在我們有預處理器

最佳實踐 Sass/Less

Sass/Less我這里就不一一贅述了,時至今日相比大家都很熟悉。為什么說最佳實踐是Sass/Less呢?簡單來說,就是這類預處理器在提供一定的抽象能力的同時,也不會破壞css自身的特性。拿上面的例子來看,如果我們使用Sass/Less的寫法:

%button {
    width:80px;
    height:40px;
}

.button-primary {
    @extend %button;
    background-color: white;
}

.button-success {
    @extend %button;
    background-color: green;
}
.button-error {
    @extend %button;
    background-color: red;
}

如果我們在項目級別需要統一的配色,可以做進一步的抽象

$primary-bgc: white;
$success-bgc: green;
$error-bgc: red;
.button-primary {
    @extend %button;
    background-color: $primary-bgc;
}
.button-success {
    @extend %button;
    background-color: $success-bgc;
}
.button-error {
    @extend %button;
    background-color: $error-bgc;
}

同樣的手段還有mixin。
我們可以將我們需要復用的“樣式類”抽象成placeholder/mixin(對于“通用原子類”這樣的需求我推薦用placeholder),然后使用語義化的 class/屬性 作為鉤子,來組裝這些“原子類”(但實際上這些“原子類”對CSS而言是不可見的)。比如我們用a標簽來模擬一個提交按鈕,我們應該這樣寫:

提交
a[role="submit-button"] {
    @include .button-success;
}

所以css的最佳實踐應該是: Sass + OOCSS/BEM/METACSS

這里有一個關鍵點在于,我們在使用這些css抽象方法論來寫sass的時候,切記不要把中間變量暴露給css。什么意思呢,button那個例子我這樣來寫

.button{
    width: 80px;
    height: 40px;
}
.button-primary {
    @extend .button;
}

此時button對于css而言是可見的。對于button這類抽象產物,我們應該用placeholder和mixin代替,確保其對css的不可見從而保證web的“純度”。(這也是我不推薦Less的原因,Less最大的失誤在于沒有placeholder的設計)

到這里估計思考過的同學會有疑問:很多場景可能并沒那么容易語義化,比如我要第一個元素左浮動,第二個元素右浮動,第三個又左浮動,第四個右浮動。。。

這里需要提到另一個經常被誤解的點:selector。selector作為HTML與CSS的結合點,實質上也是需要語義化的。tag跟id是天生帶語義的,主要問題還是出在class上。我們總是嘗試在class上掛載一些表現型的“名稱”。這里面有一小部分確實是由于CSS本身的不完美(比如layout這種場景細則就比較難語義)導致的,但是過多的則歸咎于我們語義化動力不足及對selector的認知不夠。語義化動力不足完全是主觀因素這里不贅述,對selector認知不夠則是最普遍存在的情況。推薦閱讀:為后代選擇器及id選擇器辯護 結合智能選擇器的語義化的CSS

綜上所述,如果要秉持純粹的Web開發,最佳實踐是:
合適的語義化標簽 + 語義化selector + Sass

為什么一定要按標準來?

其實我不太想回答這種問題。。。我更想反問:為什么不按標準來?!!

一定要說的話:

推行標準的目的是為技術交流構建一個統一的上下文語境平臺,提高溝通效率,避免雞同鴨講。

同時標準跟規范的制定是經過一群 資深開發者/科學家 經過仔細研究及社區討論的,一套完整的一致的基礎架構系統是推進生態發展的必要條件。

就Web語義化這件事情而言,如果你的HTML是基于標準來編寫的,意味著你的頁面具備更多的可能性。比如搜索引擎友好,多終端適配(不是響應式。。是指兼容各種閱讀設備、讀屏軟件等。參見microformats),更智能的風格查錯能力。

在前端開發體系里,能體系專業性的地方不多。。拿程序復雜度而言,它跟大型后端系統差不止一個量級(前端的難度在于工程上)。。好不容易有一個能體現專業素養的領域(語義化Web),為什么我們不抓住機會為自己正名呢。。

推薦閱讀:

http://hax.iteye.com/blog/497338

http://hax.iteye.com/blog/500015

http://hax.iteye.com/blog/849826

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/115083.html

相關文章

  • 前端面試【整理更新中】:HTML常見題目(帶答案)

    摘要:標準模式的排版和運作模式都是以該瀏覽器支持的最高標準運行。使用之前需要考慮這兩個缺點。數據的有效期不同。在設置的過期時間之前一直有效,即使窗口或者瀏覽器關閉。僅在瀏覽器窗口關閉之前有效。 一、HTML常見題目01、Doctype作用?嚴格模式與混雜模式如何區分?它們有何意義?02、 HTML5 為什么只需要寫 !DOCTYPE HTML?03、行內元素有哪些?塊級元素有哪些?空(voi...

    zhjx922 評論0 收藏0
  • 前端面試【整理更新中】:HTML常見題目(帶答案)

    摘要:標準模式的排版和運作模式都是以該瀏覽器支持的最高標準運行。使用之前需要考慮這兩個缺點。數據的有效期不同。在設置的過期時間之前一直有效,即使窗口或者瀏覽器關閉。僅在瀏覽器窗口關閉之前有效。 一、HTML常見題目01、Doctype作用?嚴格模式與混雜模式如何區分?它們有何意義?02、 HTML5 為什么只需要寫 !DOCTYPE HTML?03、行內元素有哪些?塊級元素有哪些?空(voi...

    Freeman 評論0 收藏0
  • 前端面試【整理更新中】:HTML常見題目(帶答案)

    摘要:標準模式的排版和運作模式都是以該瀏覽器支持的最高標準運行。使用之前需要考慮這兩個缺點。數據的有效期不同。在設置的過期時間之前一直有效,即使窗口或者瀏覽器關閉。僅在瀏覽器窗口關閉之前有效。 一、HTML常見題目01、Doctype作用?嚴格模式與混雜模式如何區分?它們有何意義?02、 HTML5 為什么只需要寫 !DOCTYPE HTML?03、行內元素有哪些?塊級元素有哪些?空(voi...

    Eirunye 評論0 收藏0
  • 前端面試題1(HTML篇)

    摘要:不存在或格式不正確會導致文檔以兼容模式呈現標準模式的排版和運作模式都是以該瀏覽器支持的最高標準運行。又稱內核及以上版本,等內核及以上。內核原為,現為內核等。如果不能確定時,首選使用自然樣式標簽 HTML 語義化 HTML標簽的語義化是指:通過使用包含語義的標簽(如h1-h6)恰當地表示文檔結構 css命名的語義化是指:為html標簽添加有意義的class 為什么需要語義化: 去...

    starsfun 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<