我将 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
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
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%最终解决了这个问题。margins 与各种元素和gap结合使用会产生看似意外的元素重叠。即使删除了上述初始.解决方案
.(点).container 宽度:100%为 flexbox 提供一个可使用的约束。.panel flex: 0.5并指定.panel 宽度: calc(50% - 0.5rem)。calc(..)是必需的,因为gap会增加.panels 的总宽度,可能导致它们在调整大小时重叠。由于您的ngap: 1rem将0.5rem添加到两列中的每一列,因此需要从每列的width中减去该值。ngap一样,margin会增加元素的总宽度,这需要您从元素宽度中减去左和/或右边距,以防止它们与其他元素重叠。避免在 CSS 中添加额外calc(..)的最简单方法是将元素的margin移动到其直接父元素的padding。并非在所有情况下都是如此,但在这种情况下,它在不改变整体布局的情况下效果很好。奖金
对于响应行为:
.box包裹其子元素.panel 宽度以强制.box包裹其子.panels。在本例中我选择了300px。.panel元素增长到完整的50%。还有
hyphenate 文本以提高可读性...片段