HTML难点小记:一些简单标签的使用逻辑和实用化
HTML难点小记:一些简单标签的使用逻辑和实用化
@jarringslee
文章目录
- HTML难点小记:一些简单标签的使用逻辑和实用化
- 简单只是你的表象
- 标签不是随便用的
- `<div>` 滥用 vs 语义化标签的本质
- 嵌套规则的隐藏逻辑
- SEO 与可访问性的隐形关联
- 暗藏玄机的表单
- 复杂表单设计的三大原则
- 输入验证的进阶技巧
- 安全性初探:从 `name` 属性到 CSRF 攻击
- **避免 XSS 的 HTML 转义实践**
作为一名前端开发初学者,在跨过 HTML 这道门槛时,你可能会觉得它只是简单的标签罗列。然而,当你深入学习并参与实际项目后,会发现 HTML 的深度远超想象。它不仅是网页的骨架,更是连接设计、交互与性能的核心纽带。我们在学习和运用的过程中要从表象走向本质,从零散的标签使用迈向系统的工程化思维。
简单只是你的表象
HTML 的入门难度确实低,甚至可以说,只要你知道几个常用标签,就能搭建一个简单的页面。但正是这种简单会让我们产生错觉,认为掌握了基础语法就等于精通 HTML。
HTML虽然作为独立的语言来看,逻辑比编程语言都简单一些,但是它难就难在语义的精确表达和与CSS和JavaScript的深度协作,虽然很多东西我还没学,但是我们也需要了解到HTML并非孤立存在,它需要与CSS紧密配合来实现一个视觉效果,并与JavaScript协同完成交互功能在。
在数据结构的学习中,我们更多地关注算法逻辑和数据组织的抽象概念。而 HTML 则是将这些抽象逻辑具象化为用户可见的界面元素。这种从抽象到具象的转变需要前端开发者具备全新的思维方式。
以二叉树为例,在数据结构中,我们关心的是节点的关系、遍历算法等逻辑层面的内容。而在 HTML 中,如果要展示一个二叉树结构,我们需要考虑如何用标签来构建树的层级关系,如何通过 CSS 来布局节点的位置和样式,如何用 JavaScript 来实现节点的动态交互。这是一个将抽象数据结构映射到具体网页元素的过程,需要综合运用多种技术手段。
当你在浏览器中打开一个网页时,浏览器会对 HTML 文档进行解析,构建出文档对象模型(DOM)。DOM 是浏览器对 HTML 文档的内部表示,它决定了页面的结构和内容。
浏览器的渲染引擎会根据 DOM 和 CSSOM(CSS 渲染对象模型)来计算每个元素的布局和样式,最终将页面呈现给用户。因此,HTML 的编写方式会直接影响到 DOM 的构建效率和页面的渲染性能。例如,过多的嵌套标签会导致 DOM 树过于复杂,增加渲染时间;不合理的标签使用会影响 CSS 的选择器匹配效率。
标签不是随便用的
<div>
滥用 vs 语义化标签的本质
在初学 HTML 时,很多人可能会过度依赖 <div>
标签来构建页面布局。虽然 <div>
可以实现基本的页面结构划分,但它缺乏语义信息,无法向浏览器和辅助设备传达内容的真正含义。
语义化标签是为特定的内容和功能设计的,它们能够更准确地描述页面元素的含义。例如,
<nav>
用于定义导航链接部分,<header>
表示页面的头部区域,<footer>
用于页面的底部信息。使用语义化标签不仅可以提高页面的可读性和可维护性,还能提升 SEO 效果和无障碍体验。
传统布局 vs 语义化布局**
传统布局:
<div class="header"><div class="logo">炫酷帅气的logo</div><div class="nav"><a href="#">首页</a><a href="#">关于我们</a><a href="#">服务</a><a href="#">联系我们</a></div>
</div>
语义化布局:
<header><div class="logo">炫酷帅气的logo</div><nav><a href="#">首页</a><a href="#">关于我们</a><a href="#">服务</a><a href="#">联系我们</a></nav>
</header>
在语义化布局中,我们使用 <header>
和 <nav>
标签替换了部分 <div>
,使代码更具语义性。
示例:用 <article>
包裹文章却忽略 <time>
的常见错误
<article><h1>HTML难点小记:一些简单标签的使用逻辑和实用化</h1><p>ljl发表于 2025-05-11</p><p>文章内容</p>
</article>
在这个示例中,虽然使用了 <article>
标签来包裹文章内容,但忽略了对时间信息的语义化处理。正确的做法是使用 <time>
标签来标记时间:
<article><h1>HTML难点小记:一些简单标签的使用逻辑和实用化</h1><time datetime="2025-05-11">ljl发表于 2025-05-11</time><p>文章内容</p>
</article>
<time>
标签不仅能够明确标识时间信息,还可以被浏览器和屏幕阅读器更好地解析和利用。
嵌套规则的隐藏逻辑
HTML 标签的嵌套规则并非随意制定,它们背后有着严格的逻辑和语义考量。我们通过查阅资料,可以了解到嵌套规则的一些底层逻辑:
为什么
<a>
不能包裹<button>
?从语义上看,
<a>
标签用于定义超链接,而<button>
标签用于定义可点击的按钮。将<button>
放在<a>
中会导致语义混乱,因为一个按钮不应该出现在一个链接内部。此外,这种嵌套在实际渲染和交互中可能会引发问题,比如点击事件的冲突、样式应用的困难等。浏览器在解析这样的嵌套结构时,可能会进行修正或忽略部分标签,从而导致页面显示效果与预期不符。
<ul>
必须搭配<li>
的底层原因
<ul>
(无序列表)和<li>
(列表项)之间的搭配使用是基于列表的语义模型。<ul>
定义了一个项目列表,而<li>
则是列表中的具体项目。这种固定的搭配关系有助于浏览器正确解析列表结构,使其能够以合适的方式进行渲染,比如添加项目符号、计算列表项的布局等。如果违反这种嵌套规则,浏览器可能无法正确识别列表结构,进而影响页面的显示和可访问性。
SEO 与可访问性的隐形关联
屏幕阅读器如何解析
<nav>
与<header>
屏幕阅读器是一种辅助技术,用于帮助视障用户访问网页内容。它会根据 HTML 的语义化标签来解析页面结构,并向用户传达信息。当屏幕阅读器遇到
<nav>
标签时,它会识别出这是一个导航区域,通常会提供快捷键或特殊的导航模式,让用户能够快速跳转到导航链接。而<header>
标签则被识别为页面的头部信息区域,屏幕阅读器可能会告知用户页面的标题、标志等信息位于此处。
结构化数据对搜索引擎的影响实例
搜索引擎在抓取网页时,会分析页面的 HTML 结构来确定内容的相关性和重要性。使用语义化标签可以帮助搜索引擎更好地理解页面内容。例如,一个包含
<h1>
标签的标题会被认为是页面的核心内容之一,搜索引擎会给予它更高的权重。同样,<nav>
中的链接会被视为网站的重要导航路径,对网站的整体 SEO 表现有积极影响。通过合理的语义化标签使用,可以提升网页在搜索引擎结果页面中的排名,从而增加网站的流量。
暗藏玄机的表单
复杂表单设计的三大原则
字段分组:<fieldset>
与 <legend>
的实战应用
在复杂的表单中,合理地对字段进行分组可以提高用户的填写效率和体验。<fieldset>
标签用于将相关的表单元素分组,而 <legend>
标签则为分组提供标题说明。这部分我们还要配合好js的熟练运用。还是有点难度的
<form><fieldset><legend>个人信息</legend><label for="name">姓名:</label><input type="text" id="name" name="name"><br><label for="email">邮箱:</label><input type="email" id="email" name="email"></fieldset><fieldset><legend>账号设置</legend><label for="username">用户名:</label><input type="text" id="username" name="username"><br><label for="password">密码:</label><input type="password" id="password" name="password"></fieldset>
</form>
在这个示例中,我们使用 <fieldset>
将个人信息和账号设置分别分组,并用 <legend>
添加了分组标题。这样可以使表单结构更加清晰,用户在填写时能够更 easily 地理解每个字段的所属类别。
多步骤注册表单的 HTML 结构设计
<form id="multi-step-form"><fieldset><legend>步骤 1:基本信息</legend><label for="name-step1">姓名:</label><input type="text" id="name-step1" name="name-step1"><br><label for="email-step1">邮箱:</label><input type="email" id="email-step1" name="email-step1"><button type="button" onclick="showStep(2)">下一步</button></fieldset><fieldset id="step2" style="display: none;"><legend>步骤 2:账号设置</legend><label for="username-step2">用户名:</label><input type="text" id="username-step2" name="username-step2"><br><label for="password-step2">密码:</label><input type="password" id="password-step2" name="password-step2"><button type="button" onclick="showStep(1)">上一步</button><button type="button" onclick="submitForm()">提交</button></fieldset>
</form><script>function showStep(step) {document.getElementById('step1').style.display = step === 1 ? 'block' : 'none';document.getElementById('step2').style.display = step === 2 ? 'block' : 'none';}function submitForm() {// 表单提交逻辑alert('表单提交成功!');}
</script>
在这个多步骤表单示例中,我们通过 JavaScript 控制不同步骤的显示和隐藏,实现了分步骤填写表单的效果。这种设计可以减轻用户一次性填写大量信息的压力,提高表单的完成率。
输入验证的进阶技巧
pattern
属性的正则表达式陷阱
pattern
属性用于指定输入字段的值必须匹配的正则表达式模式。虽然它提供了一种方便的客户端验证方式,但在使用时需要注意一些潜在问题。
例如,以下代码使用 pattern
属性验证一个简单的电话号码格式:
<input type="text" name="phone" pattern="\d{3}-\d{3}-\d{4}" title="电话号码格式应为 xxx-xxx-xxxx">
这个正则表达式要求电话号码必须是三组数字,每组之间用短横线分隔。然而,用户可能会输入各种不同的格式,如没有短横线或短横线位置错误等情况。此外,不同的地区可能有不同的电话号码格式,这也可能使得正则表达式难以满足所有情况。
自定义验证消息的局限性
自定义验证消息可以通过 setCustomValidity()
方法来设置,但它存在一些局限性。例如,验证消息可能无法全面覆盖所有可能的错误情况,或者在不同的浏览器中显示效果可能有所不同。此外,当使用 setCustomValidity()
时,需要确保在输入有效时重置验证消息,否则可能会导致验证消息一直显示。
<input type="text" id="username" name="username" required>
<script>const usernameInput = document.getElementById('username');usernameInput.addEventListener('input', function() {if (this.value.length < 3) {this.setCustomValidity('用户名至少需要 3 个字符');} else {this.setCustomValidity(''); // 重置验证消息}});
</script>
为了解决这些局限性,可以结合后端验证和前端验证库来实现更全面的验证机制。同时,确保在前端验证中充分考虑各种可能的输入情况,并进行适当的测试。
安全性初探:从 name
属性到 CSRF 攻击
为什么表单必须要有 name
属性?
表单数据在提交时是通过 name
属性来标识每个字段的。如果没有 name
属性,表单字段的值将不会被包含在提交的数据中。例如:
<!-- 无 name 属性,数据无法提交 -->
<input type="email">
正确的写法是:
<input type="email" name="user_email">
在提交表单时,user_email
将作为键,与输入的邮箱值一起发送到服务器。
还有一个前几天刷短视频刷到的小知识点。
避免 XSS 的 HTML 转义实践
跨站脚本攻击(XSS)是一种常见的安全威胁,攻击者通过在表单输入中注入恶意脚本,这些脚本可能会在其他用户的浏览器中执行。说白了就是有人在你写好的HTML代码中在恶意输入代码导致一些不好的东西会在浏览器中执行。为了防止 XSS 攻击,需要对用户输入进行 HTML 转义,将特殊字符转换为对应的 HTML 实体。
例如,将 <
转换为 <
,>
转换为 >
,"
转换为 "
等。在服务器端和客户端都应该进行这样的转义处理,以确保用户输入不会被浏览器解释为 HTML 或 JavaScript 代码。
学好HTML的标签用法只是基础中的基础,难点在于逻辑的优化和交互运用。我们要在日后的实战当中不断联系对三件套的熟练运用。
相关文章:
HTML难点小记:一些简单标签的使用逻辑和实用化
HTML难点小记:一些简单标签的使用逻辑和实用化 jarringslee 文章目录 HTML难点小记:一些简单标签的使用逻辑和实用化简单只是你的表象标签不是随便用的<div> 滥用 vs 语义化标签的本质嵌套规则的隐藏逻辑SEO 与可访问性的隐形关联 暗藏玄机的表单…...
FastAPI实现JWT校验的完整指南
在现代Web开发中,构建安全的API接口是开发者必须面对的核心挑战之一。随着FastAPI框架的普及,其异步高性能特性与Python类型提示的结合,为开发者提供了构建高效服务的强大工具。本文将深入探讨如何基于FastAPI实现JWT(JSON Web To…...

物流无人机结构与载货设计分析!
一、物流无人机的结构与载货设计模块运行方式 1.结构设计特点 垂直起降与固定翼结合:针对复杂地形(如山区、城市)需求,采用垂直起降(VTOL)与固定翼结合的复合布局,例如“天马”H型无人机&am…...
Linux 常用命令集合
以下是一份 Linux 常用命令集合,涵盖文件操作、系统管理、网络管理、权限管理、进程管理等常见任务,并附上代码示例: 1. 文件与目录操作 命令作用示例ls列出目录内容ls -l(详细列表) ls -a(显示隐藏文件&a…...
LoRA(Low-Rank Adaptation)原理详解
LoRA(Low-Rank Adaptation)原理详解 LoRA(低秩适应)是一种参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)技术,旨在以极低的参数量实现大模型在特定任务上的高效适配。其核心思想基于低秩分解假设,即模型在适应新任务时,参数更新矩阵具有低秩特性,可用少量参…...

【MySQL】表空间结构 - 从何为表空间到段页详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

[特殊字符] 免税商品优选购物商城系统 | Java + SpringBoot + Vue | 前后端分离实战项目分享
一、项目简介 本项目为一款功能完备的 免税商品优选购物商城系统,采用 Java 后端 Vue 前端的主流前后端分离架构,支持用户、商家、管理员三类角色,满足商品浏览、下单、商家管理、后台运营等多项功能,适用于实际部署或作为毕业设…...

图像处理基础与图像变换
一、目的 通过本次实验,加深对数字图像的理解,熟悉MATLAB中的有关函数;应用DCT对图像进行变换;熟悉图像常见的统计指标,实现图像几何变换的基本方法。 二、内容与设计思想 1、实验内容:选择两幅图像&…...
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions) 在 Python 中,条件表达式(conditional expressions)提供了一种简洁的方式来在一行中实现 if/else 的逻辑。它…...

并发笔记-锁(一)
文章目录 1. 基本问题与锁的概念 (The Basic Idea)2. 锁的API与Pthreads (Lock API and Pthreads)3. 构建锁的挑战与评估标准 (Building A Lock & Evaluating Locks)4. 早期/简单的锁实现尝试及其问题 (Early/Simple Attempts)4.1 控制中断 (Controlling Interrupts)4.2 仅…...

【Bootstrap V4系列】学习入门教程之 组件-媒体对象(Media object)
Bootstrap V4系列 学习入门教程之 组件-媒体对象(Media object) 媒体对象(Media object)一、Example二、Nesting 嵌套三、Alignment 对齐四、Order 顺序五、Media list 媒体列表 媒体对象(Media object) B…...
ALSTOM D-984-0721 自动化组件
ALSTOM D-984-0721是一款高性能自动化组件,专为电力行业、石化行业和一般自动化应用的苛刻环境而设计。该型号旨在提供卓越的可靠性和精度,因其强大的输入/输出能力、耐用性和无缝集成能力而脱颖而出,成为现代工业自动化系统不可或缺的工具。…...

2025数字中国创新大赛-数字安全赛道数据安全产业积分争夺赛决赛Writeup
文章目录 综合场景赛-模型环境安全-3综合场景赛-数据识别与审计-1综合场景赛-数据识别与审计-2综合场景赛-数据识别与审计-3 有需要题目附件的师傅,可以联系我发送 综合场景赛-模型环境安全-3 upload文件嵌套了多个png图片字节数据,使用foremost直接分离…...

无法更新Google Chrome的解决问题
解决问题:原文链接:【百分百成功】Window 10 Google Chrome无法启动更新检查(错误代码为1:0x80004005) google谷歌chrome浏览器无法更新Chrome无法更新至最新版本? 下载了 就是更新Google Chrome了...

数字孪生市场格局生变:中国2025年规模214亿,工业制造领域占比超40%
一、技术深度解析:数字孪生的核心技术栈与演进 1. 从镜像到自治:数字孪生技术架构跃迁 三维重建突破:LiDAR点云精度达2cm,无人机测深刷新频率5Hz,支撑杭州城市大脑内涝预警模型提前6小时预测。AI算法融合:…...
ES6 (ECMAScript 2015) 详解
文章目录 一、ES6简介1.1 什么是ES6?1.2 为什么要学习ES6?1.3 浏览器支持情况 二、let和const关键字2.1 let关键字2.2 const关键字2.3 var、let和const的选择 三、箭头函数3.1 基本语法3.2 箭头函数的特点3.3 何时使用箭头函数 四、模板字符串4.1 基本语…...

全球首款无限时长电影生成模型SkyReels-V2本地部署教程:视频时长无限制!
一、简介 SkyReels-V2 模型集成了多模态大语言模型(MLLM)、多阶段预训练、强化学习以及创新的扩散强迫(Diffusion-forcing)框架,实现了在提示词遵循、视觉质量、运动动态以及视频时长等方面的全面突破。通过扩散强迫框…...
SQL 数据库监控:SQL语句监控工具与实践案例
SQL 数据库监控:SQL语句监控工具与实践案例 SQL语句监控的主要方法 SQL监控主要通过以下几种方式实现: 数据库内置监控功能:大多数数据库系统提供内置的SQL监控工具数据库性能视图/系统表:通过查询特定的系统视图获取SQL执行信…...
AB测试面试题
AB测试面试题 常考AB测试问答题(1)AB测试的优缺点是什么?(2)AB测试的一般流程/介绍一下日常工作中你是如何做A/B实验的?(3)第一类错误 vs 第二类错误 vs 你怎么理解AB测试中的第一、二类错误?(4)统计显著=实际显著?(5)AB测试效果统计上不显著?(6)实验组优于对…...

颠覆性技术革命:CAD DWG图形瓦片化实战指南
摘要 CAD DWG图形瓦片化技术通过金字塔模型构建多分辨率地图体系,实现海量工程图纸的Web高效可视化。本文系统解析栅格瓦片与矢量瓦片的技术原理,详细对比两者在生成效率、样式自由度和客户端性能等维度的差异,并结合工程建设、工业设计和智…...

不换设备秒通信,PROFINET转Ethercat网关混合生产线集成配置详解
在汽车制造中,连接Profinet控制的PLC(如西门子S7)与EtherCAT伺服驱动器(如倍福AX5000),实现运动控制同步。 在汽车制造的混合生产线集成中,实现西门子S7 PLC与倍福AX5000 EtherCAT伺服驱动器的…...

c++STL-string的使用
这里写自定义目录标题 string的使用string写成类模板的原因string的版本举例构造、析构函数和赋值重载构造函数和析构函数operator Iterators迭代器begin和endrbegin和rendcbegin和cend,crbegin和crend(c11) capacity容量有关函数不同编译器下…...

UNet网络 图像分割模型学习
UNet 由Ronneberger等人于2015年提出,专门针对医学图像分割任务,解决了早期卷积网络在小样本数据下的效率问题和细节丢失难题。 一 核心创新 1.1对称编码器-解码器结构 实现上下文信息与高分辨率细节的双向融合 如图所示:编码器进行了4步&…...

使用 SHAP 进行特征交互检测:揭示变量之间的复杂依赖关系
我们将探讨如何使用 SHAP(SHapley 加法解释)来检测和可视化机器学习模型中的特征交互。了解特征组合如何影响模型预测对于构建更透明、更准确的模型至关重要。SHAP 有助于揭示这些复杂的依赖关系,并使从业者能够以更有意义的方式解释模型决策…...

Python-MCPInspector调试
Python-MCPInspector调试 使用FastMCP开发MCPServer,熟悉【McpServer编码过程】【MCPInspector调试方法】-> 可以这样理解:只编写一个McpServer,然后使用MCPInspector作为McpClient进行McpServer的调试 1-核心知识点 1-熟悉【McpServer编…...

Java设计模式-策略模式(行为型)
策略模式详解 一、策略模式概述 1.1 基本概念 策略模式是一种行为型设计模式,它主要用于处理算法的不同变体。其核心思想是将算法的定义与使用分离开来,把一系列具体的算法封装成独立的策略类,这些策略类实现相同的策略接口。客户端可以在…...

html body 设置heigth 100%,body内元素设置margin-top出滚动条(margin 重叠问题)
今天在用移动端的时候发现个问题,html,body 设置 height:100% 会出现纵向滚动条 <!DOCTYPE html> <html> <head> <title>html5</title> <style> html, body {height: 100%; } * {margin: 0;padding: 0; } </sty…...

C语言模糊不清的知识
1、malloc、calloc、realloc的区别和用法 malloc实在堆上申请一段连续指定大小的内存区域,并以void*进行返回,不会初始化内存。calloc与malloc作用一致,只是calloc会初始化内存,自动将内存清零。realloc用于重新分配之前通过mallo…...

如何配置光猫+路由器实现外网IP访问内部网络?
文章目录 前言一、网络拓扑理解二、准备工作三、光猫配置3.1 光猫工作模式3.2 光猫端口转发配置(路由模式时) 四、路由器配置4.1 路由器WAN口配置4.2 端口转发配置4.3 动态DNS配置(可选) 五、防火墙设置六、测试配置七、安全注意事…...

springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化
一句话本质 为每个线程创建独立的变量副本,实现多线程环境下数据的安全隔离(线程操作自己的副本,互不影响)。 关键解读: 核心机制 • 同一个 ThreadLocal 对象(如示意图中的红色区域 tl)被多个线…...