做前端开发的同学都知道,一个网页的基本组成部分是 HTML,JavaScript 和 CSS。开发人员通常更关注 JavaScript 和 CSS ,实践着各种语言规范和设计模式。对于 HTML 的关注度则明显偏少,只要能做出设计师画的界面就万事大吉了,不怎么去关心 HTML 是不是规范合理。于是下面的情况随处可见:

  • 按钮用的是可点击的 <div> 而不是 <button> 元素
  • 标题用的是 <div> 而不是标题元素 (<h1><h2> 等等)
  • <input> 相应的文本标签用的是 <div> 而不是<label>
  • 输入框也用绑定了键盘事件的 <div> ,而不是<input>

看到没?一招 <div> 走天下!这样有没有问题?好像也没什么大问题,毕竟页面看起来符合设计,也能正常交互。但是你想过没有,如果<div>能解决一切,为什么还需要其余几十上百种标签呢?这就要说到 HTML 的语义化了。

什么是语义化

语义化就是说,HTML 元素具有相应的含义。它用于描述元素的内容或者跟其他元素的关系。在 HTML 里,除了<div><span>,基本上都是语义化的元素。

标签名的表义程度也是不一样的,比如<section> 比 <article>对内容的描述就更模糊。<section>也是语义化的,因为它表明内容应该从属于一个组。而<article> 不仅表示它的内容从属于一个组,还是一篇文章。

为了进一步说明语义化的重要性,下面用标题和按钮元素来举例。

标题元素

<h1> 是页面的标题,加上下方的 <h2> 就形成了页面的层级结构。

<!-- h1, 最重要的部分 --><h1>当你的 HTML 里全是 div,那你就要小心了</h1><!-- "什么是语义化" 是 "当你的 HTML 里全是 div,或许该反思下了" 的子标题 --><h2>什么是语义化</h2><!-- "标题元素" 是 "什么是语义化" 的子标题--><h3>标题元素</h3>

在很多富文本编辑器中,使用合适的标题结构,可以自动生成内容目录。比如本文的目录结构就是这样:

  • <h1>: 当你的 HTML 里全是 div,那你就要小心了

    • <h2>: 什么是语义化

      • <h3>: 标题元素
      • <h3>: 按钮
    • <h2>: 非语义化元素
    • <h2>: 总结

可以看到,HTML 本身就传达了整篇文章的结构信息。相反,如果全部都用<div>,就变成这样了:

  • <div>: 当你的 HTML 里全是 div,那你就要小心了
  • <div>: 什么是语义化
  • <div>: 标题元素
  • <div>: 按钮
  • <div>: 非语义化元素
  • <div>: 总结

由于 <div>不附带任何含义,因此它就是扁平的结构。只要使用正确的 HTML,DOM 就会变得清晰和结构化。

按钮

按钮的作用是提交表单或者改变某个元素的状态。从定义上看,按钮具备以下特征:

  • 可获得焦点
  • 可通过敲击空格键或者回车键激活
  • 可通过鼠标点击激活

当你用<div>绑定点击事件来模拟按钮时,你就没办法用上<button>天然自带的那些语义化的交互特征。你还需要手动实现这些功能:

  • focus 状态
  • 键盘交互
  • 鼠标交互

不止如此,当屏幕阅读器碰到<button>提交</button>这个元素,它会识别出语义,告诉用户这是个提交按钮。如果只是个 <div> ,阅读器就不会认为它是个按钮。

当我们使用语义化的 HTML 元素后,就给内容赋予了含义,内容也就有了生命。

在前端领域混了这几年,总结了一套前端学习的精讲视频和学习路线,如果有对前端开发感兴趣的伙伴,不管你是想转行,或是大学生,还有工作中想提升自己能力的web前端党,欢迎大家的加入我的前端开发交流群:603985993 希望大家诚心交流!,与企业需求同步。好友都在里面学习交流,每天都会有大牛定时讲解前端技术!也可以关注我的微信公众号:【前端留学生】  每天更新最新技术文章干货。

非语义化元素

前面提到过,<div><span>是非语义化元素。<div>没有给内容附加任何含义,它只是个<div>。当然,这么说也不完全准确,因为<div><span>之间还是有一点点区别的:

  • <div> 是块级元素
  • <span> 是行内元素,应该放在其他元素里面,比如 <p><span class="dropcap">I</span>nline elements</p>

如果实在找不到对应的 HTML 元素来表示内容,那就可以用 <div> 或者 <span>。既然设计了 <div> 和 <span>,自然有它们的用武之地。毕竟,并不是每一个 HTML 元素都需要额外的语义。

总体原则是,尽量优先使用对应的语义化元素表示内容。退而求其次,使用含义没那么明确的标签。最后才考虑用<div> 和 <span>

总结

虽然使用语义化的 HTML 元素并不会给你的项目带来明显的收益,但我还是建议你这么做。至少,语义化的 HTML 页面能带来更好的 SEO 排名、对屏幕阅读器更友好、代码可读性更高。如果你是个有追求的 Coder,相信你会认同我的看法。

