搜索
首页web前端html教程深度剖析HTML的语意和与其相关的前端框架_HTML/Xhtml_网页制作

关于语义

语义研究的是标志与符号之间的关系,以及它们所代表的意义。在语言学中,它主要是研究这些标志(如单词,短语,或者声音)在语言中的意义。而在前端开发领域,语义主要涉及的是HTML元素、属性和属性值(包括像Microdata这样的扩展)所约定的意义。这些在规范中常用的正式约定语义,可以帮助程序(以及后来参与开发的人)更好地理解一个网站各方面的信息。然而,即使这些元素、属性和属性值的语义是正式化的,它们依然得服从于开发者的适应程度以及共同选择的结果。这使得正式的约定语义也可能会在今后被修改(而这正是HTML设计原则之一)。
区分不同类型的HTML语义

遵守编写“语义化的HTML”这个原则,是现代专业前端开发的基础之一。绝大多数的语义都与当前或预期的内容性质有关(如:h1元素,lang属性,type属性的email值,Microdata)。

然而,并非所有的语义都需要以内容为导向。类名不能“无语义”。不管是用什么名字命名,它们都必须要有意义与目的。类名的语义可以和那些HTML元素不同。我们可以借助HTML元素、某些HTML属性、Microdata等所具有的“全局性”语义,然后利用网站或应用的“局部性”特定语义加以区分,这些特定语义通常包含在属性值中,比如class属性。

尽管在HTML5规范的class属性这一章节中重申了这个假定的“最佳实践”…

    …鼓励开发者使用class属性值描述实际内容,而不是描述期望展现的内容。

…并没有什么内在的原因非这样做不可。事实上,当这种方法在大型网站或者应用中运用时,它往往会成为一种障碍。

    HTML元素和其它属性已经提供了内容层的语义
    对于机器或访问者来说,类名所能透露的有用的语义信息非常少,甚至没有。除非它是已经约定的那一小部分名称(机器同样可读) —— Mircoformats
    类名的主要用途是成为CSS和JavaScript的钩子。如果你不需要为你的页面添加表现和行为,那么你或许不必在你的HTML里添加类名
    类名应该为开发者传达有用的信息。当你阅读一个DOM片段时,它将有助于理解某个类名的具体作用。尤其是在多人协作的开发团队里,与HTML组件打交道的可不光只有前端开发者。

举一个非常简单的例子:

XML/HTML Code复制内容到剪贴板
  1. div class="news">  
  2.     h2>Newsh2>  
  3.     [news content]   
  4. div>  

当内容还不明显的时候,这个类名news不能告诉你任何事情。它没有向你提供关于这个组件整体结构的信息,而且一旦内容不再是“新闻”时,使用这个类名就显得非常不妥。类名的语义过分贴近内容,架构既不容易扩展,也不容易为其他开发人员所用。
与内容无关的类名

从某个设计模式的结构与功能中提取类名的语义是一种更好的方法。那些类名与内容无关的组件可重用性更高。

我们不应该害怕让各层之间的关系变得清晰而明确(这里应该是指结构层、内容层等,译者注),而不是用类名严格地反应明确的内容。这样做不会使类名“无语义”,这只是表明它们的语义并不取决于内容。我们也不应该害怕使用额外的HTML元素,只要它们能帮助你创建更强壮、更灵活且更具重用性的组件。这样做不会使HTML变得“无语义”,这仅仅意味着你标记内容所使用的元素数量超过了最小值而已。
前端架构

组件、模板、面向对象的体系结构的目的是能够开发出一种数量有限的可重复使用的组件,它可以在一定范围内包含不同的内容类型。在大型的应用程序中,对类名语义来说最重要的事情是,能够用实用主义服务于它们的主要目的 —— 提供有意义的、灵活的、可重复使用的表现或行为的钩子供开发者使用。
可重用且可组合的组件

总的来说,可扩展的HTML/CSS必须依赖HTML中的class,以便创建可重用的组件。一个灵活的、可重用的组件,既不依赖DOM树中的某一部分,也不需要使用特定类型的元素。它应该能适应不同的容器,并且可以很容易地更换主题。如果有必要,额外的HTML元素(超出标记内容所必须的元素之外的元素)可以让组件更加强壮。Nicole Sullivan所说的media object就是一个很好的例子。

避免用类型选择器支持class,可以让组件更容易合并。下面这个例子中,btn组件与uilist组件不易于合并。问题在于.btn的权重比.uilist a要小(这将覆盖任何共享属性)。而且ulist组件需要锚点作为子节点。

