
發現問題
筆者發現在日知紙簍上的程式碼區塊,都會在首行多出一個空白,反白後更為明顯。如下圖所示:

問題排查
從前面的螢幕截圖中可以看到,由於反白後明顯可以看到有一小個空白無法被選中反白,可以初步推斷並不是在撰寫文章時誤植了空白字元。
那麼問題可能就出在 CSS 樣式上了,使用瀏覽器的開發者工具(DevTool)檢查對應元素,可以更快速地定位與排查 CSS 樣式或是 JavaScript 腳本問題:

抓到兇手了!這個空白是來源於 <code>
元素的 ::before
偽元素選擇器(pseudo-element selector):
code::before, code::after {
letter-spacing: -.2em;
content: "\a0";
display: contents;
}
這段 CSS 樣式是筆者從 HackMD 上借鑑而來,用來替行內的 <code>
元素添加左右的空白,使其排版更為整齊,但沒想到也影響到了程式碼區塊 <pre>
中的 <code>
了。
解決方案
既然知道了問題,那便容易解決了,由於程式碼區塊都會在外層使用 <pre>
來包裹內層的<code>
,那麼便可以透過添加更具體的 CSS 選擇器規則來避免樣式不小心被套用或覆蓋。
有一種解決方案,是增加一組 CSS 樣式來明確地對 <pre>
下的 <code>
重置樣式:
pre code::before, pre code::after {
all: unset; /* 移除所有 inherited 和 applied 樣式 */
}
但也可以換個角度思考:原本的樣式要排除外層使用 <pre>
的 <code>
元素的狀況,這個想法可以使用 :not()
偽類(pseudo-classes)來實現,由於 :not()
可以用來匹配不符合一組選擇器的元素,或者說防止特定的元素被選中,因此也被稱為反選偽類(negation pseudo-class)。
針對原來的問題,調整後的 CSS 樣式如下:
code:not(pre code)::before, code:not(pre code)::after {
letter-spacing: -.2em;
content: "\a0";
display: contents;
}
張貼留言