目錄
什么是语义化
语义化说起来好像都懂,但是实际情况并不是那么乐观。
再谈各种所谓的CSS设计模式
primary
登入後複製

目标:

  • 减少对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设计模式" >...
    登入後複製

    目标:

    • 减少对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设计模式

    以表现为中心(面向UI) VS 以信息为中心(面向语义)
    为什么说面向语义(以信息为中心)才是纯正的Web开发
    CSS语义化?
    符合标准的最佳实践
    好在我们有预处理器
    最佳实践 Sass/Less
    为什么一定要按标准来?
    首頁 web前端 html教學 Web语义化标准解读_html/css_WEB-ITnose

    Web语义化标准解读_html/css_WEB-ITnose

    Jun 21, 2016 am 08:55 AM

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

    15年年末写了篇关于 BEM方法论(实践上内容并不是原BEM)的文章,文末给自己挖了个坑说要聊聊web语义化,跳票至今:joy:。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

      <div class="item">  <ul class="item-list">    <li class="item-list--item">      <h3 id="button-class-button-button-primary-primary-button-button-class-button-button-info-info-button-pre-div-class-contentsignin-登入後複製-div-div-p-目标-p-ul-li-p-class-no-text-indent-减少对HTML结构的依赖-p-li-li-p-class-no-text-indent-增加CSS-class重复性的使用-p-li-ul-li-li-p-SMACSS-Scalable-and-Modular-Architecture-for-CSS-p-p-p-an-attempt-to-document-a-consistent-approach-to-site-development-when-using-CSS-SMACSS-p-p-div-class-code-style-position-relative-padding-px-margin-px-pre-class-brush-php-toolbar-false-div-class-container-div-class-container-header-div-class-container-header-title-h-class-container-header-title-home-pre-div-class-contentsignin-登入後複製-div-div-p-一种css架构风格-p-li-li-p-BEM-Block-Element-Modular-p-p-p-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-p-p-div-class-code-style-position-relative-padding-px-margin-px-pre-class-brush-php-toolbar-false-ul-class-menu-li-class-menu-item-li-li-class-menu-item-state-current-li-li-class-menu-item-li-ul-pre-div-class-contentsignin-登入後複製-div-div-p-与SMACSS类似-p-li-li-p-METACSS-ATOMCSS-原子CSS-p-div-class-code-style-position-relative-padding-px-margin-px-pre-class-brush-php-toolbar-false-div-class-fl-mr-red-span-class-blue-fl-span-div-pre-div-class-contentsignin-登入後複製-div-div-li-li-p-class-no-text-indent-WTFSS-p-li-ul-h-为什么会有这么多层出不穷-千奇百怪-的CSS设计模式">...      <button class="button button-primary">primary</button><button class="button button-info">info</button>
      登入後複製

      目标:

      • 减少对HTML结构的依赖

      • 增加CSS class重复性的使用

    • SMACSS(Scalable and Modular Architecture for CSS)

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

      <div class=“container”>      <div class=“container-header”>        <div class=“container-header__title”>              <h1 class=“container-header__title--home”>
      登入後複製

      一种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

      <ul class="menu">      <li class="menu__item">...</li>      <li class="menu__item_state_current">...</li>      <li class="menu__item">...</li></ul>    
      登入後複製

      与SMACSS类似

    • METACSS | ATOMCSS (原子CSS)

      <div class="fl mr10 red">    <span class="blue fl"></span>    </div> 
      登入後複製
    • 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

    1. CSS本身的不足,不具备逻辑表达能力 & 抽象能力

    2. We had to maintain a shit。。。所以我们需要更有效的去减少让自己恶心的成本。。

    但这些都只是部分客观原因, 主要原因在于我们对于Web语义化的理解度不够以及非正确的工作流。

    以表现为中心(面向UI) VS 以信息为中心(面向语义)

    以表现为中心的工作流: 需求原型 --> UI设计稿 --> 以HTML/CSS实现设计稿

    以信息为中心的工作流: 需求原型 --> 分析需求并以HTML描述 --> UI设计稿 --> 分析样式并以CSS实现

    两者最大的区别在于,对于面向UI的工作流而言,HTML/CSS只是实现UI的手段,而对于纯正的Web开发(面向语义的工作流)而言,我们应该是以信息为中心的,即首先考虑信息的本质(语义),并以合适的标签来标记,最后再考虑样式和行为(UI)。

    之所以会有那么多层出不穷(不知所谓)的CSS设计模式,是因为它们大都是以表现为中心提出的“最佳实践”,而这两种方法论本身又是不适配的。

    为什么说面向语义(以信息为中心)才是纯正的Web开发

    1. 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.

    2. Web领域的一套基础架构跟技术(包括HTTP、REST、HTML等),是按照语义中心的方式设计出来的。如果采用UI中心的方法论,必然导致阻抗不匹配。

    3. 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。看看这两段代码,哪一个更容易理解?

    <!-- 以表现为中心 --><div class="fl mr10">    <span>userName:Kuitos</span><div><!-- 以信息为中心 --><div class="user-info">    <span>userName:Kuitos</span><div>
    登入後複製

    class作为HTML描述属性集的一部分,本身是用来细化内容语义的,所谓的CSS语义化本质上就是HTML语义化。

    符合标准的最佳实践

    在CSS领域发展的初期,严格意义上的“最佳实践”都是不存在的,这主要受制于CSS的支持度,大部分浏览器的CSS的支持不够好,所以也导致我们很难在表现及语义之间做平衡。所以我们在翻看HTML标签的时候会看到诸如

    这类纯样式的历史性标签(这些标签已经不被HTML5 spec推荐使用)。

    但是为什么到了CSS已经如此强大(且浏览器支持度也都挺好)的年代,依然会出现那么多实质还是以表现为中心提出的所谓“最佳实践”?其实,这归结起来,源于我们对于CSS复用的这种刚性需求。

    以OOCSS为例,我们写一组按钮可能会这么写:

    <button class="button-primary"></button><button class="button-error"></button>
    登入後複製
    .button-primary {    width: 80px;    height: 40px;    background-color: green;    ...}.button-error {    width: 80px;    height: 40px;    background-color: red;    ...}
    登入後複製

    我不能每写一个button都重复一遍宽高啊,要复用,所以我们可能会把公共部分提取出来

    <button class="button button-primary"></button><button class="button button-error"></button>
    登入後複製
    .button {    width: 80px;    height: 40px;}
    登入後複製

    如果你秉承这个思路,当哪天产品要求第一个按钮要左排第二个要右排的时候,我估摸着你会很自然的这么去写:

    <button class="button button-primary float-left"></button><button class="button button-error float-right"></button>
    登入後複製
    .float-left {    float: left;}.float-right {    float: right;}
    登入後複製

    更甚者,哪天产品要求第二个按钮跟右边隔10像素,你会不会这么写?

    <button class="button button-error float-right mr10"></button>
    登入後複製

    css我就不写了mr10什么意思我猜你已经知道了。。

    且不说 这种写法中button本身就是一种冗余信息(我当没看见也罢), mr10则基本上无法忍受了,仔细想想这跟直接写inline-style有什么差别?相反我写inline-style更符合标准,至少我是挂载在专门用于描述表现的style属性上面,而不是用来描述内容的class上面。

    基于这样的一连串演进,最后大概会诞生出两个症状:

    1. 样式类 即一系列诸如 mr10 fl之类的class

    2. 多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 href="#" role="submit-button">提交</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

    为什么一定要按标准来?

    其实我不太想回答这种问题。。。我更想反问:为什么不按标准来?!!

    一定要说的话:

    1. 推行标准的目的是为技术交流构建一个统一的上下文语境平台,提高沟通效率,避免鸡同鸭讲。

    2. 同时标准跟规范的制定是经过一群 资深开发者/科学家 经过仔细研究及社区讨论的,一套完整的一致的基础架构系统是推进生态发展的必要条件。

    3. 就Web语义化这件事情而言,如果你的HTML是基于标准来编写的,意味着你的页面具备更多的可能性。比如搜索引擎友好,多终端适配(不是响应式。。是指兼容各种阅读设备、读屏软件等。参见 microformats),更智能的风格查错能力。

    4. 在前端开发体系里,能体系专业性的地方不多。。拿程序复杂度而言,它跟大型后端系统差不止一个量级(前端的难度在于工程上)。。好不容易有一个能体现专业素养的领域(语义化Web),为什么我们不抓住机会为自己正名呢。。

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱門文章

    <🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系統,解釋
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Java教學
    1664
    14
    CakePHP 教程
    1423
    52
    Laravel 教程
    1319
    25
    PHP教程
    1269
    29
    C# 教程
    1248
    24
    了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

    WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

    HTML:結構,CSS:樣式,JavaScript:行為 HTML:結構,CSS:樣式,JavaScript:行為 Apr 18, 2025 am 12:09 AM

    HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

    HTML,CSS和JavaScript的未來:網絡開發趨勢 HTML,CSS和JavaScript的未來:網絡開發趨勢 Apr 19, 2025 am 12:02 AM

    HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

    HTML的未來:網絡設計的發展和趨勢 HTML的未來:網絡設計的發展和趨勢 Apr 17, 2025 am 12:12 AM

    HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

    HTML與CSS vs. JavaScript:比較概述 HTML與CSS vs. JavaScript:比較概述 Apr 16, 2025 am 12:04 AM

    HTML、CSS和JavaScript在網頁開發中的角色分別是:HTML負責內容結構,CSS負責樣式,JavaScript負責動態行為。 1.HTML通過標籤定義網頁結構和內容,確保語義化。 2.CSS通過選擇器和屬性控製網頁樣式,使其美觀易讀。 3.JavaScript通過腳本控製網頁行為,實現動態和交互功能。

    HTML:建立網頁的結構 HTML:建立網頁的結構 Apr 14, 2025 am 12:14 AM

    HTML是構建網頁結構的基石。 1.HTML定義內容結構和語義,使用、、等標籤。 2.提供語義化標記,如、、等,提升SEO效果。 3.通過標籤實現用戶交互,需注意表單驗證。 4.使用、等高級元素結合JavaScript實現動態效果。 5.常見錯誤包括標籤未閉合和屬性值未加引號,需使用驗證工具。 6.優化策略包括減少HTTP請求、壓縮HTML、使用語義化標籤等。

    HTML的角色:構建Web內容 HTML的角色:構建Web內容 Apr 11, 2025 am 12:12 AM

    HTML的作用是通過標籤和屬性定義網頁的結構和內容。 1.HTML通過到、等標籤組織內容,使其易於閱讀和理解。 2.使用語義化標籤如、等增強可訪問性和SEO。 3.優化HTML代碼可以提高網頁加載速度和用戶體驗。

    HTML:是編程語言還是其他? HTML:是編程語言還是其他? Apr 15, 2025 am 12:13 AM

    HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增強WebevebDevelopment。

    See all articles