XML/HTML Code复制内容到剪贴板
  1. .btn { /* styles */ }   
  2. .uilist { /* styles */ }   
  3. .uilist a { /* styles */ }   
  4.   
  5. nav class="uilist">  
  6.     a href="#">Homea>  
  7.     a href="#">Abouta>  
  8.     a class="btn" href="#">Logina>  
  9. nav>  

一种让uilist组件与其它组件轻松组合的方法是,uilist的子级DOM元素用class来添加样式。尽管这会降低权重,但是它的主要好处在于,它为你提供了处理子节点的任何结构样式的选择权。

XML/HTML Code复制内容到剪贴板
  1. .btn { /* styles */ }   
  2. .uilist { /* styles */ }   
  3. .uilist-item { /* styles */ }   
  4.   
  5. nav class="uilist">  
  6.     a class="uilist-item" href="#">Homea>  
  7.     a class="uilist-item" href="#">Abouta>  
  8.     span class="uilist-item">  
  9.         a class="btn" href="#">Logina>  
  10.     span>  
  11. nav>  

JavaScript专用类

使用某种形式的JavaScript专用类,可以降低因组件样式或结构的改变导致JavaScript失效的风险。我已经找到了一种非常有效的方法,那就是专为JavaScript的钩子使用一种特定的类——js-*——不要在这个类名上添加任何描述。

XML/HTML Code复制内容到剪贴板
  1. a href="/login" class="btn btn-primary js-login">a>  

在你修改组件的结构或样式的时候,可能会不经意间对那些必要的JavaScript行为和复杂的功能造成影响,用这种方法的话,可以降低这种可能性。
组件修改器

组件常常会有一些变体,它们与基本组件只有细微的差别。比如,不同的背景色或者边框。主要有两种创建这些组件变体的模式。我将它们称为“单类名”模式和“多类名”模式。

单类名模式

XML/HTML Code复制内容到剪贴板
  1. .btn, .btn-primary { /* 按钮模板样式 */ }   
  2. .btn-primary { /* 主按钮的特殊样式 */ }   
  3.   
  4. button class="btn">Defaultbutton>  
  5. button class="btn-primary">Loginbutton>  

多类名模式

XML/HTML Code复制内容到剪贴板
  1. .btn { /* 按钮模板样式 */ }   
  2. .btn-primary { /* 主按钮的特殊样式 */ }   
  3.   
  4. button class="btn">Defaultbutton>  
  5. button class="btn btn-primary">Loginbutton>  

如果你使用预处理程序,你可以用Sass的@extend功能,以减少一些在使用“单类名”模式时所涉及的维护工作。然而,即使有预处理程序的帮忙,我依然倾向于使用“多类名”模式,并在HTML中修改类名。

我发现这是一种更具扩展性的模式。比如,要实现一个基本的btn组件,并增加5种类型的按钮与3种额外的尺寸。用“多类名”模式的话只要9个class就可以搞定,用“单类名”模式则需要24个class。

如果需要的话,它也更容易让上下文环境适应组件。你可能想对出现在其它组件中的任一btn做一些细节调整。

XML/HTML Code复制内容到剪贴板
  1. /* “多类名”样式调整 */   
  2. .thing .btn { /* 相应的样式调整 */ }   
  3.   
  4. /* “单类名”样式调整 */   
  5. .thing .btn,   
  6. .thing .btn-primary,   
  7. .thing .btn-danger,   
  8. .thing .btn-etc { /* 相应的样式调整 */ }  

“多类名”模式意味着,你只需要用一个单独的组件内部选择器,便可以改变所有类型的btn元素的样式。“单类名”模式意味着,你必须顾及所有可能的按钮类型,并在创造一个新的按钮变体时调整这个选择器。
结构化的类名

当创建一个组件时——并为之添加了“主题”——其中一些class被用来区分各个组件,一些class被当做组件的修改器,其它的class则被用来关联DOM节点,它们一起被包含在一个较大的抽象组件中。

很难去判断btn(组件)、btn-primary(修改器)、brn-group(组件)和btn-group-item(组件子对象)之间的关系,这是因为这些名字不能清晰地表现class的目的。没有一致的模式。

在过去的一年中,我一直在尝试命名模式,目的是能帮助我快速理解在一个DOM片段中节点的表象之间的关系,而不用为此来回切换HTML、CSS与JS文件拼凑网站的架构。这种模式主要受到BEM系统的命名方法的影响,但被改编成一种我认为更容易浏览的形式。


