我们之前已经介绍过一些技巧,可以用来在受约束宽度的列中创建全宽度元素,例如在较窄的文本列中创建边缘到边缘的图像。 有很多技巧。
也许我最喜欢的是这个小小的实用程序类
.full-width {
width: 100vw;
position: relative;
left: 50%;
right: 50%;
margin-left: -50vw;
margin-right: -50vw;
}
这是有效的,只要列居中,并且您不介意在列(或主体)上隐藏overflow-x
(否则这可能会触发水平溢出)。
最近有一些关于其他想法的来回讨论…
Josh Comeau 博客 说,您可以设置一个三列网格,并且主要将内容放置在中间列中,但也可以有机会突破它
.wrapper {
display: grid;
grid-template-columns:
1fr
min(65ch, 100%)
1fr;
}
.wrapper > * {
grid-column: 2;
}
.full-bleed {
width: 100%;
grid-column: 1 / -1;
}
我认为这很聪明。我可能会使用它。但我承认有一些让我感觉奇怪的地方。例如…
- 现在容器中的所有内容都是网格元素。这不是什么大问题,但元素的行为会略有不同。例如,没有 边距折叠。
- 您必须将所需的默认行为应用于每个元素。元素不会自然地堆叠在一起,您必须选择它们并告诉它们去哪里,然后让它们自己堆叠。感觉不像只是顺着网络的纹理走。然后您仍然需要一个实用程序类来执行全出血行为。
我真正喜欢这个想法的地方是它为您提供了这个文字网格来使用。例如,您的左侧间隔符可以是右侧宽度的一半,这完全没问题。它正在设置那个空间以供潜在使用,就像 Ethan 在他的 关于受约束网格的文章 中提到的那样。
Kilian Valkhof 回复 了这篇文章,提出了这个想法
body > *:not(img):not(video) {
position: relative;
max-width: 40rem;
margin: auto;
}
同样非常聪明。这限制了所有内容的宽度(在任何容器中,它不需要是主体)除了您想突破的元素(这也可以是一个实用程序类,并且不一定局限于图像和视频)。
同样,对我来说,这种感觉,即我必须选择每个元素并提供有关布局的基本信息,感觉有点奇怪。不是说“不要使用它”的奇怪,只是我不习惯这么做。从历史上看,我更习惯于调整容器的大小和位置,并让容器中的内容在没有更多指令的情况下自行布局。
你知道我最喜欢什么吗?我们有这么多强大的 CSS 布局工具,我们可以就如何准确地实现我们想要的效果进行讨论其优缺点。
几天前我发现了一个很棒的容器突破技巧
我必须在一个非全宽度容器上创建全宽度边框。此外,该容器内还有一个元素具有粘性定位,无法使用
overflow: hidden
在容器的容器上使用。我发现,如果我使用outline
来创建边框(这将为我们提供水平滚动条),而不是使用border
,水平滚动条将不会显示!这通常感觉像是一个有用的批评(警示),但远没有达到“不要使用它”的程度。
这让我想到了一点要补充的内容。它确实感觉非常类似于我越来越多地使用“切除大脑的猫头鹰”选择器,我实际上只希望它适用于特定容器的直接子元素。
有时这只是应用于一堆类
其他时候,我会把它作为一个实用程序类
我想知道这些技术是否值得纳入“当您确实需要一个通用元素选择器时”这个小众领域。
不过,所有内容都是网格子元素的问题是一个更大的问题。除了其他问题之外,它还不能使用浮动。
非常有趣的想法!第一种方法还有一个额外的好处,就是您不必完全出血。您还可以使用宽度为
80vw
、左外边距为-40vw
的图像。(您必须将此放在媒体查询中,否则在宽度不超过容器的屏幕上,图像实际上会比内容窄)。我最近使用了一种类似的方法。对我来说,缺点是可能存在带有内联边距(如列表)的元素,这些元素会破坏,您必须添加例外情况。
此外,我还必须为浮动实用程序类添加一个补丁
第一个示例可以从使用%而不是vw中获益,因为vw包含滚动条的宽度,而%则不包含。因此,%不会因水平溢出而触发滚动条。
有趣的技巧。我倾向于使用与最后一种技术类似的东西,但使用额外的父元素上的实用程序类。它基本上限制了您想要限制的内容(= 可能是您大多数布局),并将其他所有内容保留在默认值(width: auto)上,因此它会填充容器。
本文中的示例没有考虑 Windows 上的滚动条。要解决这个问题,请阅读此评论 https://stackoverflow.com/a/66615422/15389306