<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>HTML - 标签 - 菠菜眾長</title><link>https://lruihao.cn/tags/html/</link><description>HTML - 标签 - 菠菜眾長</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>1024@lruihao.cn (Lruihao)</managingEditor><webMaster>1024@lruihao.cn (Lruihao)</webMaster><lastBuildDate>Sun, 12 Feb 2023 19:40:43 +0800</lastBuildDate><atom:link href="https://lruihao.cn/tags/html/" rel="self" type="application/rss+xml"/><item><title>浏览器 IMG 图片原生懒加载 loading="lazy"</title><link>https://lruihao.cn/posts/native-img-loading-lazy/</link><pubDate>Sun, 12 Feb 2023 19:40:43 +0800</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/native-img-loading-lazy/</guid><description><![CDATA[<p>记录使用 HTML 原生方案实现图片的懒加载。</p>
<h2 id="语法规范">语法规范</h2>
<p>HTML <code>loading</code> 属性适用于 <code>img</code> 和 <code>iframe</code>，语法规范见 <a href="https://html.spec.whatwg.org/multipage/urls-and-fetching.html#lazy-loading-attributes"target="_blank" rel="external nofollow noopener noreferrer">HTML Standard - Lazy loading attributes<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>。</p>
<table>
<thead>
<tr>
<th style="text-align:center">关键词</th>
<th style="text-align:center">状态</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>lazy</code></td>
<td style="text-align:center">懒惰的</td>
<td>用于延迟获取资源，直到满足某些条件。</td>
</tr>
<tr>
<td style="text-align:center"><code>eager</code></td>
<td style="text-align:center">渴望的</td>
<td>用于立即获取资源；默认状态。</td>
</tr>
</tbody>
</table>
<p>属性的 <em><a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#missing-value-default"target="_blank" rel="external nofollow noopener noreferrer">缺失值默认值<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></em> 和 <em><a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#invalid-value-default"target="_blank" rel="external nofollow noopener noreferrer">无效值默认值<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></em> 都是 <a href="https://html.spec.whatwg.org/multipage/urls-and-fetching.html#attr-loading-eager-state"target="_blank" rel="external nofollow noopener noreferrer">Eager<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>状态。</p>
<h2 id="实际应用">实际应用</h2>
<p>基于 <a href="https://github.com/hugo-fixit/FixIt"target="_blank" rel="external nofollow noopener noreferrer">FixIt 主题<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> 版本大于 v0.2.18 的博客网站使用就是原生的懒加载方案，大致如下：</p>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">img</span>
</span></span><span class="line"><span class="cl">  <span class="na">loading</span><span class="o">=</span><span class="s">&#34;lazy&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">src</span><span class="o">=</span><span class="s">&#34;./example.jpg&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">data-title</span><span class="o">=</span><span class="s">&#34;title text&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">data-alt</span><span class="o">=</span><span class="s">&#34;alt text&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">onload</span><span class="o">=</span><span class="s">&#34;this.title=this.dataset.title;this.alt=this.dataset.alt;for(const a of [&#39;data-title&#39;,&#39;data-alt&#39;,&#39;onerror&#39;,&#39;onload&#39;]){this.removeAttribute(a);}this.dataset.lazyloaded=&#39;&#39;;&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">onerror</span><span class="o">=</span><span class="s">&#34;this.title=this.dataset.title;this.alt=this.dataset.alt;for(const a of [&#39;data-title&#39;,&#39;data-alt&#39;,&#39;onerror&#39;,&#39;onload&#39;]){this.removeAttribute(a);}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">/&gt;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>为了达到 loading 的效果，以上代码中在 <code>onload</code> 后会给图片加上一个 <code>data-lazyloaded</code> 属性，所以我们可以这样来写 css 以达到显示 loading 图标的效果：</p>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">img</span><span class="o">[</span><span class="nt">loading</span><span class="o">=</span><span class="s1">&#39;lazy&#39;</span><span class="o">]</span><span class="p">:</span><span class="nd">not</span><span class="o">([</span><span class="nt">data-lazyloaded</span><span class="o">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="nb">url</span><span class="p">(</span><span class="sx">loading.svg</span><span class="p">)</span> <span class="kc">no-repeat</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>设置 <code>data-title</code> 和 <code>data-alt</code> 是因为移动浏览器大多数只要有 <code>title</code> 或 <code>alt</code> 就会显示图片的替代字符，所以等到图片加载完或加载失败后再回填。</p>
<h2 id="懒加载特性的研究">懒加载特性的研究</h2>
<blockquote>
<p>以下结论来自 <a href="https://www.zhangxinxu.com/wordpress/2019/09/native-img-loading-lazy/"target="_blank" rel="external nofollow noopener noreferrer">浏览器 IMG 图片原生懒加载 loading=”lazy”实践指南 « 张鑫旭-鑫空间-鑫生活<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> 总结部分。</p>
</blockquote>
<ol>
<li>Lazy loading 加载数量与屏幕高度有关，高度越小加载数量越少，但并不是线性关系.</li>
<li>Lazy loading 加载数量与网速有关，网速越慢，加载数量越多，但并不是线性关系。</li>
<li>Lazy loading 加载没有缓冲，滚动即会触发新的图片资源加载。</li>
<li>Lazy loading 加载在窗口 resize 尺寸变化时候也会触发，例如屏幕高度从小变大的时候。</li>
<li>Lazy loading 加载也有可能会先加载后面的图片资源，例如页面加载时滚动高度很高的时候。</li>
</ol>
<h2 id="参考链接">参考链接</h2>
<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/Performance/Lazy_loading"target="_blank" rel="external nofollow noopener noreferrer">Lazy loading - Web 性能 | MDN<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://caniuse.com/loading-lazy-attr"target="_blank" rel="external nofollow noopener noreferrer">Lazy loading via attribute for images &amp; iframes 兼容性<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ul>]]></description></item><item><title>浏览器渲染原理</title><link>https://lruihao.cn/posts/browser-rendering/</link><pubDate>Sun, 05 Feb 2023 21:02:52 +0800</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/browser-rendering/</guid><description><![CDATA[<iframe src="files/browser-rendering.pdf" width="100%" height="550"></iframe>
<h2 id="浏览器是如何渲染页面的">浏览器是如何渲染页面的？</h2>
<p>当浏览器的网络线程收到 HTML 文档后，会产生一个渲染任务，并将其传递给渲染主线程的消息队列。</p>
<p>在事件循环机制的作用下，渲染主线程取出消息队列中的渲染任务，开启渲染流程。</p>
<hr>
<p>整个渲染流程分为多个阶段，分别是： HTML 解析、样式计算、布局、分层、绘制、分块、光栅化、画</p>
<p>每个阶段都有明确的输入输出，上一个阶段的输出会成为下一个阶段的输入。</p>
<p>这样，整个渲染流程就形成了一套组织严密的生产流水线。</p>
<hr>
<p>渲染的第一步是<strong>解析 HTML</strong>。</p>
<p>解析过程中遇到 CSS 解析 CSS，遇到 JS 执行 JS。为了提高解析效率，浏览器在开始解析前，会启动一个预解析的线程，率先下载 HTML 中的外部 CSS 文件和 外部的 JS 文件。</p>
<p>如果主线程解析到<code>link</code>位置，此时外部的 CSS 文件还没有下载解析好，主线程不会等待，继续解析后续的 HTML。这是因为下载和解析 CSS 的工作是在预解析线程中进行的。这就是 CSS 不会阻塞 HTML 解析的根本原因。</p>
<p>如果主线程解析到<code>script</code>位置，会停止解析 HTML，转而等待 JS 文件下载好，并将全局代码解析执行完成后，才能继续解析 HTML。这是因为 JS 代码的执行过程可能会修改当前的 DOM 树，所以 DOM 树的生成必须暂停。这就是 JS 会阻塞 HTML 解析的根本原因。</p>
<p>第一步完成后，会得到 DOM 树和 CSSOM 树，浏览器的默认样式、内部样式、外部样式、行内样式均会包含在 CSSOM 树中。</p>
<hr>
<p>渲染的下一步是<strong>样式计算</strong>。</p>
<p>主线程会遍历得到的 DOM 树，依次为树中的每个节点计算出它最终的样式，称之为 Computed Style。</p>
<p>在这一过程中，很多预设值会变成绝对值，比如<code>red</code>会变成<code>rgb(255,0,0)</code>；相对单位会变成绝对单位，比如<code>em</code>会变成<code>px</code></p>
<p>这一步完成后，会得到一棵带有样式的 DOM 树。</p>
<hr>
<p>接下来是<strong>布局</strong>，布局完成后会得到布局树。</p>
<p>布局阶段会依次遍历 DOM 树的每一个节点，计算每个节点的几何信息。例如节点的宽高、相对包含块的位置。</p>
<p>大部分时候，DOM 树和布局树并非一一对应。</p>
<p>比如<code>display:none</code>的节点没有几何信息，因此不会生成到布局树；又比如使用了伪元素选择器，虽然 DOM 树中不存在这些伪元素节点，但它们拥有几何信息，所以会生成到布局树中。还有匿名行盒、匿名块盒等等都会导致 DOM 树和布局树无法一一对应。</p>
<hr>
<p>下一步是<strong>分层</strong></p>
<p>主线程会使用一套复杂的策略对整个布局树中进行分层。</p>
<p>分层的好处在于，将来某一个层改变后，仅会对该层进行后续处理，从而提升效率。</p>
<p>滚动条、堆叠上下文、transform、opacity 等样式都会或多或少的影响分层结果，也可以通过<code>will-change</code>属性更大程度的影响分层结果。</p>
<hr>
<p>再下一步是<strong>绘制</strong></p>
<p>主线程会为每个层单独产生绘制指令集，用于描述这一层的内容该如何画出来。</p>
<hr>
<p>完成绘制后，主线程将每个图层的绘制信息提交给合成线程，剩余工作将由合成线程完成。</p>
<p>合成线程首先对每个图层进行分块，将其划分为更多的小区域。</p>
<p>它会从线程池中拿取多个线程来完成分块工作。</p>
<hr>
<p>分块完成后，进入<strong>光栅化</strong>阶段。</p>
<p>合成线程会将块信息交给 GPU 进程，以极高的速度完成光栅化。</p>
<p>GPU 进程会开启多个线程来完成光栅化，并且优先处理靠近视口区域的块。</p>
<p>光栅化的结果，就是一块一块的位图</p>
<hr>
<p>最后一个阶段就是<strong>画</strong>了</p>
<p>合成线程拿到每个层、每个块的位图后，生成一个个「指引（quad）」信息。</p>
<p>指引会标识出每个位图应该画到屏幕的哪个位置，以及会考虑到旋转、缩放等变形。</p>
<p>变形发生在合成线程，与渲染主线程无关，这就是<code>transform</code>效率高的本质原因。</p>
<p>合成线程会把 quad 提交给 GPU 进程，由 GPU 进程产生系统调用，提交给 GPU 硬件，完成最终的屏幕成像。</p>
<h2 id="什么是-reflow">什么是 reflow？</h2>
<p>reflow 的本质就是重新计算 layout 树。</p>
<p>当进行了会影响布局树的操作后，需要重新计算布局树，会引发 layout。</p>
<p>为了避免连续的多次操作导致布局树反复计算，浏览器会合并这些操作，当 JS 代码全部完成后再进行统一计算。所以，改动属性造成的 reflow 是异步完成的。</p>
<p>也同样因为如此，当 JS 获取布局属性时，就可能造成无法获取到最新的布局信息。</p>
<p>浏览器在反复权衡下，最终决定获取属性立即 reflow。</p>
<h2 id="什么是-repaint">什么是 repaint？</h2>
<p>repaint 的本质就是重新根据分层信息计算了绘制指令。</p>
<p>当改动了可见样式后，就需要重新计算，会引发 repaint。</p>
<p>由于元素的布局信息也属于可见样式，所以 reflow 一定会引起 repaint。</p>
<h2 id="为什么-transform-的效率高">为什么 transform 的效率高？</h2>
<p>因为 transform 既不会影响布局也不会影响绘制指令，它影响的只是渲染流程的最后一个「draw」阶段</p>
<p>由于 draw 阶段在合成线程中，所以 transform 的变化几乎不会影响渲染主线程。反之，渲染主线程无论如何忙碌，也不会影响 transform 的变化。</p>
]]></description></item><item><title>Web 开发规则，代码规范</title><link>https://lruihao.cn/posts/dev-rules/</link><pubDate>Thu, 15 Aug 2019 18:30:31 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/dev-rules/</guid><description><![CDATA[<h2 id="精神">精神</h2>
<ul>
<li>绝不写死代码，硬编码</li>
<li>不留不要用的、垃圾代码</li>
</ul>
<h2 id="git">Git</h2>
<ul>
<li>Master 的 BUG 必须最少且趋近于零，为最稳定的版本</li>
<li>每次 Commit 信息应该准确填写。不可模棱两可，eg: 修复 BUG、增加功能</li>
<li>禁止 Commit IDE 的 project data，e.g: .vscode</li>
<li>禁止上传垃圾代码</li>
</ul>
<blockquote>
<p>更多规则详见文档 <a href="/posts/commit-spec/">Commit 规范</a></p>
</blockquote>
<h3 id="分支branch">分支（Branch）</h3>
<ul>
<li>命名规则：应以此分支主要目的命名（修复什么 BUG，新增特定功能）</li>
<li>合并后的分支应该删除</li>
</ul>
<h3 id="commit">commit</h3>
<ul>
<li>遵循一个功能一个 commit 的原则</li>
</ul>
<h2 id="restful">Restful</h2>
<ul>
<li>
<p>资源名词站在 API 的角度思考</p>
<ul>
<li>
<p>复数名词：可以复数笔数据，回传结果为 Array</p>
<p>举例：GET/users 取得多笔使用者资料</p>
<ul>
<li>刪除，放在复数名词內，让 Router 保持一致性</li>
<li>增加，放在复数名詞內，让 Router 保持一致性</li>
</ul>
</li>
<li>
<p>单数名词：仅取得单笔数据，必须指定 PK，两两一组，回传结果为 Object
举例：GET/user/{accont} 取得单笔使用者资料，必须指定 PK</p>
</li>
</ul>
</li>
<li>
<p>URL 中一律不带 id 参数</p>
</li>
</ul>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">正确范例： calendar_manager/calendar/29
</span></span><span class="line"><span class="cl">错误范例： calendar_manager/calendar/29?id=29</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>更多规则详见文档 <a href="/posts/restful/">RESTful</a></p>
</blockquote>
<h2 id="命名">命名</h2>
<ul>
<li>命名应根据内容做有意义的命名，让后续维护人员可以顾名思义！</li>
<li>即使不会发生错误，代码英文大小写也需明确区分。</li>
</ul>
<h3 id="语意">语意</h3>
<table>
<thead>
<tr>
<th style="text-align:left">类型</th>
<th style="text-align:left">命名规则</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">属性 (Attribute, Property)</td>
<td style="text-align:left">名词 user_name、userName</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">方法 (Method, Function)</td>
<td style="text-align:left">动词 + 名词 getUserName、get_user_name</td>
<td style="text-align:left">常見的动词有：get、set、update、delete、remove</td>
</tr>
</tbody>
</table>
<h3 id="字母与分隔">字母与分隔</h3>
<table>
<thead>
<tr>
<th>语言</th>
<th>变量 (Variable, Parameter, Argument)</th>
<th>常量 (Constant)</th>
<th>面向对象 - 类名 (Class Name)</th>
<th>面向对象 - 成员 (mebmer)</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTML</td>
<td>全部小写，不同单词以「-」分隔<br />e.g: user-id</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CSS、SCSS</td>
<td>全部小写，不同单词以「-」分隔，CSS 变量以「&ndash;」开头，SCSS 变量以「$」开头<br />e.g: .user-id、&ndash;header-height、$header-height</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>JavaScript</td>
<td>驼峰式命名法<br />首字小写，不同单字「首字以大写」分隔<br /> e.g: userId</td>
<td>全部大写，不同单字以「_」分隔 MAX_COUNT</td>
<td>驼峰式命名法<br />首字大写，不同单字「首字以大写」分隔<br />一个文件放一个 Class, 文件名即为 Class Name <br />e.g: User</td>
<td>驼峰式命名法<br />公有 (public) : 首字小写，不同单词「首字以大写」分隔<br />e.g: name, getName<br />私有 (private): _公有命名规则<br />e.g: _name,_getName</td>
</tr>
<tr>
<td>Vue</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Java</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>PHP</td>
<td>全部小写，不同单词以「_」分隔<br />e.g: user_id</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Python</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SQL</td>
<td>由使用者定义的：表名、字段名<br />全部小写，不同单词以「_」分隔</td>
<td>SQL 语法、函数全部大写<br />e.g: SELECT、INSERT INTO</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="通用">通用</h2>
<ul>
<li>代码编写</li>
<li><strong>每个函数应该使用块注释，注释应包含函数功能说明、参数说明</strong>。规则见：JSDoc、JavaDoc</li>
<li>不必要的代码不要写，也应禁止放到注释里面！</li>
<li>if-else 的 {} 严禁省略</li>
<li>
</li>
<li>代码规范、代码排版等可通过 eslint 等工具做统一处理</li>
</ul>
<h3 id="正确写法">正确写法</h3>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">public</span> <span class="kd">function</span> <span class="nx">test</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">===</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="错误写法">错误写法</h2>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">public</span> <span class="kd">function</span> <span class="nx">test</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">===</span> <span class="nx">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>代码排版
<ul>
<li>任何代码应该以 2 个 space 为一个缩进做好排版、不可使用 tab</li>
</ul>
</li>
<li>函数 (Function, Methd)
<ul>
<li>函数声明时需在函数上方加上函数注释，注释应包含函数说明、参数内容（参数类型、参数英文名称、参数说明）、返回值内容（返回值类型、返回值说明）</li>
</ul>
</li>
<li>类 (Class)
<ul>
<li>一个类（Class）的声明只能存在一个文件</li>
<li>类（Class）的声明文件，文件名必须为类名</li>
</ul>
</li>
<li>其他
<ul>
<li>连接本地任何其他资源（图片、文件、网站）皆使用相对路径，禁止使用绝对路径，非本地资源除外</li>
</ul>
</li>
</ul>
<h2 id="html">HTML</h2>
<h3 id="代码编写">代码编写</h3>
<ul>
<li>禁止在 HTML 使用 <code>&lt;style&gt;</code>、<code>&lt;script&gt;</code>，一律使用外部档案引用方式引用 CSS、JavaScript 文件</li>
<li>HTML 标签需成双成对，有头有尾</li>
<li>块级标签：<code>&lt;tag&gt;&lt;/tag&gt;</code></li>
<li>单标签：<code>&lt;tag /&gt;</code></li>
<li>禁止使用已被 HTML 舍弃的旧标签、属性，如：</li>
</ul>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- html tag --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">center</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">font</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">basefont</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">s</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">strike</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">u</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">listing</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">plaintext</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">xmp</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- html attribute --&gt;</span>
</span></span><span class="line"><span class="cl">align
</span></span><span class="line"><span class="cl">bgcolor
</span></span><span class="line"><span class="cl">color</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="css">CSS</h2>
<blockquote>
<p>CSS 的定义应该独立一个 CSS 文件，禁止使用 <code>&lt;style&gt;</code> 或 <code>style</code> 属性直接在 HTML 中定义样式。</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<blockquote>
<p>禁止使用 HTML 字串，一律使用 Dom 产生 HTML, e.g: <code>document.createDocumentFragment()</code></p>
</blockquote>
<h3 id="注释">注释</h3>
<p>JavaScript 注释应该遵循 JSDoc 的标准撰写</p>
<h4 id="全局变量-global">全局变量 (Global)</h4>
<div class="highlight" id="id-5"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/* global ZT */</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="常量-constant">常量 (Constant)</h4>
<div class="highlight" id="id-6"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 常量說明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @type {常量类型}
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-7"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 请求地址
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @type {String}
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">REQUEST_URL</span> <span class="o">=</span> <span class="s1">&#39;http://localhost:8080&#39;</span><span class="p">;</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="函數方法-function-method">函數、方法 (Function, Method)</h4>
<div class="highlight" id="id-8"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 函数用途说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} 参数名称参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} [选择性参数名称] 参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} [选择性参数名称=参数预设值] 参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns {返回值类型} 返回值说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-9"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 取得使用者
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {Int} userId 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {Object} [options] 其他选项
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {String} [options.query=&#39;a&#39;] 查询关键词 默认为 &#39;a&#39;
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns {Object} 使用者资料
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getUser</span><span class="p">(</span><span class="nx">userId</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">return</span> <span class="nx">user</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="vue">Vue</h2>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="java">Java</h2>
<p>Java 注释应该遵循 JavaDoc 的标准撰写</p>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="php">PHP</h2>
<h3 id="前端参数取得">前端参数取得</h3>
<p>参数取得需通过 filter_input 函数取得，不得使用 _GET 、_POST</p>
<h3 id="输出到前台">输出到前台</h3>
<p>参数命名必须为：全部小写，不同单字以「_」分隔</p>
<h3 id="注解">注解</h3>
<p>PHP 注解应该遵循 PHPDoc 的标准撰写</p>
<h3 id="成员变量-member">成员变量 (Member)</h3>
<p>成员变量只的是 Class 内的成员变数，我们都会要求替成员变量增加注解说明。通常 Function 的变量除非太特别否则都不需要特别注解说明。</p>
<div class="highlight" id="id-10"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 成员变量說明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @type {类型}
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-11"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @type {String}
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="nv">$userId</span> <span class="o">=</span> <span class="s1">&#39;Hello&#39;</span><span class="p">;</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="函数方法-function-method">函数、方法 (Function, Method)</h3>
<div class="highlight" id="id-12"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 函数用途说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param 参数型态 参数名称 参数说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @option 参数选项类型 参数选项名称 参数选项说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @uses 全局变量 全域变数说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @returns 返回值类型 返回值说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-13"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 取得使用者
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param int userId 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param object options 其他选项
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @option string options[&#39;query&#39;] 查询关键字
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @uses $_POST[&#39;role_id&#39;] 从前端以 POST 取得角色 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @returns object 使用者资料
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">getUser</span> <span class="p">(</span><span class="nv">$userId</span><span class="p">,</span> <span class="nv">$options</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">return</span> <span class="nv">$user</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="python">Python</h2>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="database">Database</h2>
<ul>
<li>禁止使用 Table Join。</li>
<li>禁止使用 Oracle Trigger。</li>
<li>禁止将查询数据库的 SQL 放在循环中查询</li>
</ul>
<h3 id="sql-撰写">SQL 撰写</h3>
<ul>
<li>属于 SQL 语法使用大写（SELECT，WHERE，INSERT etc..）</li>
<li>属于使用者自己定义的使用小写（表名 table name，字段名 column name etc..）</li>
<li>表名、字段名前后需加上 `</li>
</ul>
<p><strong>Example</strong></p>
<div class="highlight" id="id-14"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="o">`</span><span class="k">user</span><span class="o">`</span><span class="w"> </span><span class="k">VALUES</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;b&#39;</span><span class="p">);</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="统一用词">统一用词</h2>
<blockquote>
<p>系统中常用词，例如弹出框按钮、搜索框等，仅为举例，不限与此。</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align:left">用词</th>
<th style="text-align:left">统一</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">最后、最终</td>
<td style="text-align:left">最后</td>
</tr>
<tr>
<td style="text-align:left">关闭、Cancel、取消</td>
<td style="text-align:left">取消</td>
</tr>
<tr>
<td style="text-align:left">存储、保存、修改、OK、确定</td>
<td style="text-align:left">确定</td>
</tr>
<tr>
<td style="text-align:left">搜寻、查询、查找、搜索</td>
<td style="text-align:left">搜索</td>
</tr>
</tbody>
</table>
]]></description></item><item><title>条件注释判断浏览器版本&lt;!--[if lt IE 9]>;</title><link>https://lruihao.cn/posts/ifzhushi/</link><pubDate>Fri, 10 May 2019 13:08:27 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/ifzhushi/</guid><description><![CDATA[<blockquote>
<p><span>&lt;!--[if !IE]&gt;&lt;!--&gt; 除 IE 外都可识别 &lt;!--&lt;![endif]--&gt;</span><br><span>&lt;!--[if IE]&gt; 所有的 IE 可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if IE 6]&gt; 仅 IE6 可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if lt IE 6]&gt; IE6 以及 IE6 以下版本可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if gte IE 6]&gt; IE6 以及 IE6 以上版本可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if IE 7]&gt; 仅 IE7 可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if lt IE 7]&gt; IE7 以及 IE7 以下版本可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if gte IE 7]&gt; IE7 以及 IE7 以上版本可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if IE 8]&gt; 仅 IE8 可识别 &lt;![endif]--&gt;</span><br><span>&lt;!--[if IE 9]&gt; 仅 IE9 可识别 &lt;![endif]--&gt;</span></p>
</blockquote>
<table align="center"> <tbody> <tr><th width="50">项目</th><th width="150">范例</th><th>说明</th></tr> <tr> <td align="middle">!</td><td>[if !IE]</td><td>The NOT operator. This is placed immediately in front of the&nbsp;<em>feature</em>,&nbsp;<em>operator</em>, or&nbsp;<em>subexpression</em>&nbsp;to reverse the Boolean meaning of the expression.<br />NOT 运算符。这是摆立即在前面的<em>功能</em>，<em>操作员</em>，或<em>子表达式</em>扭转布尔表达式的意义。</td></tr><tr><td align="middle">lt</td> <td>[if lt IE 5.5]</td> <td>The less-than operator. Returns true if the first argument is less than the second argument.<br />小于运算符。如果第一个参数小于第二个参数，则返回 true。</td> </tr><tr><td align="middle">lte</td><td>[if lte IE 6]</td><td>The less-than or equal operator. Returns true if the first argument is less than or equal to the second argument.<br />小于或等于运算。如果第一个参数是小于或等于第二个参数，则返回 true。</td> </tr><tr><td align="middle">gt</td><td>[if gt IE 5]</td><td>The greater-than operator. Returns true if the first argument is greater than the second argument.<br />大于运算符。如果第一个参数大于第二个参数，则返回 true。</td> </tr><tr><td align="middle">gte</td> <td>[if gte IE 7]</td><td>The greater-than or equal operator. Returns true if the first argument is greater than or equal to the second argument.<br />大于或等于运算。如果第一个参数是大于或等于第二个参数，则返回 true。</td> </tr><tr><td align="middle">( )</td><td>[if !(IE 7)]</td><td>Subexpression operators. Used in conjunction with boolean operators to create more complex expressions.<br />子表达式运营商。在与布尔运算符用于创建更复杂的表达式。</td></tr><tr><td align="middle">&amp;</td><td>[if (gt IE 5)&amp;(lt IE 7)]</td><td>The AND operator. Returns true if all subexpressions evaluate to true<br />AND 运算符。如果所有的子表达式计算结果为 true，返回 true</td></tr><tr><td align="middle">|</td><td>[if (IE 6)|(IE 7)]</td><td>The OR operator. Returns true if any of the subexpressions evaluates to true.<br />OR 运算符。返回 true，如果子表达式计算结果为 true。</td></tr></tbody></table>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="c">&lt;!--[if lt IE 9]&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">加载 CSS1
</span></span></span><span class="line"><span class="cl"><span class="c">&lt;!--[else]&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">加载 CSS2
</span></span></span><span class="line"><span class="cl"><span class="c">&lt;![endif]--&gt;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>这样有效是有效，但是用 HTML VALIDATOR 里，报错，因为这个不符合 XHTML 1.1 的规范，
如果把 ELSE 语句去掉，则正确。</p>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">加载 CSS2
</span></span><span class="line"><span class="cl"><span class="c">&lt;!--[if lt IE 9]&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">加载 CSS1（可以把要重写的写在这里）.
</span></span></span><span class="line"><span class="cl"><span class="c">&lt;![endif]--&gt;</span></span></span></code></pre></td></tr></table>
</div>
</div>]]></description></item><item><title>前端面试题 - HTML+CSS</title><link>https://lruihao.cn/posts/ms-html-css/</link><pubDate>Sat, 30 Mar 2019 22:58:39 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/ms-html-css/</guid><description><![CDATA[<blockquote>
<p><a href="https://github.com/ltadpoles/web-document/tree/master/Other"target="_blank" rel="external nofollow noopener noreferrer">原文链接<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a><br>
“卓越班”到了大三突然掀起一股毕业慌，一部分人投身于考研的热潮中，一部分人选择了培训机构学习技术。而我出于种种原因既不考研也不培训，选择自学 java 和 web 相关的知识，也希望因此能在以后谋得一份心仪的工作。</p>
</blockquote>
<p>如果文章中有出现纰漏、错误之处，还请看到的小伙伴多多指教，先行谢过</p>
<h2 id="html">HTML</h2>
<h3 id="1-doctype-作用html5-为什么只需要写-doctype-html">1. Doctype 作用，HTML5 为什么只需要写 <!DOCTYPE HTML></h3>
<blockquote>
<p>doctype 是一种标准通用标记语言的文档类型声明，目的是告诉标准通用标记语言解析器要使用什么样的文档类型定义（DTD）来解析文档。<code>&lt;!DOCTYPE&gt;</code>声明必须是 HTML 文档的第一行，位于 html 标签之前</p>
</blockquote>
<blockquote>
<p>HTML5 不基于 SGML，所以不需要引用 DTD。在 HTML5 中<!DOCTYPE>只有一种</p>
</blockquote>
<blockquote>
<p>SGML: 标准通用标记语言，是现时常用的超文本格式的最高层次标准</p>
</blockquote>
<h3 id="2-行内元素有哪些块级元素有哪些空-void-元素有那些">2. 行内元素有哪些，块级元素有哪些，空 (void) 元素有那些</h3>
<p>行内元素：<code>a</code> <code>span</code> <code>i</code> <code>img</code> <code>input</code> <code>select</code> <code>b</code> 等</p>
<p>块级元素：<code>div</code> <code>ul</code> <code>ol</code> <code>li</code> <code>h1~h6</code> <code>p</code> <code>table</code> 等</p>
<p>空元素：<code>br</code> <code>hr</code> <code>link</code> 等</p>
<h3 id="3-简述一下你对-html-语义化的理解">3. 简述一下你对 HTML 语义化的理解</h3>
<p>简单来说，就是合适的标签做合适的事情，这样具有以下好处：</p>
<ul>
<li>有助于构架良好的 HTML 结构，有利于搜索引擎的建立索引、抓取，利于 SEO</li>
<li>有利于不同设备的解析</li>
<li>有利于构建清晰的机构，有利于团队的开发、维护</li>
</ul>
<h3 id="4-常见的浏览器内核有哪些介绍一下你对浏览器内核的理解h5">4. 常见的浏览器内核有哪些，介绍一下你对浏览器内核的理解</h5></h3>
<blockquote>
<p>Trident 内核：IE</p>
</blockquote>
<blockquote>
<p>Gecko 内核：NETSCAPE6 及以上版本，火狐</p>
</blockquote>
<blockquote>
<p>Presto 内核：Opera7 及以上。[Opera 内核原为：Presto，现为：Blink;]</p>
</blockquote>
<blockquote>
<p>Webkit 内核：Safari，Chrome 等。[Chrome 的：Blink（WebKit 的分支）]</p>
</blockquote>
<p>浏览器内核又可以分成两部分：<strong>渲染引擎和 JS 引擎。</strong> 渲染引擎主要负责取得网页的内容、整理讯息、计算网页的显示方式等，JS 引擎则是解析 Javascript 语言，执行 javascript 语言来实现网页的动态效果。</p>
<h3 id="5-html5-有哪些新特性">5. html5 有哪些新特性</h3>
<ul>
<li>语义化标签：<code>header</code> <code>footer</code> <code>nav</code> <code>section</code> <code>article</code> <code>aside</code> 等</li>
<li>增强型表单：<code>date</code>（从一个日期选择器选择一个日期） <code>email</code>（包含 e-mail 地址的输入域） <code>number</code>（数值的输入域） <code>range</code>（一定范围内数字值的输入域） <code>search</code>（用于搜索域） <code>tel</code>（定义输入电话号码字段） 等</li>
<li>视频和音频：<code>audio</code> <code>video</code></li>
<li>Canvas 绘图 SVG 绘图</li>
<li>地理定位：<code>Geolocation</code></li>
<li>拖放 API：<code>drag</code></li>
<li>web worker：是运行在后台的 JavaScript，独立于其他脚本，不会影响页面的性能</li>
<li>web storage: <code>localStorage</code> <code>sessionStorage</code></li>
<li>WebSocket: HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议</li>
</ul>
<h3 id="6-描述一下-cookiesessionstorage-和-localstorage-的区别">6. 描述一下 cookie，sessionStorage 和 localStorage 的区别</h3>
<table>
<thead>
<tr>
<th style="text-align:left">特性</th>
<th style="text-align:left">Cookie</th>
<th style="text-align:left">localStorage</th>
<th style="text-align:left">sessionStorage</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">生命周期</td>
<td style="text-align:left">可设置失效时间，没有设置的话，默认是关闭浏览器后失效</td>
<td style="text-align:left">除非被手动清除，否则将会永久保存</td>
<td style="text-align:left">仅在当前网页会话下有效，关闭页面或浏览器后就会被清除</td>
</tr>
<tr>
<td style="text-align:left">存放数据大小</td>
<td style="text-align:left">4KB 左右</td>
<td style="text-align:left">可以保存 5MB 的信息</td>
<td style="text-align:left">可以保存 5MB 的信息</td>
</tr>
<tr>
<td style="text-align:left">http 请求</td>
<td style="text-align:left">每次都会携带在 HTTP 头中，如果使用 cookie 保存过多数据会带来性能问题</td>
<td style="text-align:left">仅在客户端（即浏览器）中保存，不参与和服务器的通信</td>
<td style="text-align:left">仅在客户端（即浏览器）中保存，不参与和服务器的通信</td>
</tr>
</tbody>
</table>
<h3 id="7-如何实现浏览器内多个标签页之间的通信">7. 如何实现浏览器内多个标签页之间的通信</h3>
<ul>
<li>使用 localStorage: <code>localStorage.setItem(key,value)</code>、<code>localStorage.getItem(key)</code></li>
<li>websocket 协议</li>
<li>webworker</li>
</ul>
<p><a href="https://juejin.im/post/5acdba01f265da23826e5633"target="_blank" rel="external nofollow noopener noreferrer">多个标签页之间的通信<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h3 id="8-html5-的离线存储怎么使用解释一下工作原理">8. HTML5 的离线存储怎么使用，解释一下工作原理</h3>
<p><a href="https://segmentfault.com/a/1190000006984353"target="_blank" rel="external nofollow noopener noreferrer">HTML5 的离线存储<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h3 id="9-src-与-href-的区别">9. src 与 href 的区别</h3>
<p>区别：src 用于替代这个元素，而 href 用于建立这个标签与外部资源之间的关系</p>
<p><code>&lt;link href=&quot;style.css&quot; rel=&quot;stylesheet&quot; /&gt;</code>浏览器加载到这里的时候，html 的渲染和解析不会暂停，css 文件的加载是同时进行的</p>
<p><code>&lt;script src=&quot;script.js&quot;&gt;&lt;/script&gt;</code>当浏览器解析到这句代码时，页面的加载和解析都会暂停直到浏览器拿到并执行完这个 js 文件</p>
<h3 id="10-表单提交中-get-和-post-方式的区别">10. 表单提交中 Get 和 Post 方式的区别</h3>
<ul>
<li>Get 一般用于从服务器上获取数据，Post 向服务器传送数据</li>
<li>Get 传输的数据是拼接在 Url 之后的，对用户是可见的；Post 的传输数据对用户是不可见的</li>
<li>Get 传送的数据量较小，不能大于 2KB。Post 传送的数据量较大，一般被默认为不受限制</li>
<li>Get 安全性非常低，Post 安全性较高</li>
<li>在 FORM 提交的时候，如果不指定 Method，则默认为 Get 请求</li>
</ul>
<h2 id="css">CSS</h2>
<h3 id="1-css-盒子模型box-sizing-属性的理解">1. css 盒子模型，box-sizing 属性的理解</h3>
<p>css 的盒模型由 content（内容）、padding（内边距）、border（边框）、margin（外边距）组成。但盒子的大小由 content+padding+border 这几部分决定</p>
<p>box-sizing 是一个 CSS3 属性，与盒子模型有着密切联系。即决定元素的宽高如何计算，box-sizing 有三个属性：</p>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">box-sizing</span><span class="o">:</span> <span class="nt">content-box</span><span class="o">|</span><span class="nt">border-box</span><span class="o">|</span><span class="nt">inherit</span><span class="o">:</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>content-box 使得元素的宽高即为内容区的宽高（默认模式）</li>
<li>border-box: 计算方式 content + padding + border = 本身元素大小，即缩小了 content 大小</li>
<li>inherit 指定 box-sizing 属性的值，应该从父元素继承</li>
</ul>
<h3 id="2-清除浮动什么时候需要清除浮动清除浮动都有哪些方法">2. 清除浮动，什么时候需要清除浮动，清除浮动都有哪些方法</h3>
<p>浮动的元素是脱离文档标准流的，如果我们不清楚浮动，那么就会造成<strong>父元素高度塌陷</strong>，影响页面布局。</p>
<p>清除浮动的方式：</p>
<ul>
<li>为父元素设置高度</li>
<li>为父元素添加<code>overflow:hidden</code></li>
<li>伪元素</li>
</ul>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">fix</span><span class="p">::</span><span class="nd">after</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">content</span><span class="p">:</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">block</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">clear</span><span class="p">:</span> <span class="kc">both</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>使用伪元素的好处：不增加冗余的 DOM 节点，符合语义化</p>
<blockquote>
<p>overflow:hidden 可以触发 BFC 机制。BFC：块级格式化上下文，创建了 BFC 的元素就是一个独立的盒子，它规定了内部如何布局，并且与这个独立盒子里的布局不受外部影响，当然它也不会影响到外面的元素，<strong>计算 BFC 的高度时，浮动元素也参与计算</strong></p>
</blockquote>
<h3 id="3-如何让一个不定宽高的盒子水平垂直居中">3. 如何让一个不定宽高的盒子水平垂直居中</h3>
<blockquote>
<p>定位的方式</p>
</blockquote>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">father</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">son</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">absolute</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">top</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">right</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">bottom</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">left</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin</span><span class="p">:</span> <span class="kc">auto</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>css3 属性</p>
</blockquote>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">father</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">son</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">absolute</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">top</span><span class="p">:</span> <span class="mi">50</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">left</span><span class="p">:</span> <span class="mi">50</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">transform</span><span class="p">:</span> <span class="nb">translate</span><span class="p">(</span><span class="mi">-50</span><span class="kt">%</span><span class="p">,</span> <span class="mi">-50</span><span class="kt">%</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>flex 布局</p>
</blockquote>
<div class="highlight" id="id-5"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">father</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">justify-content</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4-px-和-em-和-rem-的区别">4. px 和 em 和 rem 的区别</h3>
<blockquote>
<p><code>px</code>: 像素，相对长度单位。像素<code>px</code>是相对于显示器屏幕分辨率而言的</p>
</blockquote>
<blockquote>
<p><code>em</code>的值并不是固定的，会继承父级元素的字体大小，代表倍数</p>
</blockquote>
<blockquote>
<p><code>rem</code>的值并不是固定的，始终是基于根元素 <code>&lt;html&gt;</code> 的，也代表倍数</p>
</blockquote>
<h3 id="5-position-的值有哪些">5. position 的值有哪些</h3>
<blockquote>
<p>static： 默认值。没有定位，元素出现在正常的流中</p>
</blockquote>
<blockquote>
<p>relative（相对定位）：生成相对定位的元素，相对于其正常（原先本身）位置进行定位</p>
</blockquote>
<blockquote>
<p>absolute（绝对定位）：生成绝对定位的元素，相对于 static 定位以外的第一个父元素进行定位</p>
</blockquote>
<blockquote>
<p>fixed（固定定位）：生成绝对定位的元素，相对于浏览器窗口进行定位</p>
</blockquote>
<h3 id="6-displaynone-与-visibilityhidden-的区别">6. display:none 与 visibility：hidden 的区别</h3>
<table>
<thead>
<tr>
<th>区别</th>
<th>display:none</th>
<th>visibility：hidden 的</th>
</tr>
</thead>
<tbody>
<tr>
<td>是否占据空间</td>
<td>不占据任何空间，在文档渲染时，该元素如同不存在（但依然存在文档对象模型树中）</td>
<td>该元素空间依旧存在</td>
</tr>
<tr>
<td>是否渲染</td>
<td>会触发 reflow（回流），进行渲染</td>
<td>只会触发 repaint（重绘），因为没有发现位置变化，不进行渲染</td>
</tr>
<tr>
<td>是否是继承属性</td>
<td>不是继承属性，元素及其子元素都会消失</td>
<td>是继承属性，若子元素使用了 visibility:visible，则不继承，这个子孙元素又会显现出</td>
</tr>
</tbody>
</table>
<h3 id="7-css-中-link-和import-的区别">7. CSS 中 link 和@import 的区别</h3>
<blockquote>
<p>link 属于 XHTML 标签，@import 完全是 CSS 提供的一种方式，只能加载 CSS</p>
</blockquote>
<blockquote>
<p>加载顺序的差别，当一个页面被加载的时候，link 引用的 CSS 会同时被加载，而@import 引用的 CSS 会等到页面全部被下载完再被加载</p>
</blockquote>
<blockquote>
<p>兼容性的差别。由于@import 是 CSS2.1 提出的所以老的浏览器不支持，而 link 标签无此问题</p>
</blockquote>
<blockquote>
<p>当使用 javascript 控制 dom 去改变样式的时候，只能使用 link 标签，因为@import 不是 dom 可以控制的</p>
</blockquote>
<h3 id="8-什么是响应式设计响应式设计的基本原理是什么">8. 什么是响应式设计，响应式设计的基本原理是什么</h3>
<blockquote>
<p>响应式网站设计是一个网站能够兼容多个终端，而不是为每一个终端做一个特定的版本。基本原理是通过媒体查询检测不同的设备屏幕尺寸做处理</p>
</blockquote>
<h3 id="9-为什么要初始化-css-样式">9. 为什么要初始化 CSS 样式</h3>
<blockquote>
<p>因为浏览器的兼容问题，不同浏览器对有些标签的默认值是不同的，如果没对 CSS 初始化往往会出现浏览器之间的页面显示差异</p>
</blockquote>
<blockquote>
<p>初始化样式会对 SEO 有一定的影响</p>
</blockquote>
<h3 id="10-css3-有哪些新特性">10. CSS3 有哪些新特性</h3>
<ul>
<li>实现圆角<code>border-radius</code>，阴影<code>box-shadow</code>，边框图片<code>border-image</code></li>
<li>对文字加特效<code>text-shadow</code>，强制文本换行<code>word-wrap</code>，线性渐变<code>linear-gradient</code></li>
<li>实现旋转<code>transform:rotate(90deg)</code>, 缩放<code>scale(0.85,0.90)</code>,<code>translate(0px,-30px)</code>定位，倾斜<code>skew(-9deg,0deg)</code>;</li>
<li>增加了更多的 CSS 选择器、多背景、<code>rgba()</code></li>
<li>唯一引入的伪元素是<code>::selection</code>；</li>
<li>实现媒体查询<code>@media</code>，多栏布局<code>flex</code></li>
<li>过渡<code>transition</code> 动画<code>animation</code></li>
</ul>
<h3 id="11-before-和-after-中双冒号和单冒号有什么区别解释一下这-2-个伪元素的作用">11. ::before 和 :after 中双冒号和单冒号有什么区别？解释一下这 2 个伪元素的作用</h3>
<blockquote>
<p>单冒号 (:) 用于 CSS3 伪类，双冒号 (::) 用于 CSS3 伪元素。（伪元素由双冒号和伪元素名称组成）, 双冒号是在当前规范中引入的，用于区分伪类和伪元素</p>
</blockquote>
<h3 id="12-css-优化提高性能的方法有哪些">12. CSS 优化、提高性能的方法有哪些</h3>
<ul>
<li>移除空的 css 规则（Remove empty rules）</li>
<li>正确使用 display 的属性</li>
<li>不滥用浮动、web 字体</li>
<li>不声明过多的 font-size</li>
<li>不在选择符中使用 ID 标识符</li>
<li>遵守盒模型规则</li>
<li>尽量减少页面重排、重绘</li>
<li>抽象提取公共样式，减少代码量</li>
</ul>
<h3 id="13-重绘和回流">13. 重绘和回流</h3>
<p><a href="https://juejin.im/post/5a9923e9518825558251c96a"target="_blank" rel="external nofollow noopener noreferrer">重绘和回流<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h3 id="14-flex-布局">14. flex 布局</h3>
<p><a href="http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html"target="_blank" rel="external nofollow noopener noreferrer">flex 布局教程&ndash;阮一峰<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h3 id="15-css-预处理器">15. css 预处理器</h3>
<p>提供了一种 css 的书写方式，常见的就是 <a href="http://sass.bootcss.com/docs/sass-reference/"target="_blank" rel="external nofollow noopener noreferrer">SAAS 文档<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> 和 <a href="https://less.bootcss.com/"target="_blank" rel="external nofollow noopener noreferrer">LESS 文档<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>]]></description></item></channel></rss>