复制代码
代码如下:
t-template-name
t-template-name--modifier-name
t-template-name__sub-object
t-template-name__sub-object--modifier-name

component-name
component-name--modifier-name
component-name__sub-object
component-name__sub-object--modifier-name

is-state-type

js-action-name
js-component-type

我将一些结构当做抽象的“模板”来处理,其它的则视为更清晰的组件(通常建立在“模板”上)。但是这种区分并非总是必要的。

这仅仅是我目前发现的一种有用的命名模式。命名模式可以采用任何形式。但这种命名模式的好处在于消除了模糊的类名,只依赖(单)连接符,或者下划线,或者是驼峰格式。
原始文件大小和HTTP压缩的注意事项

任何关于模块化与可扩展的CSS的讨论都会谈及对文件大小与“膨胀”的担心。Nicole Sullivan的言论中经常会提到文件大小的存储(以及维护改进),并提到了像Facebook这样的公司采用这种方法的经历。进一步的,我想我会分享我在预处理输出时的HTTP压缩效果,以及大量使用HTML类的一些事情。

当Twitter Bootstrap刚刚问世的时候,我重写了已编译的CSS,以便更好地与手动操作的文件比较大小。在最小化所有的文件之后,手动操作的CSS文件比预处理程序输出的小10%。但是当所有的文件都通过gzip压缩后,预处理程序输出的CSS文件比手动操作的小了5%。

这强调了比较HTTP压缩后文件大小的重要性,因为减少的文件大小并不能说明全部问题。它暗示了有经验的CSS开发者在用预处理程序时不必太过关注编译后的CSS中一定程度的重复,因为它将在HTTP压缩后变得更小。通过预处理程序处理更易于维护的CSS代码所带来的好处,要胜过关注原始CSS和压缩后输出的CSS的美观或文件大小。

在另一个实验中,我从线上扒了一个60KB的HTML文件(由很多可重用的组件组成),并删除了它的每一个class属性。这样处理之后,文件大小减小到25KB。当原始文件与扒下来的文件都通过gzip压缩后,它们的大小分别变为7.6KB和6KB——只相差1.6KB。自由使用class所导致的实际文件大小的结果已经不值得再去强调了。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
HTML超文本标记语言--超在那里?(文档分析)HTML超文本标记语言--超在那里?(文档分析)Aug 02, 2022 pm 06:04 PM

本篇文章带大家了解一下HTML(超文本标记语言),介绍一下HTML的本质,HTML文档的结构、HTML文档的基本标签和图像标签、列表、表格标签、媒体元素、表单,希望对大家有所帮助!

html和css算编程语言吗html和css算编程语言吗Sep 21, 2022 pm 04:09 PM

不算。html是一种用来告知浏览器如何组织页面的标记语言,而CSS是一种用来表现HTML或XML等文件样式的样式设计语言;html和css不具备很强的逻辑性和流程控制功能,缺乏灵活性,且html和css不能按照人类的设计对一件工作进行重复的循环,直至得到让人类满意的答案。

web前端笔试题库之HTML篇web前端笔试题库之HTML篇Apr 21, 2022 am 11:56 AM

总结了一些web前端面试(笔试)题分享给大家,本篇文章就先给大家分享HTML部分的笔试题(附答案),大家可以自己做做,看看能答对几个!

总结HTML中a标签的使用方法及跳转方式总结HTML中a标签的使用方法及跳转方式Aug 05, 2022 am 09:18 AM

本文给大家总结介绍a标签使用方法和跳转方式,希望对大家有所帮助!

HTML5中画布标签是什么HTML5中画布标签是什么May 18, 2022 pm 04:55 PM

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html中document是什么html中document是什么Jun 17, 2022 pm 04:18 PM

在html中,document是文档对象的意思,代表浏览器窗口的文档;document对象是window对象的子对象,所以可通过“window.document”属性对其进行访问,每个载入浏览器的HTML文档都会成为Document对象。

html5废弃了哪个列表标签html5废弃了哪个列表标签Jun 01, 2022 pm 06:32 PM

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

Html5怎么取消td边框Html5怎么取消td边框May 18, 2022 pm 06:57 PM

3种取消方法:1、给td元素添加“border:none”无边框样式即可,语法“td{border:none}”。2、给td元素添加“border:0”样式,语法“td{border:0;}”,将td边框的宽度设置为0即可。3、给td元素添加“border:transparent”样式,语法“td{border:transparent;}”,将td边框的颜色设置为透明即可。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。