不要在HTML中滥用div


Posted in HTML / CSS onMay 08, 2021

概述

做前端开发的同学都知道,一个网页的基本组成部分是 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>

<!-- h2,二级标题 -->

<h2>什么是语义化</h2>

<!-- h3,三级标题-->

<h3>标题元素</h3>

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

不要在HTML中滥用div

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

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

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

按钮

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

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

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

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

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

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

非语义化元素

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

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

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

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

总结

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

以上就是不要在HTML中滥用div的详细内容,更多关于不要在HTML中滥用div的资料请关注三水点靠木其它相关文章!

HTML / CSS 相关文章推荐
使用CSS3制作倾斜导航条和毛玻璃效果
Sep 12 HTML / CSS
css3实现可滑动跳转的分页插件示例
May 08 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
Mar 05 HTML / CSS
Html5新增标签与样式及让元素水平垂直居中
Jul 11 HTML / CSS
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
Jan 06 HTML / CSS
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
Jan 31 HTML / CSS
HTML中使用SVG与SVG预定义形状元素介绍
Jun 28 HTML / CSS
HTML5新增元素如何兼容旧浏览器有哪些方法
May 09 HTML / CSS
针对HTML5的Web Worker使用攻略
Jul 12 HTML / CSS
详解HTML5 data-* 自定义属性
Jan 24 HTML / CSS
html5中嵌入视频自动播放的问题解决
May 25 HTML / CSS
CSS3 Tab动画实例之背景切换动态效果
Aug 23 HTML / CSS
css display table 自适应高度、宽度问题的解决
CSS 新特性 contain控制页面的重绘与重排问题
CSS3新特性详解(五):多列columns column-count和flex布局
css position fixed 左右双定位的实现代码
Apr 29 #HTML / CSS
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
CSS3实现的侧滑菜单
CSS完成视差滚动效果
You might like
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
python一键去抖音视频水印工具
2018/09/14 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
大学学年自我鉴定
2013/10/28 职场文书
高二化学教学反思
2014/01/30 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js
HTML中的表格元素介绍
2022/02/28 HTML / CSS
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python