我將 CSS 應用到 pre code
選擇器,以便製作樣式程式碼區塊,就像您在 GitHub 或其他地方看到的那樣。我使用Flexbox 進行佈局,並且在「框」div 內並排有兩個「面板」div,其中一個有一個程式碼區塊(這只是<pre><code>
標籤內的程式碼) ,以及“box”div 位於主“container”div 內部。
我擁有的基本 CSS 是...
.*, *:before, *:after { margin: 0; padding: 0; box-sizing: inherit; } html { box-sizing: border-box; } body { display: flex; align-items: center; justify-content: center; } pre code { display: inline-block; overflow: auto; white-space: pre; padding: 1rem; margin: 1rem; } .container { display: flex; flex-direction: column; margin: 1rem; gap: 1rem; } .box { display: flex; flex-direction: row; gap: 1rem; } .panel { display: flex; flex-direction: column; flex: 0.5; padding: 1rem; }
由於 flex: 0.5
,兩個面板的寬度應相等,但是右側面板會擴展以適合塊,而不是塊縮小以適合面板。
如果我在pre code
上設定white-space: pre-wrap
,我會得到所需的佈局行為,但當然程式碼是自動換行的,這是我不想要的。
white-space: pre
並向 pre 程式碼
新增專用寬度,我會得到所需的行為,其中程式碼區塊有一個水平滾動條。我無法使用專用寬度,因為我需要該區塊來適應其內部的任何面板。
出於某種原因,在 pre 程式碼
上設定 width: 100%
根本沒有任何作用。
為了確保我自己不會在其他地方做一些事情而導致此錯誤,我將這段程式碼放在一起以確認我的問題(我確實添加了一些背景顏色和邊距以使容器可見):
https://codepen.io/evprkr/pen/poKQXJr
CSS 問題導致您遇到問題:
.*, *:before, *:after { }
中,有一個很容易錯過的初始.
(點)。因此border-box
模型只適用於:before
和:after
偽元素。顯然,margin
和padding
也是如此。.panel
祖先都沒有設定width
值,這樣 flexbox 就無法約束子元素,並且會成長到無限大。flex: 0.5
(預設為flex: 0.5 1 0%
)顯然沒有效果,因為它沒有寬度flex-basis: 50%
。在這兩種情況下,pre 程式碼
都不會被觸發溢出,因此不會顯示可捲動框。我無法解釋原因,但這一定是由於某些 W3C 規範造成的。不過,您聲明的.panel width: 50%
最終解決了這個問題。margin
s 與各種元素和gap
結合使用會產生看似意外的元素重疊。即使刪除了上述初始.
#解決方案
.
(點).container 寬度:100%
為 flexbox 提供一個可使用的限制。.panel flex: 0.5
並指定.panel 寬度: calc(50% - 0.5rem)
。calc(..)
是必要的,因為gap
會增加.panel
s 的總寬度,可能導致它們在調整大小時重疊。由於您的ngap: 1rem
將0.5rem
新增到兩列中的每一列,因此需要從每列的width
中減去該值。ngap
一樣,margin
會增加元素的總寬度,這需要您從元素寬度中減去左和/或右邊距,以防止它們與其他元素重疊。避免在 CSS 中加入額外calc(..)
的最簡單方法是將元素的margin
移到其直接父元素的padding
。並非在所有情況下都是如此,但在這種情況下,它在不改變整體佈局的情況下效果很好。獎金
對於回應行為:
.box
包裹其子元素.panel 寬度
以強制.box
包裹其子.panel
s。在本例中我選擇了300px
。.panel
元素增長到完整的50%
。還有
hyphen
ate 文字以提高可讀性...片段