如果你的 HTML 里全是 div,那就要小心了相关推荐

  1. 爵士乐里全用13和弦吗?_用微妙的视差爵士化静态网页

    爵士乐里全用13和弦吗? 一段时间以来,它一直是最大的Web设计流行语之一,因此今天我们将尝试一点Parallax . 我们将整理一个简单的响应式布局,然后在skrollr.js的帮助下,对标题应用微 ...

  2. 如果你在坑里,至少别再往下挖了

    1. 我最近在复习限流方面的知识,刚好在极客时间上面看到了一篇文章. 限流[策略],这里我特意用中括号将策略两字括住,后面我会再拿出来讲. 常用的限流策略,有漏桶策略和令牌桶策略. 这两种算法策略起的 ...

  3. 解决通用串行总线控制器里全是叹号问题

    解决通用串行总线控制器里全是叹号问题 假如你没装驱动,设备管理器里卸载,在扫描硬件更改, 自动安装,假如你是换驱动也不好 用,重启就不能用, win 键+R 进入运行,输入 regedit,打开系统注 ...

  4. 怎么看待传菜机器人_太科幻了!这家顺德菜餐厅里全是机器人,炒菜送菜样样行...

    你见过机器人做饭吗? 做的还是正宗顺德味道! 1月12日,碧桂园旗下千玺机器人餐饮集团打造的Foodom机器人中餐厅旗舰店在广州珠江新城花城汇广场正式开业,机器人厨师齐齐亮相,煎.炸.焖.煮,十八般厨 ...

  5. SQL Server存储过程里全库查找引用的数据库对象(表、存储过程等)

    SQL Server存储过程全库匹配数据库对象(表.存储过程等) 简介 可以通过自定义存储过程sp_eachdb来遍历每个数据库然后结合sys.objects 关联sys.sql_modules后的d ...

  6. html里span和div,HTML div和span

    块代码 和 1.. .ccwTest { font-family: '.PingFang SC';">; color:white; margin:18px; padding:16px; ...

  7. html ul在div里居中,在DIV内水平居中UL

    我的div里面有ul,我希望将ul水平放在屏幕的中心位置. 可以在此处找到项目的完整代码:jsfiddle 我尝试过使用: margin: 0 auto; /* After setting the w ...

  8. 如何给WPS里全是图片的word文档中利用题注自动编号

    打开需要编号的word文档. 操作如下(可按图片中的数字序号顺序操作): 第一步,利用JS宏代码自动换行插入回车符 这里的代码需要复制dujianxiong大神的代码, https://blog.cs ...

  9. Word里全角转换成半角

    上次写一篇文章,不小心开了全角,结果文章编辑完,惨不忍睹,然后就想自编个宏一次性转换.起先想到的当然是像Excel一样使用ASC函数,但发现VBA的ASC不是全半角转换的功能,晕死,只能网上找答案,终 ...

最新文章

  1. 2018-2019-1 20189206 《Linux内核原理与分析》第六周作业
  2. 处女座的百日理财计划
  3. ASP.NET MVC中使用FluentValidation验证实体
  4. 光谱分类算法 matlab,Matlab K-means聚类算法对多光谱遥感图像进行分类(一)
  5. [leetcode] 105.从前序与中序遍历构造二叉树
  6. 小程序 怎么选云服务器,小程序如何选择云服务器
  7. jquery开发插件_如何开发jQuery插件
  8. 必读论文|20篇聊天机器人领域必读论文速递
  9. 《符号学:原理与推演》(一)符号的构成
  10. eNews 第二十三期/2007.04
  11. OpenGL LookAt函数理解
  12. 2020Android不死我不倒,作为一个程序员,你觉得最大的悲哀是什么
  13. 数据结构——树和二叉树章节思维导图
  14. chrome浏览器最新离线版下载 30-72版本全
  15. freetype 函数介绍
  16. Win7安装Ubuntu1804双系统
  17. 维基解密网店被封,呼吁全球抵制Coinbase
  18. 项目:基于ffmpeg的Gif表情包生成器
  19. applovin 面试经验
  20. [转载]scanf()函数释疑[作者]------knocker

热门文章

  1. android多媒体图文混排,android图文混排
  2. linux c 贝塞尔曲线_使用 logzero 在 Python 中进行简单日志记录 | Linux 中国
  3. c#位数不够0补充完_Java与C#比较,哪个语言更是适合你?
  4. python中闭包的作用_Python闭包及其作用域
  5. mysql备份到制定目录_写一个脚本定时自动备份mysql到指定目录
  6. 详解 equals() 方法和 hashCode() 方法
  7. Multiresolution Recurrent Neural Networks: An Application to...
  8. 使用客户端登陆ftp 500 OOPS: cannot change directory:/home/virftp解决
  9. 项目的权限设计的小计
  10. java10 WeakHashMap