<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/assets/rss-20b3285f.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>标签: CSS - ouuan's blog</title>
        <link>https://ouuan.moe/tag/CSS</link>
        <description>标签为 CSS 的文章 - ouuan 的博客</description>
        <lastBuildDate>Thu, 09 Feb 2023 15:19:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2022 - 2026 ouuan
Licensed under CC BY-SA 4.0</copyright>
        <atom:link href="https://ouuan.moe/tag/CSS/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[一些博客排版优化小 trick]]></title>
            <link>https://ouuan.moe/post/2023/02/typography-tricks</link>
            <guid>https://ouuan.moe/post/2023/02/typography-tricks</guid>
            <pubDate>Thu, 09 Feb 2023 15:19:45 GMT</pubDate>
            <description><![CDATA[

<p>我的博客好像还用了不少奇怪的小 trick 来优化 <span class="mojikumi">（</span><s>hopefully</s><span class="mojikumi">）</span> 排版<span class="mojikumi-line-end">，</span>在这整理一下<span class="mojikumi-line-end">，</span>分享出来<span class="mojikumi-line-end">，</span>也是怕几年<span class="mojikumi-line-start">（</span><s>几天</s><span class="mojikumi-line-end">）</span>后想不起来这些奇怪的东西是在干什么<span class="mojikumi-line-end">。</span></p>
<p>主要是 text justify 相关和标点挤压相关<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[

<p>我的博客好像还用了不少奇怪的小 trick 来优化 <span class="mojikumi">（</span><s>hopefully</s><span class="mojikumi">）</span> 排版<span class="mojikumi-line-end">，</span>在这整理一下<span class="mojikumi-line-end">，</span>分享出来<span class="mojikumi-line-end">，</span>也是怕几年<span class="mojikumi-line-start">（</span><s>几天</s><span class="mojikumi-line-end">）</span>后想不起来这些奇怪的东西是在干什么<span class="mojikumi-line-end">。</span></p>
<p>主要是 text justify 相关和标点挤压相关<span class="mojikumi-line-end">。</span></p>

<p>我博客的 Markdown 渲染基于 <a href="https://github.com/unifiedjs/unified">unified</a><span class="mojikumi-line-end">，</span>所以下面的一些优化是以 unified 插件<span class="mojikumi-line-start">（</span>remark / remark-rehype / rehype 插件<span class="mojikumi-line-end">）</span>的形式实现的<span class="mojikumi-line-end">。</span></p>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-orange-1 dark:bg-orange-9 b-orange" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h2 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-alert-circle-outline text-orange" data-v-a2ab257f></span><!--v-if--><span data-v-a2ab257f>Warning</span></h2><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>为了直观地进行演示<span class="mojikumi-line-end">，</span>本文可能会在提到一个问题的段落通过设置文本和 CSS 特意制造出相应的问题<span class="mojikumi-line-end">，</span>并禁用对这个问题的处理措施以将问题展示出来<span class="mojikumi-line-end">。</span></p></div></div></aside>
<h2 id="text-justify-相关" class="heading"><a href="#text-justify-相关" class="heading-anchor" aria-label="章节： text justify 相关" tabindex="-1"></a><span>text justify 相关</span></h2>
<p>在每行的宽度略有差异时<span class="mojikumi-line-end">，</span><a href="https://www.w3.org/TR/2022/DNOTE-clreq-20221009/#line_adjustment">使用两端对齐会让中文排版更加美观</a><span class="mojikumi-line-end">，</span>这一般通过 <a href="https://developer.mozilla.org/docs/Web/CSS/text-align"><code>text-align</code> CSS 属性</a> 的 <code>justify</code> 选项实现<span class="mojikumi-line-end">。</span>但由于网页排版的不确定性<span class="mojikumi-line-end">，</span>每行的宽度可能不是略有差异而是有很大差异<span class="mojikumi-line-end">，</span>这时使用 text justify 就会造成过大的空隙<span class="mojikumi-line-end">，</span>所以需要避免出现过短的行<span class="mojikumi-line-end">，</span>或者在有必要时禁用 text justify<span class="mojikumi-line-end">。</span></p>
<h3 id="langzh-cn-对-text-justify-的影响" class="heading"><a href="#langzh-cn-对-text-justify-的影响" class="heading-anchor" aria-label="章节： lang=&#x22;zh-CN&#x22; 对 text justify 的影响" tabindex="-1"></a><span>lang="zh-CN" 对 text justify 的影响</span></h3>
<p>这个并不是 trick<span class="mojikumi-line-end">，</span>是基操<span class="mojikumi-line-end">，</span>但挺重要的<span class="mojikumi-line-end">，</span>还是写在这<span class="mojikumi-line-end">。</span></p>
<p>如果没有将 HTML 的 <a href="https://developer.mozilla.org/docs/Web/HTML/Global_attributes/lang"><code>lang</code> 属性</a> 设为中文<span class="mojikumi-line-end">，</span>在 Firefox 109<span class="mojikumi-line-start">（</span>以及其他版本 / 其他浏览器<span class="mojikumi-line-end">，</span>但不包括 Chrome 109<span class="mojikumi-line-end">）</span>中就会按照英文的规则<span class="mojikumi-line-end">，</span>将连续的汉字视作一个单词<span class="mojikumi-line-end">，</span>而只在词与词之间增大间距<span class="mojikumi-line-end">，</span>不改变汉字之间的间距<span class="mojikumi-line-end">，</span>如下所示<span class="mojikumi-line-end">：</span></p>
<p lang="en" style="margin: auto; width: 12em; border: gray solid 1px;">这是一个设置了 <code>lang="en"</code> 和固定宽度的段落<span class="mojikumi-line-end">，</span>这是一个 loooooooooooooooong word<span class="mojikumi-line-end">。</span></p>
<p><picture><img type="image/webp" srcset="/assets/firefox-text-justify-en.9aad62d5.webp" loading="lazy" src="/assets/firefox-text-justify-en.9aad62d5.webp" width="243" height="162" alt="上面的 lang 设为 en 的段落在 Firefox 109 中的渲染效果"></picture></p>
<p>其中<span class="mojikumi-line-end">，</span>第一行没有两端对齐<span class="mojikumi-line-end">，</span>而第三行只在逗号后面增加了间距<span class="mojikumi-line-end">。</span></p>
<p>如果设置了 <code>lang<wbr>="<wbr>zh<wbr>-<wbr>CN<wbr>"</code> 则会在汉字间添加间距<span class="mojikumi-line-end">：</span></p>
<p lang="zh-CN" style="margin: auto; width: 12em; border: gray solid 1px;">这是一个设置了 <code>lang="zh-CN"</code> 和固定宽度的段落<span class="mojikumi-line-end">，</span>这是一个 loooooooooooooooong word<span class="mojikumi-line-end">。</span></p>
<p><picture><img type="image/webp" srcset="/assets/firefox-text-justify-zh-CN.e85aebf7.webp" loading="lazy" src="/assets/firefox-text-justify-zh-CN.e85aebf7.webp" width="245" height="161" alt="上面的 lang 设为 zh-CN 的段落在 Firefox 109 中的渲染效果"></picture></p>
<p>当然<span class="mojikumi-line-end">，</span>设置 HTML 的 <code>lang</code> 属性还有其他作用<span class="mojikumi-line-end">，</span>不管怎么样总是得设一个的<span class="mojikumi-line-end">。</span></p>
<h3 id="断开过长的行内代码" class="heading"><a href="#断开过长的行内代码" class="heading-anchor" aria-label="章节： 断开过长的行内代码" tabindex="-1"></a><span>断开过长的行内代码</span></h3>
<p>有时候会遇到一些 <code style="word-break: normal;">veryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongInlineCode</code><span class="mojikumi-line-end">，</span>为了让它不断开<span class="mojikumi-line-end">，</span>前面的一行就会非常短<span class="mojikumi-line-end">，</span>justify 后间隙就非常大<span class="mojikumi-line-end">。</span>当然<span class="mojikumi-line-end">，</span>这样的问题不局限于行内代码<span class="mojikumi-line-end">，</span>但正常的英文很少会遇到特别长的单词<span class="mojikumi-line-end">，</span>代码则经常遇到<span class="mojikumi-line-end">，</span>所以我选择对代码进行处理<span class="mojikumi-line-start">（</span>主要是因为不需要分词套 <code>&#x3C;span></code><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>思路很简单<span class="mojikumi-line-end">，</span>就是把过长的 <code>:not(pre) > code</code> 通过 <a href="https://developer.mozilla.org/docs/Web/HTML/Element/wbr"><code>&#x3C;wbr></code></a> 或者 <a href="https://developer.mozilla.org/docs/Web/CSS/word-break"><code>word<wbr>-<wbr>break<wbr>: <wbr>break<wbr>-<wbr>all</code></a> 断开<span class="mojikumi-line-end">，</span>让它不可断开的部分没那么长<span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">：</span><code>&#x3C;<wbr>code<wbr>><wbr>word<wbr>&#x3C;<wbr>wbr<wbr>>-&#x3C;<wbr>wbr<wbr>><wbr>break<wbr>&#x3C;<wbr>wbr<wbr>>: &#x3C;<wbr>wbr<wbr>><wbr>break<wbr>&#x3C;<wbr>wbr<wbr>>-&#x3C;<wbr>wbr<wbr>><wbr>all<wbr>&#x3C;/<wbr>code<wbr>></code><span class="mojikumi-line-end">、</span><code>&#x3C;<wbr>code<wbr>>&#x26;<wbr>lt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>code<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>word<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>lt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>wbr<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;-&#x26;<wbr>lt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>wbr<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>break<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>lt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>wbr<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;: &#x26;<wbr>lt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>wbr<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>break<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>lt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>wbr<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;-&#x26;<wbr>lt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>wbr<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;&#x3C;<wbr>wbr<wbr>><wbr>all<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>lt<wbr>;/&#x3C;<wbr>wbr<wbr>><wbr>code<wbr>&#x3C;<wbr>wbr<wbr>>&#x26;<wbr>gt<wbr>;&#x3C;/<wbr>code<wbr>></code>……<span class="mojikumi-line-start">（</span><s>禁止禁止套娃</s><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>具体实现<span class="mojikumi-line-end">：</span><a href="https://github.com/ouuan/iles-blog/blob/master/src/rehype/breakLongCode.ts"><code>breakLongCode<wbr>.<wbr>ts</code></a></p>
<ol>
<li>如果按空格分开没有超过 10 个字符的部分<span class="mojikumi-line-end">，</span>不进行处理<span class="mojikumi-line-end">；</span></li>
<li>如果按正则表达式的 <code>\b</code> 分开没有超过 12 个字符的部分<span class="mojikumi-line-end">，</span>则在 <code>\b</code> 处插入 <code>&#x3C;wbr></code><span class="mojikumi-line-end">；</span></li>
<li>如果按 <code>\b</code> 以及下划线分开没有超过 15 个字符的部分<span class="mojikumi-line-end">，</span>则在相应位置插入 <code>&#x3C;wbr></code><span class="mojikumi-line-end">；</span></li>
<li>否则<span class="mojikumi-line-end">，</span>没救了<span class="mojikumi-line-end">，</span>直接 <code>word<wbr>-<wbr>break<wbr>: <wbr>break<wbr>-<wbr>all</code><span class="mojikumi-line-end">。</span></li>
</ol>
<p>当然这个粗糙的处理方式还是有一些问题<span class="mojikumi-line-end">，</span>比如从上面的示例就可以看出来<span class="mojikumi-line-end">，</span>期望结果可能是 <code>&#x3C;wbr></code> / <code>&#x3C;code></code> 不被断开<span class="mojikumi-line-end">，</span>但实际上会在 <code>&#x3C;</code> 后 / <code>></code> 前断开<span class="mojikumi-line-end">。</span></p>
<p>UPD<span class="mojikumi-line-end">：</span>链接也可以用同样的方法进行处理<span class="mojikumi-line-end">。</span></p>
<h3 id="在小屏幕上对窄的元素禁用-text-justify" class="heading"><a href="#在小屏幕上对窄的元素禁用-text-justify" class="heading-anchor" aria-label="章节： 在小屏幕上对窄的元素禁用 text justify" tabindex="-1"></a><span>在小屏幕上对窄的元素禁用 text justify</span></h3>
<p style="margin: auto; width: 7em; border: gray solid 1px;">有的时候容器宽度太小<span class="mojikumi-line-end">，</span>即使是正常的普通文本也不适合进行 text justify<span class="mojikumi-line-end">。</span></p>
<p>我选择了一个非常简单粗暴的处理方法<span class="mojikumi-line-end">：</span>认为窄的元素 = 小屏幕上嵌套了多级的元素<span class="mojikumi-line-end">。</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="CSS 代码块" data-v-c675dba6>CSS</h4><ile-root id="ile-1"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-1--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #4876D6">.article-style</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #0C969B">text-align</span><span style="color: #403F53">: </span><span style="color: #C96765">justify</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">}</span></span>
<span><span style="color: #4876D6">.article-style</span><span style="color: #994CC3"> </span><span style="color: #0C969B">&gt;</span><span style="color: #994CC3"> </span><span style="color: #0C969B">*</span><span style="color: #994CC3"> </span><span style="color: #0C969B">&gt;</span><span style="color: #994CC3"> </span><span style="color: #0C969B">*</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #0C969B">text-align</span><span style="color: #403F53">: </span><span style="color: #C96765">initial</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">}</span></span>
<span><span style="color: #994CC3">@media</span><span style="color: #403F53"> </span><span style="color: #111111">(</span><span style="color: #0C969B">min-width</span><span style="color: #403F53">: </span><span style="color: #AA0982">40em</span><span style="color: #111111">)</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">.article-style</span><span style="color: #994CC3"> </span><span style="color: #0C969B">&gt;</span><span style="color: #994CC3"> </span><span style="color: #0C969B">*</span><span style="color: #994CC3"> </span><span style="color: #0C969B">&gt;</span><span style="color: #994CC3"> </span><span style="color: #0C969B">*</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">    </span><span style="color: #0C969B">text-align</span><span style="color: #403F53">: </span><span style="color: #C96765">inherit</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">  }</span></span>
<span><span style="color: #403F53">}</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C5E478">.article-style</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #80CBC4">text-align</span><span style="color: #D6DEEB">: </span><span style="color: #FF6363">justify</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">}</span></span>
<span><span style="color: #C5E478">.article-style</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">&gt;</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">*</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">&gt;</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">*</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #80CBC4">text-align</span><span style="color: #D6DEEB">: </span><span style="color: #FF6363">initial</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">}</span></span>
<span><span style="color: #C792EA">@media</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">(</span><span style="color: #80CBC4">min-width</span><span style="color: #D6DEEB">: </span><span style="color: #F78C6C">40</span><span style="color: #FFEB95">em</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">.article-style</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">&gt;</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">*</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">&gt;</span><span style="color: #C792EA"> </span><span style="color: #7FDBCA">*</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #80CBC4">text-align</span><span style="color: #D6DEEB">: </span><span style="color: #FF6363">inherit</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">  }</span></span>
<span><span style="color: #D6DEEB">}</span></span></code></pre></div></section>
<p><span class="mojikumi-line-start">（</span>上面放的是编译出来的 CSS<span class="mojikumi-line-end">，</span><a href="https://github.com/ouuan/iles-blog/blob/master/src/styles/article.scss">源码</a>是使用 UnoCSS 的 SCSS<span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></p>
<p>一些细节<span class="mojikumi-line-end">：</span></p>
<ul>
<li>使用 <code>*</code> 选择器<span class="mojikumi-line-end">，</span><a href="https://developer.mozilla.org/docs/Web/CSS/Specificity">specificity</a> 很低<span class="mojikumi-line-end">，</span>便于 override<span class="mojikumi-line-end">。</span></li>
<li>只选择 <code>> * > *</code> 而非 <code> * *</code><span class="mojikumi-line-end">，</span>这样的话嵌套更深的元素依然从 parent 继承 <code>text-align</code><span class="mojikumi-line-end">，</span>就可以设置 CSS override 掉一整个子树<span class="mojikumi">。</span><wbr><span class="mojikumi-line-start">（</span>之前我一度以为 katex 不自带行间公式居中<span class="mojikumi-line-end">，</span>后来发现是被我的 CSS 改掉了 <code>text-align</code><span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></li>
<li>使用 <code>inherit</code> 而非 <code>justify</code> 进行撤销<span class="mojikumi-line-end">。</span></li>
</ul>
<h3 id="对包含过长行内公式的元素禁用-text-justify" class="heading"><a href="#对包含过长行内公式的元素禁用-text-justify" class="heading-anchor" aria-label="章节： 对包含过长行内公式的元素禁用 text justify" tabindex="-1"></a><span>对包含过长行内公式的元素禁用 text justify</span></h3>
<p>除了 <code>行内代码</code><span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>行内公式</mtext></mrow><annotation encoding="application/x-tex">\text{行内公式}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord cjk_fallback">行内公式</span></span></span></span></span></span> 也是常见的过长的不可断元素<span class="mojikumi-line-end">。</span>这里我采用了一个本文最 dirty 的处理方式<span class="mojikumi-line-end">：</span>在客户端通过 JavaScript 检测宽度过大的行内公式<span class="mojikumi-line-end">。</span></p>
<p>具体实现<span class="mojikumi-line-end">：</span><a href="https://github.com/ouuan/iles-blog/blob/master/src/components/TextJustifyFix.vue"><code>TextJustifyFix<wbr>.<wbr>vue</code></a></p>
<ul>
<li>只修改 <code>text<wbr>-<wbr>align<wbr>: <wbr>justify</code> 的元素<span class="mojikumi-line-end">，</span>如果已经设置为其他对齐方式<span class="mojikumi-line-start">（</span>例如表格中的居中对齐<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>就不应修改<span class="mojikumi-line-end">。</span></li>
<li>使用了 <a href="https://developer.mozilla.org/docs/Web/API/FontFaceSet/ready"><code>document<wbr>.<wbr>fonts<wbr>.<wbr>ready</code></a> 来等待字体全部加载好再检查宽度<span class="mojikumi-line-end">。</span></li>
</ul>
<h2 id="标点挤压" class="heading"><a href="#标点挤压" class="heading-anchor" aria-label="章节： 标点挤压" tabindex="-1"></a><span>标点挤压</span></h2>
<p>代码实现<span class="mojikumi-line-end">：</span><a href="https://github.com/ouuan/iles-blog/blob/master/src/remark/mojikumi.ts"><code>mojikumi<wbr>.<wbr>ts</code></a><span class="mojikumi-line-end">、</span><a href="https://github.com/ouuan/iles-blog/blob/master/src/styles/mojikumi.scss"><code>mojikumi<wbr>.<wbr>scss</code></a><span class="mojikumi-line-end">。</span></p>
<h3 id="相邻标点的挤压" class="heading"><a href="#相邻标点的挤压" class="heading-anchor" aria-label="章节： 相邻标点的挤压" tabindex="-1"></a><span>相邻标点的挤压</span></h3>
<p>例如<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">「</span><span class="no-mojikumi"><span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">“</span><span class="mojikumi">。</span><span class="mojikumi">”</span><wbr><span class="mojikumi-line-start">（</span><span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></span><span class="mojikumi-line-end">」</span>→<span class="mojikumi-line-start">「</span><span><span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">“</span><span class="mojikumi">。</span><span class="mojikumi">”</span><wbr><span class="mojikumi-line-start">（</span><span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></span><span class="mojikumi">」</span><span class="mojikumi-line-end">。</span>当然本页其他地方也有一些例子<span class="mojikumi-line-end">。</span></p>
<p>具体规则 <a href="https://www.w3.org/TR/2022/DNOTE-clreq-20221009/#compression_rules_for_consecutive_punctuation_marks">clreq</a> 中说的比较模糊<span class="mojikumi-line-end">，</span>可以参考 <a href="https://www.w3.org/TR/2020/NOTE-jlreq-20200811/#positioning_of_consecutive_opening_brackets_closing_brackets_comma_full_stops_and_middle_dots">jlreq</a><span class="mojikumi-line-end">。</span></p>
<h3 id="使用-css-去除标点的一半空白" class="heading"><a href="#使用-css-去除标点的一半空白" class="heading-anchor" aria-label="章节： 使用 CSS 去除标点的一半空白" tabindex="-1"></a><span>使用 CSS 去除标点的一半空白</span></h3>
<p>CSS 实现标点挤压有两种方式<span class="mojikumi-line-end">：</span></p>
<ul>
<li>使用 <a href="https://developer.mozilla.org/docs/Web/CSS/letter-spacing"><code>letter<wbr>-<wbr>spacing<wbr>: -<wbr>0<wbr>.<wbr>5em</code></a> 去掉右侧空白<span class="mojikumi-line-end">，</span><code>margin<wbr>-<wbr>left<wbr>: -<wbr>0<wbr>.<wbr>5em</code> 去掉左侧空白<span class="mojikumi-line-end">。</span></li>
<li>使用 <a href="https://developer.mozilla.org/docs/Web/CSS/font-feature-settings"><code>font<wbr>-<wbr>feature<wbr>-<wbr>settings<wbr>:</code></a> <a href="https://learn.microsoft.com/typography/opentype/spec/features_fj#halt"><code>"halt"</code></a> 将支持 halt 特性的字体变为半宽<span class="mojikumi-line-end">。</span></li>
</ul>
<p>使用 <code>letter<wbr>-<wbr>spacing</code> 是有讲究的<span class="mojikumi-line-end">，</span>比 <code>margin<wbr>-<wbr>right</code> 靠谱<span class="mojikumi-line-end">，</span>因为字符真的会只占半宽<span class="mojikumi-line-end">，</span>而不是占全宽但一半和下一个字符重叠<span class="mojikumi-line-end">，</span>甚至造成 overflow<span class="mojikumi-line-end">，</span>可能导致滚动条出现<span class="mojikumi-line-end">。</span>但 <code>letter<wbr>-<wbr>spacing</code> 不能去掉左侧空白<span class="mojikumi-line-end">，</span>就只能使用 <code>margin<wbr>-<wbr>left</code> 了<span class="mojikumi-line-end">。</span></p>
<p>通过 halt 特性变为半宽是更加靠谱的做法<span class="mojikumi-line-end">，</span>但不是所有字体都支持这一特性<span class="mojikumi-line-end">，</span>思源宋体是支持的<span class="mojikumi-line-end">，</span><span class="font-kai">霞鹜文楷</span> 不支持<span class="mojikumi-line-end">。</span>并且<span class="mojikumi-line-end">，</span>halt 只能变为半宽<span class="mojikumi-line-end">，</span>不能变成其他宽度<span class="mojikumi-line-end">。</span></p>
<h3 id="行首行尾标点的挤压" class="heading"><a href="#行首行尾标点的挤压" class="heading-anchor" aria-label="章节： 行首行尾标点的挤压" tabindex="-1"></a><span>行首行尾标点的挤压</span></h3>
<p>这里参考了 <a href="https://github.com/ethantw/Han">Han.css</a> 的实现<span class="mojikumi-line-end">，</span>就是把全宽的标点改成半宽标点和一个通过 <code>::before</code> 或 <code>::end</code> 添加的半宽的空格<span class="mojikumi-line-end">：</span></p>
<ul>
<li>因为是 pseudo element<span class="mojikumi-line-end">，</span>所以不影响文本内容<span class="mojikumi-line-start">（</span>例如复制出来的文本<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>因为是空格<span class="mojikumi-line-end">，</span>所以位于行首或行尾时就会发生<a href="https://www.w3.org/TR/2023/CRD-css-text-3-20230127/#white-space-phase-2">空格塌陷</a><span class="mojikumi-line-end">。</span></li>
</ul>
<h3 id="英文标点的处理" class="heading"><a href="#英文标点的处理" class="heading-anchor" aria-label="章节： 英文标点的处理" tabindex="-1"></a><span>英文标点的处理</span></h3>
<p>我采用了一个比较简单的判断英文标点的方法<span class="mojikumi-line-end">：</span></p>
<ul>
<li>空白一侧<span class="mojikumi-line-start">（</span>左括号<span class="mojikumi-line-end">、</span>左引号等是左侧<span class="mojikumi-line-end">，</span>其他一般是右侧<span class="mojikumi-line-end">）</span>是空格时是英文标点<span class="mojikumi-line-end">；</span></li>
<li>右单引号右侧是字母时是撇号<span class="mojikumi-line-end">。</span></li>
</ul>
<p>英文标点一般调为半宽即可<span class="mojikumi-line-end">，</span>但撇号半宽还是有些太宽了<span class="mojikumi-line-end">，</span>应该<span class="mojikumi-line-start">（</span>根据字体而定<span class="mojikumi-line-end">）</span>调成大约三分之一宽<span class="mojikumi-line-end">，</span>单引号也可以调窄一点<span class="mojikumi-line-end">，</span>所以可以特判一下单引号<span class="mojikumi-line-end">，</span>使用 <code>letter<wbr>-<wbr>spacing</code> 和 <code>margin<wbr>-<wbr>left</code><span class="mojikumi-line-end">。</span></p>
<h3 id="给霞鹜文楷添加-halt-特性" class="heading"><a href="#给霞鹜文楷添加-halt-特性" class="heading-anchor" aria-label="章节： 给霞鹜文楷添加 halt 特性" tabindex="-1"></a><span>给霞鹜文楷添加 halt 特性</span></h3>
<p>因为 <a href="https://github.com/lxgw/LxgwWenKai/issues/104">添加 halt 特性的 issue</a> 被拒了<span class="mojikumi-line-end">，</span>我就自己改了一个 <a href="https://github.com/ouuan/XiaWu-Punctuations">标点字体</a><span class="mojikumi-line-end">，</span>顺便把引号改成了和思源宋体一致的全宽以方便一起处理<span class="mojikumi-line-start">（</span>也可以理解为改引号宽度顺便添加 halt 特性<span class="mojikumi-line-end">，</span>毕竟没有 halt 也可以用 <code>letter<wbr>-<wbr>spacing</code> 和 <code>margin<wbr>-<wbr>left</code> 凑合一下<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>具体可以看仓库里的 patch 文件<span class="mojikumi-line-end">。</span></p>
<h3 id="关于-chws-特性" class="heading"><a href="#关于-chws-特性" class="heading-anchor" aria-label="章节： 关于 chws 特性" tabindex="-1"></a><span>关于 chws 特性</span></h3>
<p><a href="https://learn.microsoft.com/typography/opentype/spec/features_ae#chws">chws 特性</a> 可以根据上下文自动挤压连续标点<span class="mojikumi-line-end">，</span>一眼看上去似乎比 halt 更好用<span class="mojikumi-line-end">。</span></p>
<p>思源宋体不支持这一特性<span class="mojikumi-line-end">，</span>只不过有 <a href="https://github.com/googlefonts/chws_tool">chws_tool</a> 可以用来转换<span class="mojikumi-line-end">。</span></p>
<p>但是<span class="mojikumi-line-end">，</span>chws 不支持行首行尾标点挤压<span class="mojikumi-line-end">，</span>而如果要支持行首行尾挤压<span class="mojikumi-line-end">，</span>就得把支持连续标点挤压的工作做一遍<span class="mojikumi-line-start">（</span>因为要知道哪些标点已经被挤成了半宽哪些只在行首行尾挤成半宽<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>这样一来 chws 就没多大意义了<span class="mojikumi-line-end">。</span></p>
<h3 id="yet-another-mojikumi？" class="heading"><a href="#yet-another-mojikumi？" class="heading-anchor" aria-label="章节： Yet another mojikumi？" tabindex="-1"></a><span>Yet another mojikumi？</span></h3>
<p>有一些现成的支持标点挤压的库<span class="mojikumi-line-end">，</span>例如 <a href="https://github.com/sivan/heti">heti</a> 和 <a href="https://github.com/ethantw/Han">Han.css</a><span class="mojikumi-line-end">。</span>但是我有一些需求<span class="mojikumi-line-end">：</span></p>
<ul>
<li>要能 SSG <span class="mojikumi">（</span>SSR<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>不能在客户端运行<span class="mojikumi-line-end">。</span>最好是能在 remark / rehype 中进行处理<span class="mojikumi-line-end">。</span></li>
<li>最好是尽量使用 halt 而非 <code>letter<wbr>-<wbr>spacing</code> 和 <code>margin<wbr>-<wbr>left</code><span class="mojikumi-line-end">。</span></li>
<li>要能添加一些自定义的规则<span class="mojikumi-line-end">，</span>比如对单引号特殊处理<span class="mojikumi-line-end">。</span></li>
<li>我只需要标点挤压<span class="mojikumi-line-end">，</span>不想要一个 CSS 全家桶<span class="mojikumi-line-end">，</span>或者带有其他功能的 JS<span class="mojikumi-line-end">。</span></li>
</ul>
<p>现有的库难以同时满足上面这些需求<span class="mojikumi-line-end">，</span>所以我就自己写了<span class="mojikumi-line-end">。</span></p>
<p>本来想写一个通用的库<span class="mojikumi-line-end">，</span>但通用的逻辑貌似没多少代码<span class="mojikumi-line-end">，</span>不值得写成一个库<span class="mojikumi-line-end">。</span>而我的整个 remark 插件又有点 opinionated<span class="mojikumi-line-end">，</span>可能不太适合做成库<span class="mojikumi-line-start">（</span><s>懒得做成库</s><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>想用的话可以在遵守 <a href="https://github.com/ouuan/iles-blog/blob/master/LICENSE">AGPL 3.0</a> 的前提下直接复制<span class="mojikumi-line-start">（</span>本文提到的其他代码也是一样<span class="mojikumi-line-end">，</span>当然<span class="mojikumi-line-end">，</span>如果是两三行的代码片段就不至于 AGPL 了<span class="mojikumi-line-end">，</span>简单标一下出处就 OK<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<h2 id="代码中的-unicode（cjk）的字体" class="heading"><a href="#代码中的-unicode（cjk）的字体" class="heading-anchor" aria-label="章节： 代码中的 Unicode（CJK）的字体" tabindex="-1"></a><span>代码中的 Unicode<span class="mojikumi-line-start">（</span>CJK<span class="mojikumi-line-end">）</span>的字体</span></h2>
<p><s>为什么马上要考抽代了你在这更新博客<span class="mojikumi-line-end">，</span>我也很想知道<span class="mojikumi-line-start">（</span></s> 其实是在一个群里看到有人在聊博客的等宽字体<span class="mojikumi-line-end">，</span>然后看了一眼自己的等宽字体<span class="mojikumi-line-end">，</span>差点没想起来这个 trick 在干什么<span class="mojikumi-line-end">。</span></p>
<p>很多等宽字体是没有 CJK 字形的<span class="mojikumi-line-end">，</span>在 Windows 的默认字体下<span class="mojikumi-line-end">，</span>fallback 到 <code>monospace</code> 时中文会显示为<code style="font-family: NSimSun, SimSun, serif;">宋体</code><span class="mojikumi-line-end">，</span>而一般来说应当是<code>黑体</code><span class="mojikumi-line-end">。</span>所以可以为 Unicode 部分专门指定一个 fallback font<span class="mojikumi-line-end">，</span>通过指定 <code>unicode<wbr>-<wbr>range</code> 来让 ASCII 字符依然 fallback 到 <code>monospace</code><span class="mojikumi-line-end">。</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="CSS 代码块" data-v-c675dba6>CSS</h3><ile-root id="ile-2"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-2--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">@font-face</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #0C969B">font-family</span><span style="color: #403F53">: </span><span style="color: #111111">&quot;</span><span style="color: #C96765">Monospace Unicode Fallback</span><span style="color: #111111">&quot;</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #0C969B">src</span><span style="color: #403F53">: </span><span style="color: #4876D6">local</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">Noto Sans Mono CJK SC</span><span style="color: #111111">&quot;</span><span style="color: #403F53">),</span></span>
<span><span style="color: #403F53">       </span><span style="color: #4876D6">local</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">Source Han Mono SC</span><span style="color: #111111">&quot;</span><span style="color: #403F53">),</span></span>
<span><span style="color: #403F53">       </span><span style="color: #4876D6">local</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">Noto Sans CJK SC</span><span style="color: #111111">&quot;</span><span style="color: #403F53">),</span></span>
<span><span style="color: #403F53">       </span><span style="color: #4876D6">local</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">Source Han Sans SC</span><span style="color: #111111">&quot;</span><span style="color: #403F53">),</span></span>
<span><span style="color: #403F53">       </span><span style="color: #4876D6">local</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">Microsoft YaHei</span><span style="color: #111111">&quot;</span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #0C969B">unicode-range</span><span style="color: #403F53">: </span><span style="color: #4876D6">U+1000-fffff</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">}</span></span>
<span></span>
<span><span style="color: #4876D6">:root</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">--default-mono-font</span><span style="color: #403F53">: </span><span style="color: #0C969B">ui-monospace</span><span style="color: #403F53">, DejaVu Sans Mono, Noto Sans Mono, SFMono-Regular, Menlo, Monaco, Consolas, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">Monospace Unicode Fallback</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #0C969B">monospace</span><span style="color: #403F53">, </span><span style="color: #4876D6">var</span><span style="color: #403F53">(</span><span style="color: #4876D6">--default-emoji-font</span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">}</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">@font-face</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #80CBC4">font-family</span><span style="color: #D6DEEB">: </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">Monospace Unicode Fallback</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #80CBC4">src</span><span style="color: #D6DEEB">: </span><span style="color: #C5E478">local</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">Noto Sans Mono CJK SC</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">),</span></span>
<span><span style="color: #D6DEEB">       </span><span style="color: #C5E478">local</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">Source Han Mono SC</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">),</span></span>
<span><span style="color: #D6DEEB">       </span><span style="color: #C5E478">local</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">Noto Sans CJK SC</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">),</span></span>
<span><span style="color: #D6DEEB">       </span><span style="color: #C5E478">local</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">Source Han Sans SC</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">),</span></span>
<span><span style="color: #D6DEEB">       </span><span style="color: #C5E478">local</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">Microsoft YaHei</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #80CBC4">unicode-range</span><span style="color: #D6DEEB">: </span><span style="color: #82AAFF">U+1000-fffff</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">}</span></span>
<span></span>
<span><span style="color: #C5E478">:root</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">--default-mono-font</span><span style="color: #D6DEEB">: </span><span style="color: #7FDBCA">ui-monospace</span><span style="color: #D6DEEB">, DejaVu Sans Mono, Noto Sans Mono, SFMono-Regular, Menlo, Monaco, Consolas, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">Monospace Unicode Fallback</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #7FDBCA">monospace</span><span style="color: #D6DEEB">, </span><span style="color: #C5E478">var</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">--default-emoji-font</span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">}</span></span></code></pre></div></section>
<h2 id="为不同语言设置不同字体" class="heading"><a href="#为不同语言设置不同字体" class="heading-anchor" aria-label="章节： 为不同语言设置不同字体" tabindex="-1"></a><span>为不同语言设置不同字体</span></h2>
<p>其实我感觉我的做法有点丑<span class="mojikumi-line-start">（</span><span class="mojikumi-line-end">，</span>还好有 UnoCSS 稍微强一点<span class="mojikumi-line-start">（</span></p>
<ul>
<li>为每个样式<span class="mojikumi-line-start">（</span>例如宋/<span class="font-kai">楷</span><span class="mojikumi-line-end">）</span>和每个语言分别用一个 CSS 变量记录当前字体<span class="mojikumi-line-end">。</span></li>
<li>改变样式时修改 <code>font<wbr>-<wbr>family</code> 为这个样式的字体<span class="mojikumi-line-end">，</span>修改每个语言的字体为这个样式<span class="mojikumi-line-end">。</span></li>
<li>改变语言时修改 <code>font<wbr>-<wbr>family</code> 为这个语言的字体<span class="mojikumi-line-end">，</span>修改每个样式的字体为这个语言<span class="mojikumi-line-end">。</span></li>
</ul>
<p>语言通过 <code>lang</code> 属性标识<span class="mojikumi-line-end">。</span></p>
<p>详见 <a href="https://github.com/ouuan/iles-blog/commit/e8df882f4a550bfd5db50f837f0a9ab376262dc4">commit</a><span class="mojikumi-line-end">。</span></p>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/blog">blog</category>
            <category domain="https://ouuan.moe/tag/CSS">CSS</category>
            <category domain="https://ouuan.moe/tag/Web">Web</category>
            <category domain="https://ouuan.moe/tag/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB">经验分享</category>
        </item>
        <item>
            <title><![CDATA[display: none 与 loading="lazy"]]></title>
            <link>https://ouuan.moe/post/2022/07/display-none-and-lazy-load</link>
            <guid>https://ouuan.moe/post/2022/07/display-none-and-lazy-load</guid>
            <pubDate>Sat, 23 Jul 2022 14:47:45 GMT</pubDate>
            <description><![CDATA[


<p>同时使用 <code>display: none</code> 和 <code>loading<wbr>="<wbr>lazy<wbr>"</code> 可能会让内容永远加载不出来<span class="mojikumi-line-end">。</span></p>
<p class="dark:hidden"><picture><img type="image/webp" srcset="/assets/comments-loading-light.53816492.webp" loading="lazy" src="/assets/comments-loading-light.53816492.webp" width="353" height="153" alt="截图：评论加载中"></picture></p>


<p class="hidden dark:block"><picture><img type="image/webp" srcset="/assets/comments-loading-dark.93a651f2.webp" loading="lazy" src="/assets/comments-loading-dark.93a651f2.webp" width="375" height="147" alt="截图：评论加载中"></picture></p>
]]></description>
            <content:encoded><![CDATA[


<p>同时使用 <code>display: none</code> 和 <code>loading<wbr>="<wbr>lazy<wbr>"</code> 可能会让内容永远加载不出来<span class="mojikumi-line-end">。</span></p>
<p class="dark:hidden"><picture><img type="image/webp" srcset="/assets/comments-loading-light.53816492.webp" loading="lazy" src="/assets/comments-loading-light.53816492.webp" width="353" height="153" alt="截图：评论加载中"></picture></p>


<p class="hidden dark:block"><picture><img type="image/webp" srcset="/assets/comments-loading-dark.93a651f2.webp" loading="lazy" src="/assets/comments-loading-dark.93a651f2.webp" width="375" height="147" alt="截图：评论加载中"></picture></p>

<h2 id="问题背景" class="heading"><a href="#问题背景" class="heading-anchor" aria-label="章节： 问题背景" tabindex="-1"></a><span>问题背景</span></h2>
<p>虽然 <a href="https://giscus.app/">giscus</a> 自带一个加载页面<span class="mojikumi-line-end">，</span>但首先这个加载页面自身就有可能加载很久才显示<span class="mojikumi-line-end">，</span>而且这个自带的加载页面没有任何有效信息<span class="mojikumi-line-end">，</span>所以我自己写了一个加载页面<span class="mojikumi-line-end">，</span>附上了 Discussions 链接<span class="mojikumi-line-end">。</span></p>
<p>我使用的是 giscus 的 <a href="https://github.com/giscus/giscus/blob/main/ADVANCED-USAGE.md#giscus-to-parent-message-events">giscus-to-parent <code>message</code> events</a> 功能来检测 giscus 已加载<span class="mojikumi-line-end">，</span>而这和 giscus 显示在页面上有一定的时间间隔<span class="mojikumi-line-end">，</span>所以在检测到加载好之前需要先把 giscus 隐藏起来<span class="mojikumi-line-end">。</span>因为是用的 Vue<span class="mojikumi-line-end">，</span>很自然地就是用 <code>v-show</code> 让 giscus 加载好再显示<span class="mojikumi-line-end">。</span></p>
<p>除此之外<span class="mojikumi-line-end">，</span>本着<span class="mojikumi-line-start">“</span>不用白不用<span class="mojikumi-line-end">”</span>的精神<span class="mojikumi-line-end">，</span>我还启用了 giscus 的 lazy load<span class="mojikumi-line-start">（</span>本质上是 <code>&#x3C;iframe></code> 的 <code>loading<wbr>="<wbr>lazy<wbr>"</code><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>并且<span class="mojikumi-line-end">，</span>我使用的是 Firefox<span class="mojikumi-line-end">，</span>上述配置在 Firefox 上是没有问题的<span class="mojikumi-line-end">。</span></p>
<h2 id="问题的发现与解决" class="heading"><a href="#问题的发现与解决" class="heading-anchor" aria-label="章节： 问题的发现与解决" tabindex="-1"></a><span>问题的发现与解决</span></h2>
<p>一位群友告诉我评论加载不出来<span class="mojikumi-line-end">，</span>于是我试了一下各个浏览器<span class="mojikumi-line-end">，</span>在第二次<span class="mojikumi-line-start">（</span>为什么是第二次呢<span class="mojikumi-line-end">，</span>不懂<span class="mojikumi-line-end">）</span>试 Chrome 的时候发现没加载出来<span class="mojikumi-line-end">。</span></p>
<p>console 没有任何报错<span class="mojikumi-line-end">；</span>查看 DOM<span class="mojikumi-line-end">，</span>发现 <code>&#x3C;iframe></code> 里面是空的<span class="mojikumi-line-end">，</span>幸好我还记得自己用了 lazy load<span class="mojikumi-line-end">，</span>所以很快就明白了问题所在<span class="mojikumi-line-end">：</span>Chrome 比较<span class="mojikumi-line-start">“</span>聪明<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>看到 <code>display: none;</code> 就懒了<span class="mojikumi-line-end">，</span>没加载这个 <code>&#x3C;iframe></code><span class="mojikumi-line-end">。</span></p>
<p>把 <code>v-show</code> 换成 <code>opacity-0 absolute</code> 就解决了问题<span class="mojikumi-line-end">。</span></p>
<p>但最后还有点小插曲<span class="mojikumi-line-end">，</span>因为这个 <code>opacity-0</code> 在 SSR 的时候是没有的<span class="mojikumi-line-end">，</span>没被 <a href="https://github.com/unocss/unocss">UnoCSS</a> 扫描到<span class="mojikumi-line-end">，</span>就挂了<span class="mojikumi-line-end">，</span>最后换成了 inline style<span class="mojikumi-line-end">。</span></p>
<h2 id="后记" class="heading"><a href="#后记" class="heading-anchor" aria-label="章节： 后记" tabindex="-1"></a><span>后记</span></h2>
<p>这件事告诉我们<span class="mojikumi-line-end">，</span><s>有好的群友</s>在不同浏览器上多测试几遍是非常重要的<span class="mojikumi-line-end">。</span></p>
<p><s>这点事值得发博客吗<span class="mojikumi-line-end">；</span>当然是博客太空了随便水一篇</s></p>
<p>P.S. 虽然问题的解决很简单<span class="mojikumi-line-end">，</span>但还是浅搜了一下看看有没有什么 best practice<span class="mojikumi-line-end">。</span>倒是没搜到什么有用的<span class="mojikumi-line-end">，</span>但是搜到<a href="https://developers.weixin.qq.com/community/develop/doc/0006ec11c48ec072b6e7b79975b000">一个有趣的</a><span class="mojikumi-line-start">（</span></p>
<p><picture><img type="image/webp" srcset="/assets/reproduce-yourself.3ea24022.webp" loading="lazy" src="/assets/reproduce-yourself.3ea24022.webp" width="959" height="362" alt="论坛截图：麻烦提供下代码片段。你们已经是成熟的开发团队了，要学会自己复现bug。"></picture></p>
<h2 id="再后记" class="heading"><a href="#再后记" class="heading-anchor" aria-label="章节： 再后记" tabindex="-1"></a><span>再后记</span></h2>
<p>发现加载中的 <code>&#x3C;iframe></code> 虽然看不见但点的到..需要加一个 <code>z-index: -1</code><span class="mojikumi-line-end">。</span></p>
<h2 id="再后记的后记" class="heading"><a href="#再后记的后记" class="heading-anchor" aria-label="章节： 再后记的后记" tabindex="-1"></a><span>再后记的后记</span></h2>
<p>这个东西虽然怎么都看不见了<span class="mojikumi-line-end">，</span>但宽度会让整个页面出现水平滚动条<span class="mojikumi-line-end">，</span>所以要加 <code>width: 0; height: 0;</code><span class="mojikumi-line-end">。</span></p>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/CSS">CSS</category>
            <category domain="https://ouuan.moe/tag/Web">Web</category>
            <category domain="https://ouuan.moe/tag/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E8%AE%B0%E5%BD%95">问题解决记录</category>
        </item>
    </channel>
</rss>