<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>HTML on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/html/</link><description>Recent content in HTML on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 10 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/html/index.xml" rel="self" type="application/rss+xml"/><item><title>HTML 5 新特性</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-001/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-001/</guid><description>&lt;h2 id="html5-新特性"&gt;HTML5 新特性&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;语义标签&lt;/li&gt;
&lt;li&gt;增强型表单&lt;/li&gt;
&lt;li&gt;视频和音频&lt;/li&gt;
&lt;li&gt;Canvas绘图&lt;/li&gt;
&lt;li&gt;SVG绘图&lt;/li&gt;
&lt;li&gt;地理定位&lt;/li&gt;
&lt;li&gt;拖拽API&lt;/li&gt;
&lt;li&gt;WebWorker&lt;/li&gt;
&lt;li&gt;WebStorage&lt;/li&gt;
&lt;li&gt;WebSocket&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="语义标签"&gt;语义标签&lt;/h2&gt;
&lt;p&gt;语义化标签使得页面的内容结构化，可以使开发者更方便清晰地构建页面的布局&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标签&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义了文档的头部区域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义了文档的尾部区域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义文档的导航&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义文档中的书&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;acticle&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义页面独立的内容区域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义页面侧边栏内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义用户可以看到或隐藏的额外细节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标签包含details元素的标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义对话框&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义自包含内容，如图表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定义文档主内容&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-001/image-01.webp"&gt;&lt;/p&gt;
&lt;h2 id="增强型表单"&gt;增强型表单&lt;/h2&gt;
&lt;p&gt;HTML5新增input输入特性，改善更好的输入控制和验证&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;输入类型&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;color&lt;/td&gt;
&lt;td&gt;主要用于选取颜色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;选取日期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;datetime&lt;/td&gt;
&lt;td&gt;选取日期（UTC时间）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;datetime-local&lt;/td&gt;
&lt;td&gt;选取日期（无时区）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;month&lt;/td&gt;
&lt;td&gt;选择一个月份&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;week&lt;/td&gt;
&lt;td&gt;选择周和年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;time&lt;/td&gt;
&lt;td&gt;选择一个时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;td&gt;包含email地址的输入域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;数值的输入域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;url&lt;/td&gt;
&lt;td&gt;url地址的输入域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tel&lt;/td&gt;
&lt;td&gt;定义输入电话号码的字段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;search&lt;/td&gt;
&lt;td&gt;用于搜索域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;range&lt;/td&gt;
&lt;td&gt;一个范围内数字值的输入域&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;HTML5也新增了五个表单元素&lt;/p&gt;</description></item><item><title>DOCTYPE</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/doctype/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/doctype/</guid><description>&lt;p&gt;&lt;code&gt;DOCTYPE&lt;/code&gt; 是一个声明，位于 HTML 文档的最顶部，指示浏览器使用哪种 HTML 或 XHTML 版本来渲染页面。它的主要作用是确保浏览器以标准模式解析文档，从而避免不同浏览器间的渲染差异。正确使用 DOCTYPE 可以提升页面的兼容性和可访问性。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;/code&gt;声明应该位于HTML文档的第一行，紧接着是&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;标签。&lt;/p&gt;
&lt;p&gt;例如，对于 HTML5 文档，你只需写：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lang&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;Document Title&amp;lt;/&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 页面内容 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个声明告诉浏览器该文档是一个HTML5文档。HTML5是最新的HTML标准，它包括了许多现代化的功能，如语义元素、表单控件、音频和视频等。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;DOCTYPE&lt;/code&gt; 的作用有以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;指定 HTML 版本&lt;/strong&gt;：浏览器根据 DOCTYPE 的声明来确定使用哪个 HTML 版本来渲染页面，从而保证页面在不同的浏览器上显示一致性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触发标准模式&lt;/strong&gt;：在 HTML 中，如果省略了 DOCTYPE 声明，浏览器会进入混杂模式（Quirks mode），这种模式下浏览器的渲染方式与早期的浏览器相同，可能导致页面的显示出现不可预测的错误。而指定了 DOCTYPE 声明，则会触发标准模式（Standards mode），使得浏览器按照 HTML 规范的要求进行页面渲染，从而保证页面的稳定性和可靠性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;供浏览器和开发人员参考&lt;/strong&gt;：DOCTYPE 声明还包含了有关 HTML 文档的元信息，例如所使用的 DTD（文档类型定义），以及其他的元数据信息，这些信息可以供浏览器和开发人员参考，帮助开发人员更好地了解和掌握 HTML 语言的特点和规范。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高网页加载速度&lt;/strong&gt;：指定 DOCTYPE 声明可以帮助浏览器更快地加载网页，因为浏览器知道要使用哪种渲染模式，从而更快地解析 HTML 文档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免代码错误&lt;/strong&gt;：指定 DOCTYPE 声明可以帮助开发人员在编写 HTML 代码时遵循标准，避免一些常见的代码错误，例如忘记关闭标签或者使用非法的属性和元素等等。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;除了HTML5的&lt;code&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;/code&gt;声明之外，还有一些其他版本的HTML和XHTML文档类型声明。这里是一些例子：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. HTML 4.01 Strict：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>语义化</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-003/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-003/</guid><description>&lt;h2 id="html-语义化是什么"&gt;HTML 语义化是什么？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTML 语义化是指使用 HTML 标签来正确地表示文档的结构和内容的方式。通过使用正确的标签和元素，可以使网页的结构更加清晰、易于理解，并且对搜索引擎和辅助技术（如屏幕阅读器）更友好。&lt;/li&gt;
&lt;li&gt;CSS 命名的语义化指的是在给 CSS 类名、选择器和 ID 命名时，使用具有语义的名称来描述元素的用途和功能。这样的命名方式可以使代码更具可读性、可维护性和可拓展性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么需要语义化"&gt;为什么需要语义化？&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;有利于搜索引擎优化（SEO）：搜索引擎依赖于网页的结构和语义来识别和理解网页内容。使用语义化的 HTML 标签可以提高网页在搜索引擎结果的排名，从而提高页面的 SEO（搜索引擎优化）。&lt;/li&gt;
&lt;li&gt;可读性和可维护性：使用语义化的代码可以增强代码的可读性和可维护性，有利于开发人员理解和维护代码。同时，遵循 W3C 标准的团队可以遵循相同的标准，减少差异化，提高团队的效率和协调能力。&lt;/li&gt;
&lt;li&gt;提高可访问性：语义化可以提高网页的可访问性，让页面更容易被搜索引擎、辅助技术（如屏幕阅读器）解析和理解，让更多的人能访问和理解网页。&lt;/li&gt;
&lt;li&gt;可间接提升网页的性能：在传统的 HTML 代码中，有时候会存在一些重复的标签和属性，导致代码冗余。使用语义化的 HTML 代码，可以减少这种冗余，让代码更加简洁和高效。&lt;/li&gt;
&lt;li&gt;面向未来的 HTML ，浏览器在未来可能提供更丰富的支持。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="一些常用的语义化标签及使用场景"&gt;一些常用的语义化标签及使用场景&lt;/h2&gt;
&lt;h3 id="布局相关的语义化标签"&gt;布局相关的语义化标签：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; 标签：用于定义文档或一个节的头部区域。通常包含网页的标题、导航栏、logo 或其他相关信息；作用是为页面提供附加的信息或功能，以帮助用户更好地理解或导航网页内容。适用于表示网页或一个节的顶部区域。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt; 标签：用于定义与页面内容相关但可以被视为独立于主要内容的部分。它通常用于侧边栏、广告、导航链接、附加信息或其他类似的内容。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; 标签：用于表页面中的一个独立部分，具有明确的主题或目的。例如文章、评论、产品列表、产品规格及描述等。一个页面可以包含多个不同主题的 section ；并且这个标签可以包含标题、段落、列表、表格等其他HTML元素。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; 标签：用于表示导航菜单，包括主导航、子导航、面包屑导航等。这个标签通常包含链接（&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; 标签）来指向其他页面或网站的部分。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; 标签：用于表示文档的页脚，通常包含版权信息、联系方式、法律声明等内容。它通常出现在页面的底部，并且只应该出现一次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; 标签：用于表示页面中的主要内容区域，是所有主要内容（包括头部、尾部和侧边栏）的容器。每个&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;元素都应该包含独特的内容，这部分内容在页面上是唯一的，且对整个页面来说是重要的。&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;标签不能包含在页面其它区块元素中，通常是&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;的子标签，或者是全局&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;的子标签。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt; 标签：用于表示联系信息，通常包含地址、电子邮件地址、电话号码等。这个标签通常用于定义页面或其部分内容的作者或拥有者的联系信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;举个栗子🌰：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 页面的头部 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;欢迎来到我的网站&lt;span style="color:#f92672"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;这是网站的标题，用于展示网站的核心信息。&lt;span style="color:#f92672"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 导航菜单 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;首页&lt;span style="color:#f92672"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;关于我们&lt;span style="color:#f92672"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;产品&lt;span style="color:#f92672"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;联系我们&lt;span style="color:#f92672"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 主要内容区域 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 第一个内容区块 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;section&amp;gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 第二个内容区块 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;aside&amp;gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;aside&amp;gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 联系信息 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;联系信息：&lt;span style="color:#f92672"&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;电话：(123) 456-7890&lt;span style="color:#f92672"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mailto:example@email.com&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;example@email.com&lt;span style="color:#f92672"&gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 页面的底部 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;amp;copy; 2023 My Website. All rights reserved. | 设计：北冥有锅
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="文本相关语义化标签"&gt;文本相关语义化标签：&lt;/h3&gt;
&lt;h4 id="figure-和-figcaptiondel-和-ins"&gt;figure 和 figcaption、del 和 ins&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; 标签：用于处理带有某些嵌入式内容的一组图，照片，代码清单等。表示独立的内容单元，它可以包含任何与主内容相关的附加内容，包括但不限于：文本内容、媒体文件、交互式内容等。使用&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;标签时应当注意内容的独立性和相关性，确保它与主内容是相关的，并且不依赖于主内容而存在。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt; 标签：&lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;标签是&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;元素的一部分，并且它是可选的。它应该包含在&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;标签内部，作为其第一个或最后一个子元素。一个&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;标签中只能有一个&lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;标签。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;del&amp;gt; &amp;amp; &amp;lt;ins&amp;gt;&lt;/code&gt; 标签：&lt;br&gt;
&lt;code&gt;&amp;lt;del&amp;gt;&lt;/code&gt; 用作已删除内容的标签。浏览器通常通过在已删除的文本上打一行删除线来呈现它。&lt;br&gt;
&lt;code&gt;&amp;lt;ins&amp;gt;&lt;/code&gt; 用于表示HTML文档中新添加的文本。它通常在文本上带有下划线。&lt;br&gt;
&lt;code&gt;&amp;lt;ins&amp;gt;&lt;/code&gt; 与&lt;code&gt;&amp;lt;del&amp;gt;&lt;/code&gt; 一起使用时更有用，他们都可以使用CSS属性进行更改。&lt;br&gt;
&lt;code&gt;&amp;lt;ins&amp;gt;&lt;/code&gt; 与&lt;code&gt;&amp;lt;del&amp;gt;&lt;/code&gt; 的特定属性：&lt;br&gt;
cite:URL =&amp;gt; 它指定资源的URL，该URL解释更改或删除文本的原因。&lt;br&gt;
datetime:YYYYMMDD || HH:MM:SS =&amp;gt; 它指定更改或删除文本的日期和时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;举个栗子🌰：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>HTML 元素分类</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-004/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-004/</guid><description>&lt;p&gt;根据标签的功能和表现，HTML 标签主要分为以下几类：&lt;/p&gt;
&lt;h3 id="1-块级元素block-level-elements"&gt;1. &lt;strong&gt;块级元素（Block-level Elements）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;块级元素通常独占一行，并且可以包含其他块级元素或内联元素，能够扩展至父容器的全部宽度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;li&gt;独占一行，默认情况下会在前后产生换行。&lt;/li&gt;
&lt;li&gt;宽度默认是父元素的 100%。&lt;/li&gt;
&lt;li&gt;可以设置 &lt;code&gt;width&lt;/code&gt;、&lt;code&gt;height&lt;/code&gt;、&lt;code&gt;margin&lt;/code&gt;、&lt;code&gt;padding&lt;/code&gt; 等布局属性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常见的块级元素&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;：无特定语义的容器，常用于布局。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;：段落标签。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; 到 &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;：标题标签，按重要性递减。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;：无序、有序列表及其项。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;：HTML5 语义化标签，分别表示页头、页尾、内容区块等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;h1&lt;/span&gt;&amp;gt;标题&amp;lt;/&lt;span style="color:#f92672"&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;这是一个段落。&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-内联元素inline-elements"&gt;2. &lt;strong&gt;内联元素（Inline Elements）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;内联元素与其他元素排列在同一行，且只占用其内容所需的宽度。它们不会独占一行，不能包含块级元素。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;li&gt;与相邻的内联元素排列在同一行。&lt;/li&gt;
&lt;li&gt;仅占据自身内容的宽度，不会在前后产生换行。&lt;/li&gt;
&lt;li&gt;不能设置 &lt;code&gt;width&lt;/code&gt;、&lt;code&gt;height&lt;/code&gt;（无效），但可以设置 &lt;code&gt;padding&lt;/code&gt; 和 &lt;code&gt;margin&lt;/code&gt;，只影响水平方向。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常见的内联元素&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;：无特定语义的容器，常用于局部样式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;：超链接。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt;：表示强调的文本，通常加粗显示。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;em&amp;gt;&lt;/code&gt;：表示强调的文本，通常斜体显示。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;：图像标签。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;：表单输入元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;这是一个段落，&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&amp;gt;点击这里&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt; 了解更多。&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-内联块元素inline-block-elements"&gt;3. &lt;strong&gt;内联块元素（Inline-block Elements）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;内联块元素是同时具备内联元素和块级元素特性的元素。它们在布局上是内联的，但表现为块状元素，因此可以设置宽高。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;li&gt;与其他元素排列在同一行，但可设置宽度和高度。&lt;/li&gt;
&lt;li&gt;不会自动换行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常见的内联块元素&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;：虽然图像显示在行内，但可以设置 &lt;code&gt;width&lt;/code&gt; 和 &lt;code&gt;height&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;：按钮。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;&lt;/code&gt;：文本输入框。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS 设置为 &lt;code&gt;display: inline-block&lt;/code&gt; 的元素&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;display: inline-block; width: 100px; height: 100px; background: red;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-自闭合元素self-closing-elements"&gt;4. &lt;strong&gt;自闭合元素（Self-closing Elements）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;自闭合元素是没有闭合标签的元素，因为它们没有任何内容。这类标签通常用于插入内容或进行控制，而不包含其他内容。&lt;/p&gt;</description></item><item><title>HTML 常见属性</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-005/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-005/</guid><description>&lt;p&gt;HTML 元素的属性是用于控制元素行为或样式的附加信息。&lt;/p&gt;
&lt;p&gt;以下是一些常见的 HTML 属性：&lt;/p&gt;
&lt;h3 id="1-通用属性global-attributes"&gt;1. &lt;strong&gt;通用属性（Global Attributes）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这些属性几乎可以应用于所有 HTML 元素：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;id&lt;/code&gt;&lt;/strong&gt;：元素的唯一标识符，用于 JavaScript 或 CSS 选择。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;class&lt;/code&gt;&lt;/strong&gt;：为元素指定一个或多个类名，用于 CSS 样式或 JavaScript 操作。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container header&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;style&lt;/code&gt;&lt;/strong&gt;：为元素设置内联样式。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;color: red;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;title&lt;/code&gt;&lt;/strong&gt;：为元素提供额外信息，当鼠标悬停在元素上时显示。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Click me!&amp;#34;&lt;/span&gt;&amp;gt;Click&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;data-*&lt;/code&gt;&lt;/strong&gt;：自定义属性，用于存储私有数据，以 &lt;code&gt;data-&lt;/code&gt; 为前缀，可以通过 JavaScript 访问。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data-user-id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;123&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-事件属性event-attributes"&gt;2. &lt;strong&gt;事件属性（Event Attributes）&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这些属性用于处理元素上的事件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;onclick&lt;/code&gt;&lt;/strong&gt;：定义单击事件处理函数。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onclick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;alert(&amp;#39;Clicked!&amp;#39;)&amp;#34;&lt;/span&gt;&amp;gt;Click me&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;onmouseover&lt;/code&gt;&lt;/strong&gt;：鼠标悬停时触发的事件。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onmouseover&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;console.log(&amp;#39;Mouse over&amp;#39;)&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;onkeydown&lt;/code&gt;&lt;/strong&gt;：按下键盘时触发的事件。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onkeydown&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;handleKeyDown(event)&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-表单相关属性"&gt;3. &lt;strong&gt;表单相关属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;type&lt;/code&gt;&lt;/strong&gt;：定义输入框类型，例如 &lt;code&gt;text&lt;/code&gt;、&lt;code&gt;password&lt;/code&gt;、&lt;code&gt;email&lt;/code&gt; 等。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;name&lt;/code&gt;&lt;/strong&gt;：定义表单元素的名称，用于表单提交。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;value&lt;/code&gt;&lt;/strong&gt;：定义表单元素的默认值。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Default value&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;placeholder&lt;/code&gt;&lt;/strong&gt;：为输入框提供占位符文本，提示用户输入。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Enter your name&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;disabled&lt;/code&gt;&lt;/strong&gt;：禁用输入元素，使其不可交互。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;disabled&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;required&lt;/code&gt;&lt;/strong&gt;：标记表单元素为必填项。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;required&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-链接和资源加载属性"&gt;4. &lt;strong&gt;链接和资源加载属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;href&lt;/code&gt;&lt;/strong&gt;：用于指定超链接的目标 URL。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt;&amp;gt;Go to example.com&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;src&lt;/code&gt;&lt;/strong&gt;：指定图像、脚本或其他资源的路径。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alt&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Image description&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;alt&lt;/code&gt;&lt;/strong&gt;：为图像提供替代文本，图像无法加载时显示。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alt&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Alternative text&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rel&lt;/code&gt;&lt;/strong&gt;：指定链接与目标文档的关系，常用于 &lt;code&gt;link&lt;/code&gt; 标签和 &lt;code&gt;a&lt;/code&gt; 标签。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;link&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rel&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;style.css&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;target&lt;/code&gt;&lt;/strong&gt;：定义链接的打开方式，常用值包括 &lt;code&gt;_self&lt;/code&gt;（当前窗口）和 &lt;code&gt;_blank&lt;/code&gt;（新窗口）。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt;&amp;gt;Open in new tab&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-多媒体属性"&gt;5. &lt;strong&gt;多媒体属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;controls&lt;/code&gt;&lt;/strong&gt;：为 &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; 或 &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; 元素添加播放控件。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;video&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;video.mp4&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;controls&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;video&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;autoplay&lt;/code&gt;&lt;/strong&gt;：自动播放音频或视频。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;audio&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;audio.mp3&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;autoplay&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;audio&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;loop&lt;/code&gt;&lt;/strong&gt;：音频或视频播放完后重新开始播放。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;video&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;video.mp4&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;loop&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;video&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;muted&lt;/code&gt;&lt;/strong&gt;：自动静音视频或音频。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;audio&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;audio.mp3&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;muted&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;audio&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="6-图像和媒体相关属性"&gt;6. &lt;strong&gt;图像和媒体相关属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;width&lt;/code&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;code&gt;height&lt;/code&gt;&lt;/strong&gt;：定义图像或视频的宽度和高度。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;100&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="7-iframe-属性"&gt;7. &lt;strong&gt;iframe 属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;src&lt;/code&gt;&lt;/strong&gt;：定义嵌入的网页 URL。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sandbox&lt;/code&gt;&lt;/strong&gt;：为嵌入内容提供更严格的限制，控制 iframe 的行为。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sandbox&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="8-语义化属性"&gt;8. &lt;strong&gt;语义化属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;role&lt;/code&gt;&lt;/strong&gt;：为屏幕阅读器和辅助技术提供语义化描述。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;role&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;navigation&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="9-布局和可访问性属性"&gt;9. &lt;strong&gt;布局和可访问性属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;hidden&lt;/code&gt;&lt;/strong&gt;：隐藏元素，元素不会显示在页面中。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hidden&lt;/span&gt;&amp;gt;This content is hidden&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;tabindex&lt;/code&gt;&lt;/strong&gt;：定义元素的 tab 键导航顺序。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tabindex&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&amp;gt;First&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tabindex&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&amp;gt;Second&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="常见考点"&gt;常见考点&lt;/h2&gt;
&lt;h3 id="1-全局属性global-attributes"&gt;1. &lt;strong&gt;全局属性（Global Attributes）&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;class&lt;/strong&gt;：用于给元素指定样式类，如何使用多个类？有哪些常见用法？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;id&lt;/strong&gt;：唯一标识元素，&lt;code&gt;id&lt;/code&gt; 的作用和注意事项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;style&lt;/strong&gt;：内联样式的作用及其优先级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;title&lt;/strong&gt;：为元素提供额外信息（鼠标悬停时显示）。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;em&gt;data-&lt;/em&gt; 属性&lt;/em&gt;*：自定义数据属性，如何在 JavaScript 中访问 &lt;code&gt;data-*&lt;/code&gt; 属性？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-事件属性event-attributes-1"&gt;2. &lt;strong&gt;事件属性（Event Attributes）&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;onclick&lt;/strong&gt;、&lt;strong&gt;onmouseover&lt;/strong&gt; 等事件处理属性。&lt;/li&gt;
&lt;li&gt;如何使用事件属性进行事件绑定？&lt;/li&gt;
&lt;li&gt;事件属性和 JavaScript 事件监听器（&lt;code&gt;addEventListener&lt;/code&gt;）的区别和应用场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-表单属性"&gt;3. &lt;strong&gt;表单属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;name&lt;/strong&gt;：用于提交表单数据时作为键名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;action&lt;/strong&gt;：表单提交的目标 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;method&lt;/strong&gt;：表单的提交方式（&lt;code&gt;GET&lt;/code&gt; 或 &lt;code&gt;POST&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;autocomplete&lt;/strong&gt;：是否启用表单自动填充。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;required&lt;/strong&gt;、&lt;strong&gt;pattern&lt;/strong&gt;、&lt;strong&gt;min/max&lt;/strong&gt; 等 HTML5 校验属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-输入控件相关属性"&gt;4. &lt;strong&gt;输入控件相关属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;value&lt;/strong&gt;：为输入控件设置默认值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;placeholder&lt;/strong&gt;：为输入框提供提示文本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;disabled&lt;/strong&gt;：禁用输入控件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;readonly&lt;/strong&gt;：只读属性，控件不能被修改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;maxlength/minlength&lt;/strong&gt;：输入字符长度的限制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;accept&lt;/strong&gt;：文件上传时，限制允许的文件类型（适用于 &lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot;&amp;gt;&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-媒体元素属性"&gt;5. &lt;strong&gt;媒体元素属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;src&lt;/strong&gt;：媒体文件的路径（适用于 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; 等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;alt&lt;/strong&gt;：图片无法加载时显示的替代文本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;controls&lt;/strong&gt;：是否为媒体文件显示默认控制条。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;autoplay&lt;/strong&gt;：媒体文件是否自动播放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;loop&lt;/strong&gt;：媒体文件是否循环播放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;muted&lt;/strong&gt;：媒体文件是否静音。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-超链接相关属性"&gt;6. &lt;strong&gt;超链接相关属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;href&lt;/strong&gt;：链接目标的 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;target&lt;/strong&gt;：定义链接打开的方式（如 &lt;code&gt;_blank&lt;/code&gt; 打开新窗口）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;download&lt;/strong&gt;：允许下载链接资源，而不是导航到资源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rel&lt;/strong&gt;：定义链接与当前文档的关系（如 &lt;code&gt;nofollow&lt;/code&gt;、&lt;code&gt;noopener&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-iframe-属性-1"&gt;7. &lt;strong&gt;iframe 属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;src&lt;/strong&gt;：嵌入的文档或网页的 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sandbox&lt;/strong&gt;：启用或禁用特定行为（如禁止脚本、表单提交等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;allow&lt;/strong&gt;：控制 iframe 内的权限（如允许摄像头、麦克风访问）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8-图像和图形属性"&gt;8. &lt;strong&gt;图像和图形属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;srcset&lt;/strong&gt;：为不同设备提供不同分辨率的图像资源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sizes&lt;/strong&gt;：配合 &lt;code&gt;srcset&lt;/code&gt;，定义不同视口下图像显示的尺寸。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;usemap&lt;/strong&gt;：指定图片使用的图像映射。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;height/width&lt;/strong&gt;：定义图片或其他元素的高度和宽度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="9-meta-标签属性"&gt;9. &lt;strong&gt;meta 标签属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;charset&lt;/strong&gt;：指定文档的字符编码（如 &lt;code&gt;UTF-8&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;name&lt;/strong&gt; 和 &lt;strong&gt;content&lt;/strong&gt;：为文档提供元信息（如 &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;viewport&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;http-equiv&lt;/strong&gt;：配合 &lt;code&gt;content&lt;/code&gt;，定义 HTTP 头信息（如 &lt;code&gt;refresh&lt;/code&gt;, &lt;code&gt;Content-Type&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="10-无障碍相关属性"&gt;10. &lt;strong&gt;无障碍相关属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;em&gt;aria-&lt;/em&gt; 属性&lt;/em&gt;*：为无障碍工具（如屏幕阅读器）提供更多语义信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;role&lt;/strong&gt;：指定元素的功能角色，增强无障碍性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="11-iframe-和图片的懒加载"&gt;11. &lt;strong&gt;iframe 和图片的懒加载&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;loading=&amp;ldquo;lazy&amp;rdquo;&lt;/strong&gt;：为图片和 iframe 启用懒加载。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-语言和方向属性"&gt;12. &lt;strong&gt;语言和方向属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lang&lt;/strong&gt;：指定元素或页面的语言（如 &lt;code&gt;lang=&amp;quot;en&amp;quot;&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dir&lt;/strong&gt;：指定文本的书写方向（如 &lt;code&gt;ltr&lt;/code&gt; 左到右，&lt;code&gt;rtl&lt;/code&gt; 右到左）。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>表单控件</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-006/</link><pubDate>Wed, 25 Sep 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-006/</guid><description>&lt;h2 id="01form表单"&gt;01、&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;表单&lt;/h2&gt;
&lt;p&gt;表单是比较重要的HTML元素，主要作用是向服务端提交数据。比如结合表单元素&lt;code&gt;input&lt;/code&gt;使用，通过内部的&lt;code&gt;button&lt;/code&gt;按钮提交（type=&amp;ldquo;submit&amp;rdquo;）表单数据。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;元素/属性&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;值/备注&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表单元素&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;action&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;提交表单的目标（服务端）地址url&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;提交数据的方式，就是数据传输的方式&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;get&lt;/strong&gt;：通过URL提交数据 &lt;code&gt;url?uname=1&amp;amp;age=2&lt;/code&gt;；&lt;strong&gt;post&lt;/strong&gt;，通过HTTP表单数据提交，键值格式。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;提交数据时打开action url的方式&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;_self&lt;/strong&gt;：当前窗口（默认值）；&lt;strong&gt;_blank&lt;/strong&gt;：新窗口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;enctype&lt;/td&gt;
&lt;td&gt;编码类型（encode type），规定了form表单在发送到服务器时候编码方式，不常用。&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;application/x-www-form-urlencoded&lt;/strong&gt;：编码所有字符（默认）；&lt;strong&gt;multipart/form-data&lt;/strong&gt; ：混合类型， 表单中有文件上传时使用；&lt;strong&gt;text/plain&lt;/strong&gt;：纯文体，空格转换为 “+” 加号，不对特殊字符编码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;submit()&lt;/td&gt;
&lt;td&gt;提交表单数据，通过js代码调用&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表单分组，默认样式：一个框&lt;/td&gt;
&lt;td&gt;便于表单样式管理的语义化元素&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;form&lt;/td&gt;
&lt;td&gt;from的id，当&lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt;不在form中时&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;disabled&lt;/td&gt;
&lt;td&gt;整个分组都不可用&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;legend&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;作为&lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt;的标题，显示在框上&lt;/td&gt;
&lt;td&gt;（legend /ˈledʒənd/ 铭文、图例）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #form &lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;solid&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;skyblue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;text-align&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #form &lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt; &lt;span style="color:#f92672"&gt;legend&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;solid&lt;/span&gt; rgb(&lt;span style="color:#ae81ff"&gt;236&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;175&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;43&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;form&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;form&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;action&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;_self&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;post&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;legend&lt;/span&gt;&amp;gt;登录&amp;lt;/&lt;span style="color:#f92672"&gt;legend&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;uname&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;请输入用户名&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;required&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxlength&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;36&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;upwd&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;required&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxlength&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;12&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;输入密码&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;submit-登录&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📢注意：&lt;/strong&gt;&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;提交数据时参数名为表单元素的name，因此表单控件须设置name属性。&lt;/p&gt;</description></item><item><title>meta 标签</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-007/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-007/</guid><description>&lt;h2 id="概览"&gt;概览&lt;/h2&gt;
&lt;p&gt;meta标签一般放在整个&lt;code&gt;html&lt;/code&gt;页面的&lt;code&gt;head&lt;/code&gt;部分，在&lt;code&gt;MDN&lt;/code&gt;中对他这样定义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;meta是&lt;strong&gt;文档级元数据元素&lt;/strong&gt;，用来表示那些不能由其它 HTML 元相关元素（&lt;code&gt;&amp;lt;base&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;或 &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;）之一表示的任何元数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;是不是感觉看起来很抽象？说白了就是为了传达信息。&lt;/p&gt;
&lt;p&gt;先看看&lt;code&gt;meta&lt;/code&gt; 元素定义的元数据的类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果设置了 &lt;code&gt;name&lt;/code&gt;属性，&lt;code&gt;meta&lt;/code&gt; 元素提供的是文档级别的元数据，应用于整个页面。&lt;/li&gt;
&lt;li&gt;如果设置了 &lt;code&gt;http-equiv&lt;/code&gt;属性，&lt;code&gt;meta&lt;/code&gt; 元素则是编译指令，提供的信息与类似命名的 HTTP 头部相同。&lt;/li&gt;
&lt;li&gt;如果设置了 &lt;code&gt;charset&lt;/code&gt;属性，&lt;code&gt;meta&lt;/code&gt; 元素是一个字符集声明，告诉文档使用哪种字符编码。&lt;/li&gt;
&lt;li&gt;如果设置了 &lt;code&gt;itemprop&lt;/code&gt; 属性，&lt;code&gt;meta&lt;/code&gt; 元素提供用户定义的元数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="name属性"&gt;name属性&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;name&lt;/code&gt;和&lt;code&gt;content&lt;/code&gt;一起使用，前者表示要表示的元数据的&lt;code&gt;名称&lt;/code&gt;，后者是元数据的&lt;code&gt;值&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="author"&gt;author&lt;/h3&gt;
&lt;p&gt;用来表示网页的作者的名字，例如某个组织或者机构。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;author&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;aaa@mail.abc.com&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="description"&gt;description&lt;/h3&gt;
&lt;p&gt;是一段简短而精确的、对页面内容的描述。以头条和taobao的&lt;code&gt;description&lt;/code&gt;标签为例：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-007/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-007/image-02.webp"&gt;&lt;/p&gt;
&lt;h3 id="keywords"&gt;keywords&lt;/h3&gt;
&lt;p&gt;与页面内容相关的关键词，使用逗号分隔。某些搜索引擎在遇到这些关键字时，会用这些关键字对文档进行分类。 还是以头条和taobao为例&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-007/image-03.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-007/image-04.webp"&gt;&lt;/p&gt;
&lt;h3 id="viewpoint"&gt;viewpoint&lt;/h3&gt;
&lt;p&gt;为 viewport（视口）的初始大小提供指示。目前仅用于移动设备。&lt;/p&gt;
&lt;p&gt;可能你也发现了，我们在&lt;code&gt;vscode&lt;/code&gt;中自动生成&lt;code&gt;html&lt;/code&gt;的代码片段时，会自动生成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;width&lt;/code&gt;用来设置 viewport 的宽度为设备宽度;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;initial-scale&lt;/code&gt;为设备宽度与 viewport 大小之间的缩放比例。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-007/image-05.webp"&gt;&lt;/p&gt;
&lt;h3 id="robots"&gt;robots&lt;/h3&gt;
&lt;p&gt;表示爬虫对此页面的处理行为，或者说，应当遵守的规则，是用来做搜索引擎抓取的。&lt;/p&gt;
&lt;p&gt;它的&lt;code&gt;content&lt;/code&gt;可以为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;all&lt;/code&gt;:搜索引擎将索引此网页，并继续通过此网页的链接索引文件将被检索&lt;/li&gt;
&lt;li&gt;&lt;code&gt;none&lt;/code&gt;:搜索引擎讲忽略此网页&lt;/li&gt;
&lt;li&gt;&lt;code&gt;index&lt;/code&gt;:搜索引擎索引此网页&lt;/li&gt;
&lt;li&gt;&lt;code&gt;follow&lt;/code&gt;:搜索引擎继续通过此网页的链接索引搜索其它的网页&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="renderer"&gt;renderer&lt;/h3&gt;
&lt;p&gt;用来指定双核浏览器的渲染方式，比如360浏览器，我们可以通过这个设置来指定360浏览器的渲染方式&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;renderer&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;webkit&amp;#34;&lt;/span&gt;&amp;gt; //默认webkit内核
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;renderer&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ie-comp&amp;#34;&lt;/span&gt;&amp;gt; //默认IE兼容模式
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;renderer&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ie-stand&amp;#34;&lt;/span&gt;&amp;gt; //默认IE标准模式
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="http-equiv"&gt;http-equiv&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;http-equiv&lt;/code&gt;也是和&lt;code&gt;content&lt;/code&gt;一起使用，前者表示要表示的元数据的&lt;code&gt;名称&lt;/code&gt;，后者是元数据的&lt;code&gt;值&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http-equiv&lt;/code&gt; 所有允许的值都是特定 HTTP 头部的名称，&lt;/p&gt;</description></item><item><title>响应式图片</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-008/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-008/</guid><description>&lt;p&gt;响应式是指实现不同屏幕分辨率的终端上浏览网页的不同展示方式。&lt;/p&gt;
&lt;p&gt;本知识点的主要内容有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么要使用响应式图片&lt;/li&gt;
&lt;li&gt;怎么实现响应式图片&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1为什么要使用响应式图片"&gt;1、为什么要使用响应式图片&lt;/h2&gt;
&lt;p&gt;假如有一张图片的显示宽度为200px，那么，它在 &lt;code&gt;1x&lt;/code&gt;（即设备像素比为 1 的显示器） 的显示器上，是占了 200 个物理像素（即实际所占的像素）；它在 &lt;code&gt;2x&lt;/code&gt; 的显示器上，实际上是占了 400 个物理像素；在 &lt;code&gt;3x&lt;/code&gt; 的显示器上，实际上是占了 600 个物理像素；在 &lt;code&gt;4x&lt;/code&gt; 的显示器上就是占了 800 个物理像素。&lt;/p&gt;
&lt;p&gt;如果这个图片只提供 200 像素的尺寸，那么在 &lt;code&gt;2x~4x&lt;/code&gt; 的显示器上看起来就很模糊。如果只提供 800 像素的版本，那么在 &lt;code&gt;1x~3x&lt;/code&gt; 的设备上会显得多余，因为加载时间会相较长，所以我们要使用响应式图片。&lt;/p&gt;
&lt;p&gt;再比如一个场景，相同的banner，在电脑上需要使用大图，但是手机上面使用小图，不然会造成手机上加载慢浪费流量等问题，这也可以使用响应式图片来解决。&lt;/p&gt;
&lt;h2 id="2实现方法"&gt;2、实现方法&lt;/h2&gt;
&lt;h3 id="css3-media-query"&gt;css3 media query&lt;/h3&gt;
&lt;p&gt;一个办法是使用&lt;code&gt;backgound-image&lt;/code&gt;结合媒体查询，如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.banner&lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-image: url&lt;span style="color:#f92672"&gt;(&lt;/span&gt;/static/large.jpg&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@media screen and &lt;span style="color:#f92672"&gt;(&lt;/span&gt;max-width: 767px&lt;span style="color:#f92672"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-image: url&lt;span style="color:#f92672"&gt;(&lt;/span&gt;/static/small.jpg&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种方法的缺点是对SEO不太友好，因为如果使用img标签还可以写个alt属性。&lt;/p&gt;
&lt;h3 id="picture标签"&gt;picture标签&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;picture&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;source&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;srcset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner_w1000.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;media&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(min-width: 801px)&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;source&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;srcset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner_w800.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;media&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(max-width: 800px)&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner_w800.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alt&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;picture&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如上，如果页面宽度大于800px（PC），则加载大图，而在手机上加载小图。这样写浏览器就只会加载source里面的一张图片。但是如果是用js动态插进去的，它还是会去加载两张，只有写在html里面加载初始化页面的时候才只加载一张。&lt;/p&gt;
&lt;p&gt;picture必须要写img标签，否则无法显示，对picture的操作最后都是在img上面，例如onload事件是在img标签触发的，picture和source是不会进行layout的，它们的宽和高都是0。&lt;/p&gt;
&lt;p&gt;另外使用source，还可以对图片格式做一些兼容处理：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;picture&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;source type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;image/webp&amp;#34;&lt;/span&gt; srcset&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner.webp&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;img src&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;banner.jpg&amp;#34;&lt;/span&gt; alt&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/picture&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;webp在保持同等清晰度的情况下，体积可以减少一半，但是目前只有Chrome支持，Safari和firefox一直处于实验阶段，所以其它的浏览器如firefox将会加载jpg格式的照片：&lt;/p&gt;</description></item><item><title>多媒体技术</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-009/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-009/</guid><description>&lt;p&gt;对于大多数前端工程师来说，音视频技术是一个比较少涉足的领域，&lt;/p&gt;
&lt;p&gt;本知识点主要介绍流媒体技术中的&lt;strong&gt;文本&lt;/strong&gt;、&lt;strong&gt;图形&lt;/strong&gt;、&lt;strong&gt;图像&lt;/strong&gt;、&lt;strong&gt;音频&lt;/strong&gt;和&lt;strong&gt;视频&lt;/strong&gt;多种理论知识，涉及到播放器、web媒体技术、主流框架等内容。&lt;/p&gt;
&lt;h3 id="一音视频基础"&gt;一、音视频基础&lt;/h3&gt;
&lt;h4 id="11-视频"&gt;1.1 视频&lt;/h4&gt;
&lt;h5 id="111-基础概念"&gt;1.1.1 基础概念&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;码率&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;单位时间内取样率越大，精度就越高，处理出来的文件就越接近原始文件。&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;帧率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;对视频来说，帧率对应这观看卡顿。帧率越高，流畅度越高，低帧率会造成视觉卡顿。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;压缩率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;经过压缩后文件的大小 / 原始文件的大小 * 100% = 压缩率。编码压缩越小越好，但压得越小，解压时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;分辨率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用于度量图像内数据量多少的一个参数，和视频清晰度息息相关。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5 id="112-视频容器格式"&gt;1.1.2 视频容器格式&lt;/h5&gt;
&lt;p&gt;容器格式相信大家经常见到：&lt;br&gt;
MP4、AVI、FLV、TS/M3U8、WebM、OGV、MOV&amp;hellip;&lt;/p&gt;
&lt;h5 id="112-视频编码格式"&gt;1.1.2 视频编码格式&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;H.264&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;目前最流行的编码格式。&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;H.265&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;新型的编码格式，高效的视频编码。用来以替代H.264/AVC编码标准。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VP9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VP9是WebM Project开发的下一代视频编码格式 。VP9支持从低比特率压缩到高质量超高清的所有Web和移动用例，并额外支持10/12位编码和HDR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AV1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AOM（Alliance for Open Media，开放媒体联盟）制定的一个开源、免版权费的视频编码格式。AV1是google制定的VP9标准的继任者，也是H265强有力的竞争者。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="12-音频"&gt;1.2 音频&lt;/h4&gt;
&lt;h5 id="121-基础概念"&gt;1.2.1 基础概念&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;采样率&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;音频采样率是指录音设备在一秒钟内对声音信号的采样次数，采样频率越高声音的还原就越真实越自然。&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;采样大小&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;一秒钟所采的样本数为比特率，每个样本中信息的比特数就是位深，即采样精度，单位为Bit。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;比特率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;指每秒传送的比特(bit)数，又称数据信号速率。单位为比特/秒、千比特/秒或兆比特/秒。比特率越高，表示单位时间传送的数据就越多。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;压缩率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;原始音频数据与通过PCM等压缩编码技术压缩后的数据大小的比率&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5 id="122-音频容器格式"&gt;1.2.2 音频容器格式&lt;/h5&gt;
&lt;p&gt;音频格式也比较常见：WAV、AIFF、AMR、MP3、Ogg&amp;hellip;&lt;/p&gt;
&lt;h5 id="123-音频编码格式"&gt;1.2.3 音频编码格式&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;PCM&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;脉冲编码调制(Pulse Code Modulation,PCM)，PCM是数字通信的编码方式之一。&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AAC-LC(MPEG AAC Low Complexity)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;低复杂度编码解码器（AAC-LC — 低复杂度高级音频编码）是低比特率、优质音频 的高性能音频编码解码器。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AAC-LD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;（又名AAC低延迟或MPEG-4低延迟音频编码器），为电话会议和OTT服务量身打造的低延迟音频编解码器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LAC（Free Lossless Audio Codec）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;免费无损音频编解码器。是一套著名的自由音频压缩编码，其特点是无损压缩。 2012年以来它已被很多软件及硬件音频产品（如CD等）所支持。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="13-常见标签"&gt;1.3 常见标签&lt;/h4&gt;
&lt;h5 id="131-audio-元素"&gt;1.3.1 &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; 元素&lt;/h5&gt;
&lt;h6 id="1311-基本用途"&gt;1.3.1.1 基本用途&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; 元素用于在网页中嵌入音频内容。它可以播放音乐、播客、音效等。&lt;/p&gt;</description></item><item><title>Canvas 和 SVG</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/canvas-svg/</link><pubDate>Wed, 09 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/canvas-svg/</guid><description>&lt;h2 id="1canvas"&gt;1.Canvas&lt;/h2&gt;
&lt;p&gt;Canvas 是 HTML5 中新增的一个元素，它提供了一种通过 JavaScript 来绘制图形的方式，使用笔刷绘制2D图案。通过 Canvas，我们可以在网页中动态地绘制出各种图形、图表、动画等内容，实现更丰富的交互效果。&lt;/p&gt;
&lt;h3 id="工作方式"&gt;工作方式&lt;/h3&gt;
&lt;p&gt;Canvas 的工作方式是，我们首先在 HTML 页面中添加一个 &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; 元素，并指定其宽度和高度，然后在 JavaScript 中获取该元素的上下文对象，并通过调用它的方法来绘制图形。Canvas 的上下文对象有多种，包括 2D 上下文、WebGL 上下文等，我们可以根据需求选择相应的上下文对象来进行绘制。&lt;/p&gt;
&lt;h3 id="常用属性"&gt;常用属性&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;效果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fillStyle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;填充颜色。默认为黑色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strokeStyle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;描边颜色。默认为黑色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lineWidth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;线条宽度。默认为 1 像素&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lineCap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;线条末端的样式,可选值有 butt、round 和 square。默认为 butt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lineJoin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;线条相交处的样式,可选值有 miter、round 和 bevel。默认为 miter。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;miterLimit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;线条相交处的最大斜接长度。默认为 10 像素&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;globalAlpha&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;绘制的透明度。默认为 1（不透明）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shadowColor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;阴影颜色。默认为黑色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shadowOffsetX&lt;/code&gt;、&lt;code&gt;shadowOffsetY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;阴影的偏移量和模糊程度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shadowBlur&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;模糊程度&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="优缺点"&gt;优缺点&lt;/h3&gt;
&lt;h4 id="优点"&gt;优点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;基于矢量绘制，图形可以自由缩放而不失真&lt;/li&gt;
&lt;li&gt;具有良好的跨浏览器兼容性&lt;/li&gt;
&lt;li&gt;通过 JavaScript 动态生成图形，可以更加灵活地控制图形的显示和交互&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="缺点"&gt;缺点&lt;/h4&gt;
&lt;p&gt;无法处理复杂的交互事件、不支持跨域图像等&lt;/p&gt;
&lt;h3 id="使用实例"&gt;使用实例&lt;/h3&gt;
&lt;p&gt;这个实例中，我们使用了一个 HTML5 的 Canvas 元素，它的宽度和高度分别为 200 像素。在 JavaScript 中，我们获取了这个元素，并通过 &lt;code&gt;getContext&lt;/code&gt; 方法获取了它的上下文对象。然后，我们使用 &lt;code&gt;fillStyle&lt;/code&gt; 属性设置了矩形的填充颜色为红色，并使用 &lt;code&gt;fillRect&lt;/code&gt; 方法绘制了一个起点坐标为 (50,50)，宽度为 100 像素，高度为 100 像素的矩形。&lt;/p&gt;</description></item><item><title>Web Storage</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/web-storage/</link><pubDate>Wed, 09 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/web-storage/</guid><description>&lt;h2 id="一-简介"&gt;一、 简介&lt;/h2&gt;
&lt;p&gt;浏览器本地存储是指浏览器提供的一种机制，允许 Web 应用程序在浏览器端存储数据，以便在用户下次访问时可以快速获取和使用这些数据。一共两种存储方式：localStorage 和 sessionStorage。下面介绍下两种缓存的特性和在内部平台的一些应用。&lt;/p&gt;
&lt;h2 id="二localstorage-和-sessionstorage"&gt;二、localStorage 和 sessionStorage&lt;/h2&gt;
&lt;h3 id="21区别"&gt;2.1、区别&lt;/h3&gt;
&lt;p&gt;localStorage 和 sessionStorage 的主要区别是生命周期，具体区别如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;localStorage&lt;/th&gt;
&lt;th&gt;sessionStorage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;生命周期&lt;/td&gt;
&lt;td&gt;持久化存储：除非自行删除或清除缓存，否则一直存在&lt;/td&gt;
&lt;td&gt;会话级别的存储：浏览器标签页或窗口关闭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;作用域&lt;/td&gt;
&lt;td&gt;相同浏览器，同域名，不同标签，不同窗口&lt;/td&gt;
&lt;td&gt;相同浏览器，同域名，同源窗口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;获取方式&lt;/td&gt;
&lt;td&gt;window.localStorage&lt;/td&gt;
&lt;td&gt;window.sessionStorage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存储容量&lt;/td&gt;
&lt;td&gt;5M&lt;/td&gt;
&lt;td&gt;5M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;容量限制的目的是防止滥用本地存储空间，导致用户浏览器变慢。&lt;/p&gt;
&lt;h3 id="22浏览器兼容性"&gt;2.2、浏览器兼容性&lt;/h3&gt;
&lt;p&gt;1）现在的浏览器基本上都是支持这两种 Storage 特性的。各浏览器支持版本如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chrome&lt;/th&gt;
&lt;th&gt;Firefox&lt;/th&gt;
&lt;th&gt;IE&lt;/th&gt;
&lt;th&gt;Opera&lt;/th&gt;
&lt;th&gt;Safari&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;Opera Mobile&lt;/th&gt;
&lt;th&gt;Safari Mobile&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;localStorage&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;iOS 3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sessionStorage&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;iOS 3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2）如果使用的是老式浏览器，比如Internet Explorer 6、7 或者其他，就需要在使用前检测浏览器是否支持本地存储或者是否被禁用。以 localStorage 为例：&lt;/p&gt;</description></item><item><title>跨域通信</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-012/</link><pubDate>Mon, 14 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-012/</guid><description>&lt;h2 id="什么是跨域"&gt;什么是跨域&lt;/h2&gt;
&lt;p&gt;在了解跨域之前，我们必须要了解一下同源策略。 跨域问题其实就是浏览器的同源策略造成的。&lt;/p&gt;
&lt;h3 id="同源策略"&gt;同源策略&lt;/h3&gt;
&lt;p&gt;同源策略限制了从同一个源加载的文档或脚本如何与另一个源的资源进行交互。这是浏览器的一个用于隔离潜在恶意文件的重要的安全机制。同源指的是：&lt;strong&gt;协议&lt;/strong&gt;、&lt;strong&gt;端口号&lt;/strong&gt;、&lt;strong&gt;域名&lt;/strong&gt;必须一致。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;跨源资源共享&lt;/strong&gt;（[CORS]，或通俗地译为跨域资源共享）是一种基于 [HTTP] 头的机制，该机制通过允许服务器标示除了它自己以外的其他[源] （域、协议或端口），使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求，该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中，浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="为什么会产生跨域"&gt;为什么会产生跨域&lt;/h2&gt;
&lt;p&gt;下表给出了与 URL &lt;a href="http://wmq.com/dir/page.html"&gt;wmq.com/dir/page.ht…&lt;/a&gt; 的源进行对比的示例:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;是否跨域&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://wmq.com/dir/page.html"&gt;wmq.com/dir/page.ht…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;同源&lt;/td&gt;
&lt;td&gt;完全相同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://wmq.com/dir/inner/another.html"&gt;wmq.com/dir/inner/a…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;同源&lt;/td&gt;
&lt;td&gt;只有路径不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://wmq.com/secure.html"&gt;wmq.com/secure.html&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;跨域&lt;/td&gt;
&lt;td&gt;协议不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://wmq.com:81/dir/etc.html"&gt;wmq.com:81/dir/etc.htm…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;跨域&lt;/td&gt;
&lt;td&gt;端口不同 ( http:// 默认端口是80)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://news.company.com/dir/other.html"&gt;news.company.com/dir/other.h…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;跨域&lt;/td&gt;
&lt;td&gt;主机不同&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;同源策略：protocol（协议）、domain（域名）、port（端口）三者必须一致。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同源政策主要限制了三个方面：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前域下的 js 脚本不能够访问其他域下的 cookie、localStorage 和 indexDB。&lt;/li&gt;
&lt;li&gt;当前域下的 js 脚本不能够操作访问操作其他域下的 DOM。&lt;/li&gt;
&lt;li&gt;当前域下 ajax 无法发送跨域请求。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;源政策的目的主要是为了保证用户的信息安全，它只是对 js 脚本的一种限制，并不是对浏览器的限制，对于一般的 img、或者script 脚本请求都不会有跨域的限制，这是因为这些操作都不会通过响应结果来进行可能出现安全问题的操作。&lt;/p&gt;
&lt;h2 id="有哪些解决跨域的办法"&gt;有哪些解决跨域的办法&lt;/h2&gt;
&lt;h3 id="cors"&gt;CORS&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;CORS&lt;/strong&gt;: 通过设置服务器端的响应头来允许跨域请求。这需要在服务器端进行配置，以允许特定的来源访问资源。例如，在Node.js的Express框架中，可以使用以下代码来设置CORS：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;express&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;use&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;req&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Access-Control-Allow-Origin&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 允许所有来源访问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Access-Control-Allow-Headers&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Origin, X-Requested-With, Content-Type, Accept&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 允许的请求头
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Access-Control-Allow-Methods&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;GET, POST, PUT, DELETE, OPTIONS&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 允许的请求方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 其他路由和中间件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;listen&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3000&lt;/span&gt;, () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Server is running on port 3000&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="减少options请求次数"&gt;减少OPTIONS请求次数&lt;/h4&gt;
&lt;p&gt;在跨域请求中，浏览器会自动处理一些非简单请求的预检流程，这包括&amp;quot;预检请求&amp;quot;（也被称为CORS预检请求）和&amp;quot;OPTIONS请求&amp;quot;。预检请求是发起一个HTTP OPTIONS请求到服务器，以确认目标资源是否支持跨域。这种机制是为了兼容同源策略而产生的，但有时这种额外的请求会导致性能问题。&lt;/p&gt;</description></item><item><title>表单验证</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-013/</link><pubDate>Mon, 14 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-013/</guid><description>&lt;p&gt;HTML 表单是用于收集用户输入数据的重要元素，通常用于提交到服务器进行处理。它包括一系列控件，如文本输入框、按钮、复选框、单选按钮、文件上传等。表单通过 &lt;code&gt;form&lt;/code&gt; 标签定义，用户可以通过这些控件与网页进行交互。&lt;/p&gt;
&lt;h3 id="1-基础结构"&gt;1. &lt;strong&gt;基础结构&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;表单通过 &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 标签创建，表单的 &lt;code&gt;action&lt;/code&gt; 属性定义数据提交的目标 URL，&lt;code&gt;method&lt;/code&gt; 属性定义提交方式（如 &lt;code&gt;GET&lt;/code&gt; 或 &lt;code&gt;POST&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;form&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;action&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/submit&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Submit&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-表单控件"&gt;2. &lt;strong&gt;表单控件&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;HTML 表单提供了多种用户输入控件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文本输入&lt;/strong&gt; (&lt;code&gt;&amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码输入&lt;/strong&gt; (&lt;code&gt;&amp;lt;input type=&amp;quot;password&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单选框和复选框&lt;/strong&gt; (&lt;code&gt;&amp;lt;input type=&amp;quot;radio&amp;quot;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下拉列表&lt;/strong&gt; (&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按钮&lt;/strong&gt; (&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件上传&lt;/strong&gt; (&lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐藏输入&lt;/strong&gt; (&lt;code&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-表单的属性"&gt;3. &lt;strong&gt;表单的属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;action&lt;/strong&gt;：指定表单数据提交到的 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;method&lt;/strong&gt;：定义提交方式，常用 &lt;code&gt;GET&lt;/code&gt;（将数据附在 URL 后）和 &lt;code&gt;POST&lt;/code&gt;（将数据放入 HTTP 请求体中）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;enctype&lt;/strong&gt;：指定数据的编码类型，常用于文件上传（如 &lt;code&gt;multipart/form-data&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;autocomplete&lt;/strong&gt;：启用或禁用浏览器的自动完成功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-表单校验"&gt;4. &lt;strong&gt;表单校验&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;HTML5 引入了许多新的表单校验功能，能够减少 JavaScript 校验代码的复杂度。校验功能包括：&lt;/p&gt;</description></item><item><title>实体字符（转义字符）</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-014/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-014/</guid><description>&lt;p&gt;HTML 的实体字符（HTML Entities）是用于显示某些特殊字符或符号的编码形式。&lt;/p&gt;
&lt;p&gt;HTML 中某些符号具有特殊含义，例如 &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt; 等字符不能直接在网页内容中使用，所以需要使用实体字符来表示它们。&lt;/p&gt;
&lt;h3 id="常见的-html-实体字符"&gt;常见的 HTML 实体字符&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;空格和控制字符&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;nbsp;&lt;/code&gt;&lt;/strong&gt;：空格字符 (non-breaking space)&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;nbsp; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 表示一个空格 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;lt;&lt;/code&gt;&lt;/strong&gt;：小于号 &lt;code&gt;&amp;lt;&lt;/code&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;lt;div&amp;amp;gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 表示 &amp;lt;div&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;gt;&lt;/code&gt;&lt;/strong&gt;：大于号 &lt;code&gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;gt;/div&amp;amp;gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 表示 &amp;lt;/div&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;amp;&lt;/code&gt;&lt;/strong&gt;：与符号 &lt;code&gt;&amp;amp;&lt;/code&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;amp; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 表示 &amp;amp; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;quot;&lt;/code&gt;&lt;/strong&gt;：双引号 &lt;code&gt;&amp;quot;&lt;/code&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;quot;Hello&amp;amp;quot; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 表示 &amp;#34;Hello&amp;#34; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;apos;&lt;/code&gt;&lt;/strong&gt;：单引号 &lt;code&gt;'&lt;/code&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;apos;Hello&amp;amp;apos; &lt;span style="color:#75715e"&gt;&amp;lt;!-- 表示 &amp;#39;Hello&amp;#39; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;数学符号&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;plus;&lt;/code&gt;&lt;/strong&gt;：加号 &lt;code&gt;+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;minus;&lt;/code&gt;&lt;/strong&gt;：减号 &lt;code&gt;−&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;times;&lt;/code&gt;&lt;/strong&gt;：乘号 &lt;code&gt;×&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;divide;&lt;/code&gt;&lt;/strong&gt;：除号 &lt;code&gt;÷&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;货币符号&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;dollar;&lt;/code&gt;&lt;/strong&gt;：美元符号 &lt;code&gt;$&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;euro;&lt;/code&gt;&lt;/strong&gt;：欧元符号 &lt;code&gt;€&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;pound;&lt;/code&gt;&lt;/strong&gt;：英镑符号 &lt;code&gt;£&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;yen;&lt;/code&gt;&lt;/strong&gt;：日元符号 &lt;code&gt;¥&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;其他常见符号&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;copy;&lt;/code&gt;&lt;/strong&gt;：版权符号 &lt;code&gt;©&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;reg;&lt;/code&gt;&lt;/strong&gt;：注册商标符号 &lt;code&gt;®&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;trade;&lt;/code&gt;&lt;/strong&gt;：商标符号 &lt;code&gt;™&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;sect;&lt;/code&gt;&lt;/strong&gt;：章节符号 &lt;code&gt;§&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;deg;&lt;/code&gt;&lt;/strong&gt;：度数符号 &lt;code&gt;°&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;strong&gt;希腊字母&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;alpha;&lt;/code&gt;&lt;/strong&gt;：α&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;beta;&lt;/code&gt;&lt;/strong&gt;：β&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;gamma;&lt;/code&gt;&lt;/strong&gt;：γ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;delta;&lt;/code&gt;&lt;/strong&gt;：δ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="为什么需要实体字符"&gt;为什么需要实体字符？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;避免 HTML 解析冲突&lt;/strong&gt;：例如 &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt; 等符号在 HTML 中有特定的用途，用实体字符可以避免冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显示特殊符号&lt;/strong&gt;：例如版权符号、商标符号或货币符号等，不能直接在键盘上输入，使用实体字符可以确保正确显示。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见考点"&gt;常见考点&lt;/h2&gt;
&lt;h3 id="1-html-实体字符的定义与作用"&gt;1. &lt;strong&gt;HTML 实体字符的定义与作用&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;什么是 HTML 实体字符？为什么需要使用它们？&lt;/li&gt;
&lt;li&gt;实体字符用于在 HTML 中显示特殊符号（如 &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;&amp;quot;&lt;/code&gt; 等）或不可见字符（如空格 &lt;code&gt; &lt;/code&gt;、换行符等），避免与 HTML 语法冲突。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-常见的-html-实体字符"&gt;2. &lt;strong&gt;常见的 HTML 实体字符&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;lt;&lt;/code&gt;&lt;/strong&gt;：小于号 &lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;gt;&lt;/code&gt;&lt;/strong&gt;：大于号 &lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;amp;&lt;/code&gt;&lt;/strong&gt;：与符号 &lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;quot;&lt;/code&gt;&lt;/strong&gt;：双引号 &lt;code&gt;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;apos;&lt;/code&gt;&lt;/strong&gt;：单引号 &lt;code&gt;'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;nbsp;&lt;/code&gt;&lt;/strong&gt;：不间断空格 &lt;code&gt; &lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-unicode-和-ascii-编码的实体字符"&gt;3. &lt;strong&gt;Unicode 和 ASCII 编码的实体字符&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;HTML 支持通过 &lt;code&gt;&amp;amp;#xNNNN;&lt;/code&gt;（十六进制）或 &lt;code&gt;&amp;amp;#NNNN;&lt;/code&gt;（十进制）表示 Unicode 字符。例如：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;#x2665;&lt;/code&gt; 或 &lt;code&gt;&amp;amp;#9829;&lt;/code&gt; 表示 ♥&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;考察点可能涉及通过实体字符显示 Unicode 表情符号、语言字符等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-转义字符"&gt;4. &lt;strong&gt;转义字符&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 HTML 中如何使用实体字符进行转义？&lt;/li&gt;
&lt;li&gt;为什么需要转义符号（如 &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;）？特别是在 HTML 元素内嵌 JavaScript 或样式时需要避免歧义。&lt;/li&gt;
&lt;li&gt;安全性方面的考量，尤其是防止 XSS（跨站脚本攻击）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-空白字符"&gt;5. &lt;strong&gt;空白字符&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;nbsp;&lt;/code&gt;&lt;/strong&gt;（不间断空格）：防止自动换行或保留多个空格。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;ensp;&lt;/code&gt;&lt;/strong&gt; 和 **&lt;code&gt;&amp;amp;emsp;*&lt;/code&gt;*：半角和全角空格符号。&lt;/li&gt;
&lt;li&gt;实体空白符在排版和布局中的应用（如对齐、占位）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-其他常见实体字符"&gt;6. &lt;strong&gt;其他常见实体字符&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;货币符号：如 &lt;strong&gt;&lt;code&gt;&amp;amp;yen;&lt;/code&gt;&lt;/strong&gt;（¥）、&lt;strong&gt;&lt;code&gt;&amp;amp;euro;&lt;/code&gt;&lt;/strong&gt;（€）。&lt;/li&gt;
&lt;li&gt;数学符号：如 &lt;strong&gt;&lt;code&gt;&amp;amp;plusmn;&lt;/code&gt;&lt;/strong&gt;（±）、&lt;strong&gt;&lt;code&gt;&amp;amp;times;&lt;/code&gt;&lt;/strong&gt;（×）、&lt;strong&gt;&lt;code&gt;&amp;amp;divide;&lt;/code&gt;&lt;/strong&gt;（÷）。&lt;/li&gt;
&lt;li&gt;特殊符号：如 &lt;strong&gt;&lt;code&gt;&amp;amp;copy;&lt;/code&gt;&lt;/strong&gt;（©）、&lt;strong&gt;&lt;code&gt;&amp;amp;reg;&lt;/code&gt;&lt;/strong&gt;（®）、&lt;strong&gt;&lt;code&gt;&amp;amp;trade;&lt;/code&gt;&lt;/strong&gt;（™）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-html5-实体字符扩展"&gt;7. &lt;strong&gt;HTML5 实体字符扩展&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;HTML5 中新增的一些实体字符，如：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;**&lt;code&gt;&amp;amp;le;*&lt;/code&gt;*（≤）和 &lt;strong&gt;&lt;code&gt;&amp;amp;ge;&lt;/code&gt;&lt;/strong&gt;（≥）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;bull;&lt;/code&gt;&lt;/strong&gt;（•）用于列表符号&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;amp;hellip;&lt;/code&gt;&lt;/strong&gt;（…）省略号&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8-实体字符与浏览器兼容性"&gt;8. &lt;strong&gt;实体字符与浏览器兼容性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;浏览器如何处理不支持的实体字符？&lt;/li&gt;
&lt;li&gt;考察点可能涉及浏览器对不同编码的支持，以及如何确保兼容性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="9-html-实体字符与国际化"&gt;9. &lt;strong&gt;HTML 实体字符与国际化&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如何通过实体字符支持多语言文本？&lt;/li&gt;
&lt;li&gt;考察 Unicode 与实体字符在国际化中的应用，如如何使用实体字符表示非 ASCII 字符。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="10-html-实体字符在输入表单中的应用"&gt;10. &lt;strong&gt;HTML 实体字符在输入表单中的应用&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在表单中，如何防止特殊字符输入导致 HTML 注入攻击？&lt;/li&gt;
&lt;li&gt;使用实体字符保护表单数据的完整性和安全性。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>离线存储</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-015/</link><pubDate>Wed, 16 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-015/</guid><description>&lt;p&gt;HTML5 离线存储是指通过 &lt;strong&gt;Web Storage&lt;/strong&gt; API 提供的一种在客户端本地存储数据的机制，主要有两种方式：&lt;strong&gt;localStorage&lt;/strong&gt; 和 &lt;strong&gt;sessionStorage&lt;/strong&gt;。与传统的 Cookie 相比，Web Storage 提供了更大容量、灵活性，并且数据不会随着 HTTP 请求自动发送到服务器，这可以优化性能和安全性。此外，HTML5 还支持 &lt;strong&gt;离线应用缓存（Application Cache）&lt;/strong&gt; 和 &lt;strong&gt;IndexedDB&lt;/strong&gt;，用于更加复杂的数据存储需求和离线应用。&lt;/p&gt;
&lt;h3 id="工作原理"&gt;工作原理&lt;/h3&gt;
&lt;p&gt;HTML5 的离线存储主要通过以下几个机制来实现数据存储和访问：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;localStorage&lt;/strong&gt;：一种持久性存储机制，数据存储在用户的浏览器中，即使关闭浏览器或重新加载页面，数据也不会丢失，除非明确被删除。其特点是跨页面、跨会话存储数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sessionStorage&lt;/strong&gt;：会话级别的存储机制，只在当前页面的会话期间有效。当会话结束或浏览器窗口关闭时，数据会自动删除。其特点是只能在当前窗口或标签页中存储数据，不能跨窗口或标签页共享。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application Cache（已被 Service Worker 替代）&lt;/strong&gt;：允许开发者将网站的某些资源缓存到本地，使得用户即使在离线的情况下也能访问特定页面。虽然该机制已被弃用，但它曾经是实现离线访问的核心。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IndexedDB&lt;/strong&gt;：一种更为复杂的浏览器内置数据库，支持存储结构化数据，如对象和文件。它适用于更大规模的数据存储需求，并且允许通过索引进行高效的查询和数据操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用方式"&gt;使用方式&lt;/h3&gt;
&lt;h4 id="1-localstorage"&gt;1. &lt;strong&gt;localStorage&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：持久性存储，浏览器关闭后数据依然存在，除非手动清除。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用方式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 存储数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 删除数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;removeItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 清空所有 localStorage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clear&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-sessionstorage"&gt;2. &lt;strong&gt;sessionStorage&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：仅在当前会话期间有效，浏览器关闭或页面重新加载后数据会被清除。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用方式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 存储数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sessionStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;sessionKey&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;sessionValue&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sessionValue&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sessionStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;sessionKey&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 删除数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sessionStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;removeItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;sessionKey&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 清空所有 sessionStorage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sessionStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clear&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-indexeddb"&gt;3. &lt;strong&gt;IndexedDB&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：适合存储大量的结构化数据，支持异步 API 和事务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用方式&lt;/strong&gt;： IndexedDB 的使用较为复杂，通常涉及打开数据库、创建事务、存储和检索数据等操作。一个简单的示例如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;request&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;indexedDB&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;open&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;myDatabase&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onupgradeneeded&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;objectStore&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;createObjectStore&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;myObjectStore&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;keyPath&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onsuccess&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transaction&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;transaction&lt;/span&gt;([&lt;span style="color:#e6db74"&gt;&amp;#39;myObjectStore&amp;#39;&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;&amp;#39;readwrite&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;objectStore&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transaction&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;objectStore&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;myObjectStore&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;objectStore&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;John Doe&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="4-application-cache弃用"&gt;4. &lt;strong&gt;Application Cache（弃用）&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：通过 manifest 文件指定需要缓存的资源，允许在离线时访问应用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用方式&lt;/strong&gt;： 在 HTML 文档中指定 manifest 文件：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;manifest&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;app.manifest&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在 &lt;code&gt;app.manifest&lt;/code&gt; 文件中列出需要缓存的资源：&lt;/p&gt;</description></item><item><title>Web Workers</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/web-workers/</link><pubDate>Wed, 16 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/web-workers/</guid><description>&lt;p&gt;在浏览器和服务器上，JavaScript程序在单个处理线程上运行。这意味着程序一次只能做一件事。简单来说，你的新电脑可能有32核的CPU，但当JavaScript应用程序运行时，其中31个核心都处于空闲状态。&lt;/p&gt;
&lt;p&gt;JavaScript的单线程避免了复杂的并发情况。如果两个线程同时尝试进行不兼容的更改会发生什么？例如，一个浏览器可能在另一个线程重定向到新的URL并从内存中清除该文档时正在更新DOM。Node.js、Deno和Bun都继承了浏览器的单线程引擎。&lt;/p&gt;
&lt;p&gt;这不是JavaScript特定的限制。大多数语言都是单线程的，但像PHP和Python这样的Web选项通常在Web服务器上运行，为每个用户请求启动解释器的新线程的不同实例。这会消耗资源，因此Node.js应用程序通常定义自己的Web服务器，该服务器在单个线程上运行，并异步处理每个传入的请求。&lt;/p&gt;
&lt;p&gt;Node.js的方法在处理高流量负载时可能更高效，但长时间运行的JavaScript函数会消耗效率收益。&lt;/p&gt;
&lt;p&gt;在我们演示如何使用Web Workers解决执行速度问题之前，我们首先要了解JavaScript的运行方式以及为什么长时间运行的函数会引发问题。&lt;/p&gt;
&lt;h2 id="javascript非阻塞io事件循环"&gt;JavaScript非阻塞I/O事件循环&lt;/h2&gt;
&lt;p&gt;你可能会认为一次只做一件事会导致性能瓶颈，但JavaScript是异步的，这就避免了大部分单线程处理问题，因为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不需要等待用户在网页上点击按钮。 浏览器触发一个事件，当点击发生时调用JavaScript函数。&lt;/li&gt;
&lt;li&gt;不需要等待Ajax请求的响应。 浏览器触发一个事件，在服务器返回数据时调用JavaScript函数。&lt;/li&gt;
&lt;li&gt;Node.js应用程序不需要等待数据库查询的结果。 运行时在数据可用时调用JavaScript函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JavaScript引擎运行一个事件循环。一旦代码的最后一条语句执行完毕，运行时会循环回来，检查是否有未完成的定时器、待处理的回调函数和数据连接，然后根据需要执行回调函数。 其他操作系统处理线程负责调用诸如HTTP请求、文件处理和数据库连接等输入/输出系统。它们不会阻塞事件循环。事件循环可以继续执行下一个在队列中等待的JavaScript函数。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/web-workers/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;实质上，JavaScript引擎的主要责任是运行JavaScript代码。操作系统处理所有其他可能导致引擎调用JavaScript函数的I/O操作。&lt;/p&gt;
&lt;h2 id="长时间运行的javascript函数"&gt;长时间运行的JavaScript函数&lt;/h2&gt;
&lt;p&gt;JavaScript函数通常由事件触发。它们会进行一些处理，输出一些数据，并且大部分情况下会在毫秒级别内完成，以便事件循环可以继续运行。&lt;/p&gt;
&lt;p&gt;不幸的是，一些长时间运行的函数可能会阻塞事件循环。想象一下，你正在开发自己的图像处理函数（如锐化、模糊、灰度化等）。异步代码可以从文件中读取（或写入）数百万字节的像素数据，这对JavaScript引擎影响很小。然而，处理图像的JavaScript代码可能需要几秒钟来计算每个像素。该函数会阻塞事件循环，直到它完成，其他JavaScript代码无法运行。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在浏览器中，用户将无法与页面进行交互。他们无法点击、滚动或输入，并且可能会看到一个“脚本无响应”的错误，其中有停止处理的选项。&lt;/li&gt;
&lt;li&gt;对于Node.js服务器应用程序而言，情况更糟糕。在函数执行时，它无法响应其他请求。如果函数需要花费10秒钟来完成，那么在那个时间点访问的每个用户都必须等待最多10秒钟，即使他们没有处理图像。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你可以通过将计算拆分为较小的子任务来解决这个问题。下面的代码使用传递的imageFn函数，最多处理1,000个像素（从一个数组中）。然后，它使用1毫秒的setTimeout延迟调用自身。事件循环的阻塞时间较短，这样JavaScript引擎可以在迭代之间处理其他传入的事件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// pass callback function, image processing function, and input image
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// return an output image to a callback function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processImage&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;imageFn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; =&amp;gt; {}, &lt;span style="color:#a6e22e"&gt;imageIn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [] ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;chunkSize&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// pixels to process per iteration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// process first chunk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;imageOut&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pointer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;processChunk&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// process a chunk of data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processChunk&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pointerEnd&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pointer&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;chunkSize&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// pass chunk to image processing function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;imageOut&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;imageOut&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;imageFn&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;imageIn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;pointer&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pointerEnd&lt;/span&gt; ) )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;pointerEnd&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;imageIn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// process next chunk after a short delay
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pointer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pointerEnd&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;processChunk&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// complete - return output image to callback function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;( &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;imageOut&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种方法可以防止脚本无响应，但不总是切实可行的。单个执行线程仍然会执行所有的工作，即使CPU可能有更多的处理能力。为了解决这个问题，我们可以使用Web Workers。&lt;/p&gt;</description></item><item><title>地理定位</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-017/</link><pubDate>Wed, 16 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-017/</guid><description>&lt;p&gt;HTML5 提供了地理定位（Geolocation）API，用于获取用户的当前位置。通过这一功能，网页可以访问用户的地理位置信息，进而实现如地图服务、定位推荐、基于位置的广告等功能。该 API 主要依赖设备的 GPS、Wi-Fi、IP 地址、蓝牙等信息来确定位置。&lt;/p&gt;
&lt;h3 id="geolocation-api-的基本用法"&gt;&lt;strong&gt;Geolocation API 的基本用法&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;主要通过 &lt;code&gt;navigator.geolocation&lt;/code&gt; 对象来访问地理位置信息，提供了以下三个方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getCurrentPosition(success, error, options)&lt;/code&gt;&lt;/strong&gt; 获取用户的当前位置，一次性返回位置信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;watchPosition(success, error, options)&lt;/code&gt;&lt;/strong&gt; 持续监听用户的位置变化，并且实时返回新的位置信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clearWatch(id)&lt;/code&gt;&lt;/strong&gt; 取消 &lt;code&gt;watchPosition&lt;/code&gt; 监听的位置变化。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="方法的参数说明"&gt;&lt;strong&gt;方法的参数说明&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;success(position)&lt;/code&gt;：成功获取位置时的回调函数。&lt;code&gt;position&lt;/code&gt; 对象包含位置信息，如经度、纬度、速度等。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;error(error)&lt;/code&gt;：可选参数，获取位置失败时的回调函数。&lt;code&gt;error&lt;/code&gt; 对象包含错误信息，如用户拒绝提供位置或获取超时等。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options&lt;/code&gt;：可选参数，包含配置选项，影响获取位置的精度、超时时间等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="使用示例"&gt;&lt;strong&gt;使用示例&lt;/strong&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;navigator&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;geolocation&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;navigator&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;geolocation&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getCurrentPosition&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;position&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;latitude&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;position&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;coords&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;latitude&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;longitude&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;position&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;coords&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;longitude&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`Latitude: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;latitude&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, Longitude: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;longitude&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`Error Code = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;enableHighAccuracy&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5000&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;maximumAge&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Geolocation is not supported by this browser.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="获取到的"&gt;&lt;strong&gt;获取到的 &lt;code&gt;position&lt;/code&gt; 对象&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;position&lt;/code&gt; 对象包含用户的位置信息，主要属性包括：&lt;/p&gt;</description></item><item><title>拖放API</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-018/</link><pubDate>Thu, 17 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-018/</guid><description>&lt;p&gt;HTML5 中的拖拽（Drag and Drop，简称 DnD）功能为网页元素提供了原生的拖放支持。通过 HTML5 的拖放 API，开发者可以让元素变得可拖动，并实现拖拽和释放的交互效果。&lt;/p&gt;
&lt;h3 id="html5-拖拽的基本原理"&gt;&lt;strong&gt;HTML5 拖拽的基本原理&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;HTML5 拖拽操作的核心是 &lt;code&gt;dragstart&lt;/code&gt;、&lt;code&gt;dragover&lt;/code&gt; 和 &lt;code&gt;drop&lt;/code&gt; 等事件。以下是拖拽的工作流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可拖动元素&lt;/strong&gt;：使用 &lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt; 使一个元素可被拖拽。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;源元素触发拖拽&lt;/strong&gt;：当用户点击并开始拖动可拖动元素时，触发 &lt;code&gt;dragstart&lt;/code&gt; 事件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拖拽中&lt;/strong&gt;：拖拽过程中，目标区域会触发 &lt;code&gt;dragover&lt;/code&gt; 事件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;释放元素&lt;/strong&gt;：当用户释放被拖动的元素到目标区域时，目标会触发 &lt;code&gt;drop&lt;/code&gt; 事件。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="实现步骤"&gt;&lt;strong&gt;实现步骤&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;设置拖拽元素&lt;/strong&gt;：使用 &lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt; 使 HTML 元素可拖动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监听拖拽事件&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dragstart&lt;/code&gt;：当拖拽开始时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragover&lt;/code&gt;：在拖拽过程中，拖动到可放置目标区域时持续触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drop&lt;/code&gt;：当拖动的元素被释放到目标区域时触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;阻止默认行为&lt;/strong&gt;：&lt;code&gt;dragover&lt;/code&gt; 和 &lt;code&gt;drop&lt;/code&gt; 事件默认情况下是禁止的，需要使用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来阻止默认行为，从而允许放置元素。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="拖拽的相关事件"&gt;&lt;strong&gt;拖拽的相关事件&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dragstart&lt;/code&gt;：在拖动开始时触发，用来设置拖动数据（如拖动的数据类型和数据内容）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragend&lt;/code&gt;：拖动操作结束时触发，可以用来清理状态。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragenter&lt;/code&gt;：当拖动的元素进入目标区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragover&lt;/code&gt;：当拖动元素在目标区域上方移动时持续触发，默认情况下不会触发 &lt;code&gt;drop&lt;/code&gt;，因此需要通过 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来允许放置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragleave&lt;/code&gt;：当拖动的元素离开目标区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drop&lt;/code&gt;：当拖动的元素释放到目标区域时触发，可以获取拖动的数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="拖拽实例"&gt;&lt;strong&gt;拖拽实例&lt;/strong&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lang&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;HTML5 拖拽示例&amp;lt;/&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #dragElement {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;lightcoral&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;text-align&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;cursor&lt;/span&gt;: grab;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #dropZone {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;lightblue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;text-align&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dragElement&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggable&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&amp;gt;拖拽我&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dropZone&amp;#34;&lt;/span&gt;&amp;gt;放置到这里&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取元素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dragElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragElement&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dropZone&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dropZone&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 拖拽开始事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dragElement&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragstart&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 设置数据，类型和内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 拖拽过程中在目标上方移动时，必须阻止默认行为
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dropZone&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragover&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 放置事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dropZone&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;drop&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 阻止默认行为
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggedElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;appendChild&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;draggedElement&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 将拖动的元素放入目标区域
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="代码说明"&gt;&lt;strong&gt;代码说明&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;拖拽元素&lt;/strong&gt;：&lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt; 使得 &lt;code&gt;#dragElement&lt;/code&gt; 可拖动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拖拽开始&lt;/strong&gt;：&lt;code&gt;dragstart&lt;/code&gt; 事件设置了拖拽的元素数据，存入 &lt;code&gt;dataTransfer&lt;/code&gt; 对象中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;允许放置&lt;/strong&gt;：&lt;code&gt;dragover&lt;/code&gt; 事件通过 &lt;code&gt;event.preventDefault()&lt;/code&gt; 允许拖拽元素放置在目标区域。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;放置元素&lt;/strong&gt;：&lt;code&gt;drop&lt;/code&gt; 事件在目标区域中，通过 &lt;code&gt;event.dataTransfer.getData()&lt;/code&gt; 获取拖动的数据并进行处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见考点"&gt;常见考点&lt;/h2&gt;
&lt;h3 id="1-基本概念与原理"&gt;1. &lt;strong&gt;基本概念与原理&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：HTML5 提供了内置的拖拽功能，通过 &lt;code&gt;draggable&lt;/code&gt; 属性和 Drag and Drop API 实现元素拖放操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：拖拽功能依赖一系列事件，如 &lt;code&gt;dragstart&lt;/code&gt;、&lt;code&gt;drag&lt;/code&gt;、&lt;code&gt;dragend&lt;/code&gt;、&lt;code&gt;dragover&lt;/code&gt;、&lt;code&gt;drop&lt;/code&gt; 等来实现拖放操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-如何启用拖拽"&gt;2. &lt;strong&gt;如何启用拖拽&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;draggable 属性&lt;/strong&gt;：默认情况下，HTML 元素是不可拖拽的。要启用拖拽，需要设置元素的 &lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggable&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&amp;gt;Drag me!&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;事件绑定&lt;/strong&gt;：考察点可能包括如何通过 &lt;code&gt;dragstart&lt;/code&gt; 等事件处理拖拽行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggableElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;draggable&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;draggableElement&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragstart&amp;#39;&lt;/span&gt;, (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text/plain&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;This is a draggable element&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-drag-and-drop-的核心事件"&gt;3. &lt;strong&gt;Drag and Drop 的核心事件&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dragstart&lt;/strong&gt;：用户开始拖动时触发，通常用于设置拖拽的数据和外观。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;drag&lt;/strong&gt;：在拖动过程中持续触发，可用于动态更新拖拽效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragend&lt;/strong&gt;：拖动结束时触发，可以用于清除拖拽状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragenter&lt;/strong&gt;：被拖拽的元素进入可放置区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragover&lt;/strong&gt;：在拖动元素悬停在放置区域时持续触发，通常需要调用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来允许放置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragleave&lt;/strong&gt;：当拖动元素离开放置区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;drop&lt;/strong&gt;：用户放开被拖动的元素时触发，用于处理放置操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-数据传输"&gt;4. &lt;strong&gt;数据传输&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dataTransfer 对象&lt;/strong&gt;：&lt;code&gt;event.dataTransfer&lt;/code&gt; 是拖拽过程中传输数据的关键对象。常见考点包括如何通过 &lt;code&gt;dataTransfer.setData()&lt;/code&gt; 和 &lt;code&gt;dataTransfer.getData()&lt;/code&gt; 方法在 &lt;code&gt;dragstart&lt;/code&gt; 和 &lt;code&gt;drop&lt;/code&gt; 事件之间传递数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// dragstart 中设置数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Dragged Data&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// drop 中获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传输多种数据类型&lt;/strong&gt;：考察如何传输不同的数据类型（如文本、URL、文件等）以及如何处理这些数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-dropzone-区域的设置"&gt;5. &lt;strong&gt;dropzone 区域的设置&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;允许放置元素&lt;/strong&gt;：默认情况下，放置区域不会接受被拖拽的元素，需要在 &lt;code&gt;dragover&lt;/code&gt; 事件中调用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来显式地允许放置操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dropzone&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dropzone&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;dropzone&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragover&amp;#39;&lt;/span&gt;, (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 允许放置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="6-拖拽的样式处理"&gt;6. &lt;strong&gt;拖拽的样式处理&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自定义拖拽效果&lt;/strong&gt;：通过 &lt;code&gt;event.dataTransfer.setDragImage()&lt;/code&gt; 设置自定义的拖拽图片，考察点可能包括如何替换默认的拖拽预览图。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setDragImage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;imageElement&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;offsetX&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;offsetY&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;拖拽时的 CSS 样式&lt;/strong&gt;：考察如何使用 CSS 类和事件配合，实现拖拽时的视觉效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;dragging&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="7-跨页面或跨应用的拖拽"&gt;7. &lt;strong&gt;跨页面或跨应用的拖拽&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨文档拖拽&lt;/strong&gt;：考察是否了解如何处理跨 iframe 或浏览器窗口的拖拽。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拖拽文件&lt;/strong&gt;：用户可以将外部文件（如从桌面拖动文件）拖入浏览器的 &lt;code&gt;dropzone&lt;/code&gt;，需要处理 &lt;code&gt;dataTransfer.files&lt;/code&gt; 属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;files&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="8-拖拽与输入法的冲突"&gt;8. &lt;strong&gt;拖拽与输入法的冲突&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在移动设备上，拖拽和触摸事件可能存在冲突，因此考察点可能包括如何处理拖拽在移动端的实现或替代方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="9-可访问性"&gt;9. &lt;strong&gt;可访问性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;键盘可用性&lt;/strong&gt;：默认拖拽操作主要依赖鼠标，因此考察点可能包括如何使拖拽操作可通过键盘导航，确保网站的无障碍性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ARIA 支持&lt;/strong&gt;：在实现拖拽功能时，如何使用 ARIA 属性为屏幕阅读器用户提供反馈是常见的可访问性考察点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="10-兼容性"&gt;10. &lt;strong&gt;兼容性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浏览器兼容性&lt;/strong&gt;：HTML5 拖拽在不同浏览器中的支持情况不一致，尤其是在移动端，考察点可能包括如何处理浏览器兼容性问题，特别是在触摸设备上使用拖拽功能时的挑战。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="11-常见的应用场景"&gt;11. &lt;strong&gt;常见的应用场景&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文件上传&lt;/strong&gt;：通过拖拽文件进行上传是常见的考察场景，如何实现文件的拖放上传功能是常见问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可拖拽列表&lt;/strong&gt;：如何通过拖拽重新排序列表项，如实现类似于 &lt;code&gt;Trello&lt;/code&gt; 的拖放功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;游戏和图形界面&lt;/strong&gt;：拖放在交互式游戏或图形应用中被广泛使用，可能会考察如何通过拖拽元素实现复杂的交互效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-事件顺序"&gt;12. &lt;strong&gt;事件顺序&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;了解拖拽过程中的事件触发顺序也是一个重要的考察点，常见顺序为：&lt;code&gt;dragstart&lt;/code&gt; -&amp;gt; &lt;code&gt;drag&lt;/code&gt; -&amp;gt; &lt;code&gt;dragenter&lt;/code&gt; -&amp;gt; &lt;code&gt;dragover&lt;/code&gt; -&amp;gt; &lt;code&gt;drop&lt;/code&gt; -&amp;gt; &lt;code&gt;dragend&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-拖拽的取消"&gt;13. &lt;strong&gt;拖拽的取消&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;取消拖拽&lt;/strong&gt;：通过调用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 可以阻止某些拖拽事件的默认行为，如取消 &lt;code&gt;drop&lt;/code&gt; 事件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="14-使用-javascript-框架实现拖拽"&gt;14. &lt;strong&gt;使用 JavaScript 框架实现拖拽&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;有些前端面试可能会考察如何利用 JavaScript 框架（如 React、Vue、Angular）实现拖拽交互，以及如何处理拖拽相关的状态管理和数据绑定。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>全屏API</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-019/</link><pubDate>Thu, 17 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-019/</guid><description>&lt;p&gt;在 HTML 中，可以通过调用浏览器的全屏 API 实现页面或页面中的某个元素全屏显示。全屏 API 是 HTML5 提供的一项功能，允许将元素切换为全屏模式。&lt;/p&gt;
&lt;h3 id="使用全屏-api-实现全屏"&gt;&lt;strong&gt;使用全屏 API 实现全屏&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;全屏 API 提供了以下常用方法和属性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requestFullscreen()&lt;/code&gt;：请求将元素设置为全屏模式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exitFullscreen()&lt;/code&gt;：退出全屏模式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fullscreenElement&lt;/code&gt;：返回当前正在全屏显示的 DOM 元素，如果没有元素全屏，则返回 &lt;code&gt;null&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fullscreenchange&lt;/code&gt; 事件：当全屏状态发生变化时触发，用来监听进入或退出全屏。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="实现全屏的基本步骤"&gt;&lt;strong&gt;实现全屏的基本步骤&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;选择你希望全屏的元素。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;element.requestFullscreen()&lt;/code&gt; 方法来进入全屏。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;document.exitFullscreen()&lt;/code&gt; 来退出全屏模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="示例代码"&gt;&lt;strong&gt;示例代码&lt;/strong&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lang&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;全屏示例&amp;lt;/&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #fullscreenContent {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;lightblue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;text-align&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;fullscreenContent&amp;#34;&lt;/span&gt;&amp;gt;点击全屏&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;exitFullscreenBtn&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;display:none;&amp;#34;&lt;/span&gt;&amp;gt;退出全屏&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fullscreenContent&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;exitFullscreenBtn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;exitFullscreenBtn&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 进入全屏模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;requestFullscreen&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;requestFullscreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mozRequestFullScreen&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Firefox
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mozRequestFullScreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;webkitRequestFullscreen&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Chrome, Safari and Opera
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;webkitRequestFullscreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;msRequestFullscreen&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// IE/Edge
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fullscreenContent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;msRequestFullscreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;exitFullscreenBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;display&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;inline-block&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 退出全屏模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;exitFullscreenBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (document.&lt;span style="color:#a6e22e"&gt;exitFullscreen&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;exitFullscreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (document.&lt;span style="color:#a6e22e"&gt;mozCancelFullScreen&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Firefox
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;mozCancelFullScreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (document.&lt;span style="color:#a6e22e"&gt;webkitExitFullscreen&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Chrome, Safari and Opera
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;webkitExitFullscreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (document.&lt;span style="color:#a6e22e"&gt;msExitFullscreen&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// IE/Edge
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;msExitFullscreen&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;exitFullscreenBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;display&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 监听全屏状态变化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fullscreenchange&amp;#39;&lt;/span&gt;, () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;全屏状态发生变化&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="代码解释"&gt;&lt;strong&gt;代码解释&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;进入全屏&lt;/strong&gt;：点击 &lt;code&gt;#fullscreenContent&lt;/code&gt; 的 div 时，调用 &lt;code&gt;requestFullscreen()&lt;/code&gt; 方法使该元素进入全屏模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;退出全屏&lt;/strong&gt;：点击按钮 &lt;code&gt;#exitFullscreenBtn&lt;/code&gt;，调用 &lt;code&gt;document.exitFullscreen()&lt;/code&gt; 退出全屏模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨浏览器兼容性&lt;/strong&gt;：由于部分浏览器的全屏 API 有不同的实现方法，代码中兼容了各个主流浏览器的实现（例如 Chrome, Firefox, Safari, Edge）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监听全屏状态变化&lt;/strong&gt;：使用 &lt;code&gt;fullscreenchange&lt;/code&gt; 事件来监听当前全屏模式的变化，可以在进入或退出全屏时执行额外操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="全屏-api-的一些注意事项"&gt;&lt;strong&gt;全屏 API 的一些注意事项&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;全屏 API 只能在用户交互（如点击或按键事件）后触发，不能通过脚本自动进入全屏模式，这是为了防止用户体验被打断。&lt;/li&gt;
&lt;li&gt;不同浏览器的全屏 API 实现可能稍有不同，因此通常需要做一些兼容性处理。&lt;/li&gt;
&lt;li&gt;在移动端设备上，全屏模式的行为可能与桌面端有所不同。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="总结"&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;HTML5 的全屏 API 提供了一种简单而直观的方法来让页面或元素进入全屏模式。通过 &lt;code&gt;requestFullscreen()&lt;/code&gt; 方法可以将任意元素全屏显示，&lt;code&gt;exitFullscreen()&lt;/code&gt; 则用来退出全屏模式。结合 &lt;code&gt;fullscreenchange&lt;/code&gt; 事件可以对全屏状态进行监控，实现更加丰富的交互体验。&lt;/p&gt;</description></item><item><title>与 CSS/JS 的交互</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-020/</link><pubDate>Thu, 17 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-020/</guid><description>&lt;p&gt;HTML、CSS 和 JavaScript 是前端开发的三大基础技术，它们通过不同的方式相互作用，创建交互性良好的网页。&lt;/p&gt;
&lt;h3 id="1-html-与-css-的交互"&gt;1. &lt;strong&gt;HTML 与 CSS 的交互&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;HTML 负责定义网页的结构，而 CSS 则负责美化这些结构元素。两者的交互主要通过以下方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; 标签&lt;/strong&gt;：直接在 HTML 中嵌入 CSS 样式。 这种方式将 CSS 写入到 HTML 文件中，但不推荐用于大型项目，因为这会导致样式与结构混杂在一起。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;h1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;red&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; 标签&lt;/strong&gt;：通过 &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; 标签引入外部 CSS 文件。 这种方式通常用于大型项目中，将样式与结构分离，维护更加清晰。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;link&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rel&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;styles.css&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内联样式&lt;/strong&gt;：直接将样式属性写在 HTML 标签内。 这种方式适合临时的小改动，但不推荐频繁使用，尤其在大型项目中不利于维护。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;h1&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;color: blue;&amp;#34;&lt;/span&gt;&amp;gt;这是一个标题&amp;lt;/&lt;span style="color:#f92672"&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-html-与-javascript-的交互"&gt;2. &lt;strong&gt;HTML 与 JavaScript 的交互&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;JavaScript 负责操作和控制网页内容，主要与 HTML 进行交互以实现动态效果。以下是交互方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 标签&lt;/strong&gt;：通过 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 标签直接在 HTML 中嵌入 JavaScript 代码。 此方法会在 HTML 中直接执行 JavaScript，适合小规模的脚本。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;这是一个弹窗&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外部 JavaScript 文件&lt;/strong&gt;：通过 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 标签引入外部 JavaScript 文件。 这种方式将 JavaScript 逻辑与 HTML 分离，便于维护和重用。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;script.js&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DOM 操作&lt;/strong&gt;：通过 JavaScript 操作 DOM（文档对象模型），动态更改 HTML 元素的内容和属性。例如：&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&amp;gt;这是原始文本&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;innerText&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;这是通过 JS 改变的文本&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;事件监听&lt;/strong&gt;：JavaScript 可以通过事件监听器响应用户的交互。例如：&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;btn&amp;#34;&lt;/span&gt;&amp;gt;点击我&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;btn&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;click&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;按钮被点击了&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-css-与-javascript-的交互"&gt;3. &lt;strong&gt;CSS 与 JavaScript 的交互&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;JavaScript 也可以与 CSS 进行交互，动态地控制页面的样式。常见的方法有：&lt;/p&gt;</description></item><item><title>SEO</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/seo/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/seo/</guid><description>&lt;h2 id="-前言"&gt;🌻 前言&lt;/h2&gt;
&lt;p&gt;SEO 代表搜寻引擎最佳化/搜寻引擎优化(英文全名Search Engine Optimization，简称SEO)，是指通过了解搜寻引擎的自然排名的算法逻辑，以提高目标网站在有关搜寻引擎内排名的方式。&lt;/p&gt;
&lt;p&gt;网站的 SEO 至关重要，它可以让你的网站获得更好的排名和流量，从而提高网站知名度。对于一些盈利的网站，做好seo，还可以以低成本提高投资回报率。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文将为你带来非常全面的SEO方案🔥🔥🔥，当然了，网站SEO是长线工作，在做好一些基础的配置之后，更重要的是后期的维护，比如定期更新网站动态文章，不断寻找优质外链资源等🤌。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本文将以三个层面展开：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;TDK优化&lt;/li&gt;
&lt;li&gt;网站质量&lt;/li&gt;
&lt;li&gt;SEO手段（10种手段）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="-一tdk优化"&gt;❄️ 一、TDK优化&lt;/h2&gt;
&lt;p&gt;TDK是Title(页面标题)、Meta Description（页面描述）和Meta Keywords（页面关键词）的缩写，对网站的这三个信息的提炼是网站SEO的重要环节。&lt;/p&gt;
&lt;p&gt;但是由于一些原因，各大主流搜索引擎基本都已经&lt;strong&gt;大大降低甚至移除了 &lt;code&gt;&amp;lt;keywords&amp;gt;&lt;/code&gt; 对排名的影响&lt;/strong&gt;。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;百度：几乎放弃了对&lt;keyword&gt;标签的参考价值。参考：百度官方称：keywords这个meta标签已经被丢进历史垃圾堆了；&lt;/li&gt;
&lt;li&gt;谷歌：目前几乎已经不考虑这个标签对于SEO的作用了，它可能更侧重于内容的相关性以及反向链接的考量。参考&lt;a href="https://developers.google.com/search/blog/2009/09/google-does-not-use-keywords-meta-tag?hl=zh-cn"&gt;：# Google 不会将关键字元标记用于网页排名&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;必应：目前 keywords 标签仍然对排名有一定影响；&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一title标签-网站名片"&gt;（一）title标签-网站名片&lt;/h2&gt;
&lt;p&gt;title标签相当于网站的名片，他会直接显示在搜索结果中。一个好的标题势必可以为网站带来流量，从而提升网站排名。&lt;br&gt;
注意：网站标题避免冗长&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;例如&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;掘金&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/title&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="二meta标签-网站信息"&gt;（二）META标签-网站信息&lt;/h2&gt;
&lt;p&gt;META标签是网页head区的辅助性标签，它的作用是经过配置一些参数用以描述页面属性。&lt;strong&gt;目前几乎所有搜索引擎都使用网上机器人自动查找meta值来给网页分类。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="21-meta标签如何使用"&gt;2.1 meta标签如何使用&lt;/h3&gt;
&lt;p&gt;meta标签的&lt;code&gt;属性&lt;/code&gt;有两种：&lt;code&gt;name&lt;/code&gt;和&lt;code&gt;http- equiv&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;🍀 &lt;strong&gt;&amp;ldquo;name&amp;quot;属性有以下配置项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keywords(关键词，现在不再重要了)：逗号分隔的关键词列表（告诉搜索引擎页面是与什么相关的）；&lt;/li&gt;
&lt;li&gt;description(网站内容描述，很重要)：页面描述。搜索引擎会把这个描述显示在搜索结果中；&lt;/li&gt;
&lt;li&gt;format-detection：格式检测，比如禁止识别电话，邮箱等；&lt;/li&gt;
&lt;li&gt;author：作者的名字；&lt;/li&gt;
&lt;li&gt;Robots：用来告诉搜索机器人哪些页面需要索引，哪些页面不需要索引；&lt;/li&gt;
&lt;li&gt;theme-color：网站主题色；&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;掘金,稀土,Vue.js,前端面试题,Kotlin,ReactNative,Python&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;掘金是面向全球中文开发者的技术内容分享与交流平台。我们通过技术文章、沸点、课程、直播等产品和服务，打造一个激发开发者创作灵感，激励开发者沉淀分享，陪伴开发者成长的综合类技术社区。&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;format-detection&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;telephone=no&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;author&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;cece&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Robots&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Nofollow&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;all：文件将被检索，且页面上的链接可以被查询；
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;none：文件将不被检索，且页面上的链接不可以被查询；(和 &amp;#34;noindex, no follow&amp;#34; 起相同作用)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;index：文件将被检索；（让robot/spider登录）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;follow：页面上的链接可以被查询；
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;noindex：文件将不被检索，但页面上的链接可以被查询；(不让robot/spider登录)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;nofollow：文件将不被检索，页面上的链接可以被查询。(不让robot/spider顺着此页的连接往下探找)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;theme-color&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#4285f4&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;🍀 &lt;strong&gt;&amp;ldquo;http- equiv&amp;quot;属性有以下配置项：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>CSR，SSR和SSG</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/csr-ssr-ssg/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/csr-ssr-ssg/</guid><description>&lt;p&gt;&lt;code&gt;SPA&lt;/code&gt;、&lt;code&gt;MPA&lt;/code&gt;、&lt;code&gt;SSR&lt;/code&gt; 和 &lt;code&gt;CSR&lt;/code&gt; 这几个词可能在你的工作生涯中经常出现，网上相关文章也很多。如果你对这些概念感到模糊或完全不了解，希望本文能帮助你理解这些渲染模式。&lt;/p&gt;
&lt;h3 id="spa-与-mpa"&gt;SPA 与 MPA&lt;/h3&gt;
&lt;h4 id="mpa"&gt;MPA&lt;/h4&gt;
&lt;p&gt;MPA（&lt;code&gt;multiple page application&lt;/code&gt;） 称为&lt;strong&gt;多页应用&lt;/strong&gt;, 指的是有多个页面的应用，从技术手段上来讲，你可以这么粗略地理解。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;首屏速度快&lt;/strong&gt;：各个页面相互独立，需要单独维护多个 html 页面，每个请求都直接返回 html。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换页面比较慢&lt;/strong&gt;：基于原生浏览器的文档跳转（&lt;code&gt;navigating across documents&lt;/code&gt;）。因此每一次的页面更新都是一次页面重载，这将带来巨大的重启性能消耗。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对 SEO 友好&lt;/strong&gt;：页面在初始时，就具有全部的页面内容而非 「无状态」，从而达到更好的收录效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="spa"&gt;SPA&lt;/h4&gt;
&lt;p&gt;SPA（&lt;code&gt;single page application&lt;/code&gt;）称为&lt;strong&gt;单页应用&lt;/strong&gt;。通过 js 去感知到 url 的变化，动态的将当前页面的内容清除掉，然后将下一个页面的内容挂载到当前页面上。此时的路由不是后端来做了，而是前端来做，动态显示需要的组件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;页面切换速度快&lt;/strong&gt;：路由跳转是基于特定的实现（如 vue-router，react-router 等前端路由），而非原生浏览器的文档跳转，避免了不必要的整个页面重载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前后端分离&lt;/strong&gt;：基于前端路由，SPA 与应用后端解耦，使得前端不再依赖于后端的路由分配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;首屏时间慢&lt;/strong&gt;：首屏除了 html 还要额外请求并执行 js 文件，通过 js 在空页面上渲染首屏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO 不友好&lt;/strong&gt;：内容都是靠 js 渲染生成出来的，但搜索引擎并不识别这部分内容，导致 SEO 效果差&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="csrclient-side-rendering"&gt;CSR（Client Side Rendering）&lt;/h3&gt;
&lt;p&gt;CSR（客户端渲染）是一种在浏览器上执行 JavaScript 以生成 DOM 并显示内容的渲染方法。CSR 更贴近现代前端开发，我们通常使用的 Vue 和 React 默认使用 CSR。其大致流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;浏览器向前端服务器请求 html 和 js&lt;/li&gt;
&lt;li&gt;html 页面为空，初始加载不显示任何内容，通过执行 js 渲染内容&lt;/li&gt;
&lt;li&gt;通过后端暴露的 API 进行交互&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于典型的 CSR 应用程序，浏览器仅接收一个用作应用程序容器的 HTML 页面，因此也称为单页应用，所以 CSR 的特点与之前提到的 SPA 类似。&lt;/p&gt;</description></item><item><title>浏览器解析 HTML 文件</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/</guid><description>&lt;h2 id="1-什么是浏览器解析和渲染html"&gt;1. 什么是浏览器解析和渲染HTML&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;一句话概括：将html代码转换成页面上显示的内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表1：形象展示将HTML转换成页面上显示的内容&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="2-浏览器解析和渲染html过程"&gt;2. 浏览器解析和渲染HTML过程？&lt;/h2&gt;
&lt;p&gt;那么浏览器拿到HTML代码后是如何把其转换成页面上显示的内容的？&lt;/p&gt;
&lt;h3 id="21-宏观描述执行过程"&gt;2.1 宏观描述执行过程&lt;/h3&gt;
&lt;h4 id="211-解析和渲染"&gt;2.1.1 解析和渲染&lt;/h4&gt;
&lt;p&gt;首先我们来看两个概念，解析和渲染，确切来说是DOM解析和DOM渲染。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DOM解析：&lt;/strong&gt; 生成DOM tree的过程。就是把你所写的各种html标签，生成一个DOM tree，可以认为就是生成了一个最原始的页面，一点样式都没有，毫无CSS修饰。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DOM渲染：&lt;/strong&gt; 将DOM tree与css样式结合，生成Render tree，并将其呈现在浏览器页面上。浏览器会把本身默认的样式+用户自己写得样式整合到一起，形成一个CSS tree，而DOM渲染就是指DOM tree 和CSS tree 结合到一起，生成一个Render tree，呈现出一个带有样式的页面。&lt;/p&gt;
&lt;p&gt;这里需要注意，&lt;strong&gt;DOM解析和DOM渲染由两个不同的线程来完成的，简单说就是二者可以并行进行。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DOM解析通常是由浏览器的主线程来完成的。DOM渲染是由浏览器的渲染线程来完成的。&lt;/p&gt;
&lt;p&gt;分离解析和渲染的这种设计使得浏览器能够在解析 HTML 文档的同时将页面渲染到屏幕上，这样用户就能够更快地看到完整的页面了。&lt;/p&gt;
&lt;h4 id="212-宏观描述执行过程"&gt;2.1.2 宏观描述执行过程&lt;/h4&gt;
&lt;p&gt;补充了解析和渲染的概念，我们来看看浏览器具体是如何把其转换成页面上显示的内容的。其过程大致分为下图的四步。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/image-02.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图1：浏览器解析和渲染HTML的过程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步&lt;/strong&gt;：将载入的HTML文件解析成DOM树（DOM tree），并且将各个标记标识解析成DOM树的各个节点；在解析HTML的同时会将CSS样式解析成CSS规则（CSS rules）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步&lt;/strong&gt;：将解析成的DOM树和CSS规则进行关联生成渲染树（Render tree）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;：进入布局阶段，为DOM树的每个节点分配在屏幕上出现的确切坐标（这一阶段还是渲染树）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步&lt;/strong&gt;：进入绘制阶段，在这里渲染引擎的工作就结束了，接下来就给用户界面后端（UI Backend）对渲染树的每个节点进行绘制，呈现出页面效果。&lt;/p&gt;
&lt;h3 id="22-细化执行过程"&gt;2.2 细化执行过程&lt;/h3&gt;
&lt;h4 id="221-顺序执行"&gt;2.2.1 顺序执行&lt;/h4&gt;
&lt;p&gt;dom解析过程是从上向下，顺序执行的。顺序执行的意思是一行一行的执行，上一行执行完再执行下一行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;1&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;2&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;3&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;style&amp;gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- 先1，再2，再3，按顺序解析。 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="222-渐进式"&gt;2.2.2 渐进式&lt;/h4&gt;
&lt;p&gt;浏览器是渐进式渲染，即边解析边渲染。通俗的说就是，这一行代码解析完，就可以在浏览器的页面渲染展示出来。因为浏览器的解析和渲染由两个不同线程来完成，所以可以实现边解析边渲染。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;1&lt;span style="color:#f92672"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;debugger&lt;span style="color:#f92672"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;2&lt;span style="color:#f92672"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;debugger&lt;span style="color:#f92672"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;3&lt;span style="color:#f92672"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- 先解析渲染出1，再debugger;再解析渲染出2，再debugger;最后解析渲染出3 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-问题cssjs会阻塞解析和渲染吗"&gt;2.3 问题：css、js会阻塞解析和渲染吗？&lt;/h3&gt;
&lt;p&gt;这部分内容可参考这篇掘金内容，内含测试代码：&lt;a href="https://juejin.cn/post/6973949865130885157#heading-0"&gt;关于 JS 与 CSS 是否阻塞 DOM 的渲染和解析 - 掘金&lt;/a&gt;&lt;/p&gt;</description></item><item><title>输入 URL 到页面渲染完成</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-024/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-024/</guid><description>&lt;h2 id="一网站加载概述"&gt;一、网站加载概述&lt;/h2&gt;
&lt;p&gt;面试过程中，常常遇到这样一道面试题，输入URL到页面加载完毕，浏览器做了哪些工作？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;首先输入一个URL，你会看到浏览器上面的标签页出现了一个loading图标，开始时是逆时针旋转，接着顺时针旋转，当前页面消失，显示我们常说的空白页面，接着出现显示我们请求的新页面。此时如果网络很差，你有可能看到短暂的DOM页面，然后再看到渲染后的正常页面，这是从表面看到的加载过程，实际浏览器做的要多得多。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为什么浏览器这么多戏呢？直接显示不好吗，当然不行，就像喝粥，能直接吃米、喝水吗？&lt;/p&gt;
&lt;p&gt;在用户输入URL到页面展示，浏览器要先向服务器获取前端资源，然后再将服务器返回的字节流转化成对应的页面，每一阶段都需要浏览器对应的能力进行处理的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;作为前端开发，了解整个过程其实很重要，只有知道了浏览器加载页面的整个过程，才能在开发中避免可能跳的坑，才能在发现问题后迅速定位问题，才能在性能优化时提出更多的解决方案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比如下面问题，看了文章相信你就知道了为什么了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么会存在空白页面？(为了解决这个问题，各大厂都在实践各种方案）&lt;/li&gt;
&lt;li&gt;为什么js要在Dom后面引入&lt;/li&gt;
&lt;li&gt;为什么有个页面崩溃会导致多个页面崩溃&lt;/li&gt;
&lt;li&gt;浏览器的缓存策略是怎样的？&lt;/li&gt;
&lt;li&gt;为什么我们常常修改host就可以访问对应的域名&lt;/li&gt;
&lt;li&gt;等等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二浏览器的多进程架构"&gt;二、浏览器的多进程架构&lt;/h2&gt;
&lt;p&gt;为了看懂下面的内容，这里必须要了解下现代浏览器的&lt;code&gt;多进程架构&lt;/code&gt;，&lt;code&gt;进程&lt;/code&gt;和&lt;code&gt;线程&lt;/code&gt;的关系等知识点。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;浏览器也是从单个进程架构一步步迭代到现代的多进程架构。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-024/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;如上图，我们可以看到&lt;code&gt;线程&lt;/code&gt;和&lt;code&gt;进程&lt;/code&gt;的关系&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常一个程序实例就是一个进程，浏览器会为他分配内存空间。&lt;/li&gt;
&lt;li&gt;一个进程间的数据是共享的，单线程就是一个进程包含一个线程，一个线程处理所有的任务&lt;/li&gt;
&lt;li&gt;多线程就是，一个进程中包含多个线程可以同时执行任务，共享数据和内存&lt;/li&gt;
&lt;li&gt;线程不能单独存在，必须依附于进程，一个线程失败，会导致进程执行失败，进程销毁，内存会被立即回收。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="1进程"&gt;1、进程&lt;/h3&gt;
&lt;p&gt;下图是我们打开一个掘金首页后，再打开任务管理器，观察发现，此时浏览器包括的进程有很多，浏览器主进程，GPU进程，网络进程，存储进程，音频进程，渲染进程，多个插件进程。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-024/image-02.webp"&gt;&lt;/p&gt;
&lt;p&gt;这些进程负责的功能如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;进程&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;浏览器进程&lt;/td&gt;
&lt;td&gt;负责浏览器各个子进程的通信，处理浏览器界面，包括地址栏等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;渲染进程&lt;/td&gt;
&lt;td&gt;也就是我们看到的图中的标签页进程，也就是我们常说的浏览器内核，v8就在这个进程。主要负责解析html、js、css渲染页面等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络进程&lt;/td&gt;
&lt;td&gt;负责发起网络请求，解析返回头信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUI进程&lt;/td&gt;
&lt;td&gt;负责将渲染进程生成的图块转化成位图&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;渲染进程是运行在沙箱之中的，可以执行js，但是不能获取系统权限，和浏览器进程通过IPC通讯。这是为了保证浏览器进程的安全，锁进沙箱，即使有恶意代码，也不能突破沙箱读取或写入系统信息。&lt;/p&gt;
&lt;h3 id="2线程"&gt;2、线程&lt;/h3&gt;
&lt;p&gt;通过上图，我们已经知道线程是不能独立存在的，必须依附于进程。这里我们主要关注下渲染进程，因为他的主要工作就是：完成页面的渲染和展示。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-024/image-03.webp"&gt;&lt;/p&gt;
&lt;p&gt;如图，我们可以看到渲染进程包括很多线程，除了图上展示的，还有合成线程等，各有各的作用，具体内容，我们将会在后面一章节，浏览器渲染原理分析中在来讨论。&lt;/p&gt;
&lt;h2 id="三浏览器请求的具体流程"&gt;三、浏览器请求的具体流程&lt;/h2&gt;
&lt;p&gt;从用户输入域名到浏览器渲染页面完成的过程，可以分为以下几个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1、输入信息处理&lt;/li&gt;
&lt;li&gt;2、网络请求&lt;/li&gt;
&lt;li&gt;3、服务器返回请求资源&lt;/li&gt;
&lt;li&gt;4、浏览器渲染&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里每一步涉及到的知识都非常多，其中缓存也在每个阶段占了很大比重，接着展开描述前三个阶段：&lt;/p&gt;
&lt;h3 id="1地址栏输入信息处理"&gt;1、地址栏输入信息处理&lt;/h3&gt;
&lt;p&gt;当输入一个URL，浏览器会判断输入信息是检索信息还是请求URL&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果是检索的信息，就构建请求搜索的URL，调用浏览器默认的搜索引擎进行检索。&lt;/li&gt;
&lt;li&gt;如果符合URL格式，浏览器主进程就通过IPC通信机制将URL发送给网络进程。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2网络进程发起网络请求"&gt;2、网络进程发起网络请求&lt;/h3&gt;
&lt;p&gt;1）网络进程首先会查找浏览器缓存，判断缓存是否存在，是否过期&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果存在且不过期，就直接返回缓存信息。具体的缓存策略可以接着看下面的&lt;a href="https://fe.ecool.fun/knowledge-learn#cache"&gt;浏览器缓存策略&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2）如果没有缓存或过期，就开始进行DNS解析&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS解析的过程也很复杂，最终目的就是拿到目标主机的IP地址，具体的解析过程可以看下面的域名解析&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3）建立http连接或https连接&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http通过三次握手建立连接&lt;/li&gt;
&lt;li&gt;https需要建立TLS连接，浏览器会验证网站的数字证书是否合法，是否到期，是否安全等，这里https有自己的一套认证逻辑，我们重点不在这一块。&lt;/li&gt;
&lt;li&gt;这里两个问题常被问到，不了解可以学习一下&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;http和https的区别？&lt;/li&gt;
&lt;li&gt;简述三次握手、四次挥手？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4）发送请求&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;网络进程会构建http请求头，向服务器发送实际请求&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5）网络传输，服务器处理，返回对应的资源&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请求从应用层发出，经过运输层、网络层、物理层、数据链路层找到服务器，服务器拿到请求信息，返回对应的资源&lt;/li&gt;
&lt;li&gt;这里的服务器可能是代理服务器，也可能是CDN节点，会判断当前数据是否存在缓存，如果有缓存且有效，直接返回（具体看配置的缓存策略），否则才会从服务器获取。&lt;/li&gt;
&lt;li&gt;网络传输数据也是很复杂的过程，具体可以看下面简单的介绍&lt;a href="https://fe.ecool.fun/knowledge-learn#net"&gt;计算机网络体系模型&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3服务器返回对应资源"&gt;3、服务器返回对应资源&lt;/h3&gt;
&lt;p&gt;1）处理返回信息&lt;/p&gt;</description></item><item><title>HTML 面试题</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-questions/html/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-questions/html/</guid><description>&lt;p&gt;共 77 道 HTML 面试题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-1c3850f1-2fdf-46a8-8b6e-ff9a6f1abf08"&gt;1. SPA和MPA的区别？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;难度：1 · 类型：QA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;SPA 通过前端路由在单一 HTML 中完成页面切换，交互流畅但首屏和 SEO 成本较高；MPA 每次导航请求新页面，SEO 友好且隔离性强，但交互体验有限；两者本质差异在于前后端渲染与路由职责的划分；现代项目常通过 SSR、SSG 等方式在两种模式之间折中。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;SPA 和 MPA 的区别，表面看是“页面跳转方式不同”，本质上是&lt;strong&gt;前端与服务器在渲染职责、路由控制以及资源加载策略上的分工差异&lt;/strong&gt;。理解这一点，才能在具体业务中做出合理选择。&lt;/p&gt;
&lt;p&gt;SPA（Single Page Application）只有一个 HTML 入口，首屏加载时会拉取完整的 JavaScript 应用骨架，之后的页面切换通过前端路由完成。URL 的变化并不会触发浏览器重新请求文档，而是由前端框架根据路由状态切换视图并复用已有资源。这种模式的优势在于页面切换流畅、状态可以在客户端长期保留，复杂交互体验更接近原生应用，非常适合后台系统、强交互工具型产品。但代价也同样明显：首屏资源压力大，SEO 先天不足，对 JS 执行和异常处理的依赖极高，一旦主 bundle 出现问题，整个应用都无法正常工作。&lt;/p&gt;
&lt;p&gt;MPA（Multi Page Application）则以“页面”为核心单元。每一次导航都会向服务器请求一个新的 HTML 文档，路由和渲染主要由服务端控制。页面之间天然隔离，资源和状态会随页面刷新而重置。这种模式的优势在于首屏直观、SEO 友好、容错性强，适合内容型站点、营销页和对搜索引擎依赖较高的业务场景。但在交互复杂度上，MPA 往往需要付出更多成本，例如重复加载公共资源、跨页面状态共享困难，整体体验也更接近传统 Web。&lt;/p&gt;
&lt;p&gt;从工程角度看，SPA 和 MPA 的差异还体现在构建和部署方式上。SPA 更强调前端工程化和运行时能力，构建目标是一个可长期运行的客户端应用；MPA 更强调页面级拆分和服务端模板渲染，前端更多是增强层而非控制中心。在现代实践中，两者并非对立关系，常见的折中方案包括 SSR、SSG 以及“多入口 SPA”，试图在交互体验和首屏性能、SEO 之间取得平衡。&lt;/p&gt;
&lt;p&gt;因此，选择 SPA 还是 MPA，并不存在绝对优劣，关键在于业务目标：是以复杂交互和状态管理为核心，还是以内容分发和搜索可见性为核心。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-ae93b62f-d9ef-46c2-8151-da164426f49f"&gt;2. 常见的H5标签有哪些 ，你是怎么用的&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;难度：1 · 类型：QA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;常见 H5 标签包括结构语义标签、文本语义标签、表单标签和媒体标签；实际使用中优先考虑语义表达和可访问性，而非样式；充分利用表单和媒体标签的原生能力以减少 JS 复杂度；&lt;code&gt;canvas&lt;/code&gt; 与 &lt;code&gt;svg&lt;/code&gt; 需根据场景选择；合理使用语义化标签能显著提升页面质量和长期可维护性。&lt;/p&gt;</description></item></channel></rss>