ChatGPT解决这个技术问题 Extra ChatGPT

如果容器 div 较小,如何将子 div 扩展到 100% 屏幕宽度?

整个页面的父元素是一个居中的 div,最大宽度限制为 960px。页面上的所有其他元素都是该父 div 的子元素。简化结构如下:

<div id="parent">
  <div id="something"></div>
  <div id="wide-div"></div>
  <div id="something-else"></div>
</div>

虽然父 div 的宽度不应超过 960 像素,但我在这里称为“wide-div”的 div 应该填满屏幕的整个宽度。它包含一个比 960px 更宽的图像,它应该为整个屏幕宽度设置不同的背景颜色。

我不能轻易地将那个 div 从父 div 中取出,它会弄乱我布局的其他部分,这会使整个事情变得相当尴尬。

我发现了一些关于如何实现这一点的技巧,但似乎没有一个符合我的要求。我的设计是响应式的,或者至少我正在努力实现这一点。我发现的技巧依赖于知道所涉及元素的大小,这在我的案例中并不固定。

有没有办法在响应式布局中将内部 div 扩展到全屏宽度?

通过给你的宽 div 以 px 为单位的宽度会给你你想要的结果。它只是为了使它具有响应性,您必须使用 javascript 根据窗口大小来计算它。您也可以尝试使用 css calc() 函数。
我同意@floor。大多数使用宽部分的 wp 主题都使用 javascript 计算宽度。 position:absolute 方法可能无法在真实网站上运行。
可以将子 div 设置为宽度 100vw 并且将父 div 设置为溢出可见
在 2020 年,实现这一目标的方法是使用 CSS media queries

G
GolezTrol

您可以根据 vw(视口宽度)设置宽度。您也可以使用 calc 函数使用该值来计算 div 的左边距。这样,您可以将其定位在流内,但仍会突出在居中的固定宽度 div 的左侧和右侧。

支持还不错。 vwsupported by all major browsers, including IE9+calc() 也是如此。如果您需要支持 IE8 或 Opera Mini,那么您对这种方法不走运。

-编辑-

正如评论中提到的,当页面内容高于屏幕时,这将导致水平滚动条。您可以使用 body {overflow-x: hidden;} 抑制该滚动条。虽然以不同的方式解决它会很好,但使用 Width:100% without scrollbars 中提供的 leftright 的解决方案在这种情况下不起作用。

-编辑 2021-

滚动条的另一种解决方法,根据您的情况可能可以接受或不接受:通过使绿色 div 小一点,比如 20px,您可以为滚动条保留一点空间。保留宽度的一半可以添加到边距,以保持宽 div 居中:

#wide-div {
  width: calc(100vw - 20px);
  margin-left: calc(-50vw + 50% + 10px);

div { 最小高度:40px; box-sizing:边框框; } #container { 位置:相对; } #parent { 宽度:400px;边框:1px纯黑色;边距:0 自动; } #something { 边框:2px 纯红色; } #wide-div { 宽度:计算(100vw - 20px);左边距:计算(-50vw + 50% + 10px);边框:2px 纯绿色; }

红色
绿色
绿色
绿色< br>Green
Green
Green
Green
Green
其他内容,你可以看到Green后面没有的。


警告:calc() 在 iPad 上确实有问题。
这对我来说是最好的答案。在 wide-div 上使用 position: absolute 会导致它掩盖 something-else
以上说明仅适用于旧版本(IOS Safari 7.1),但之后的版本有适当的支持。
@SabaAhang @GolezTrol 我遇到了同样的问题,您可以解决将 overflow-x: hidden 添加到 body 的问题,因为有时它可能需要更多像素。我会更新答案,为未来的访客提供建议。另一方面,很好的答案!
@SilverSurfer 谢谢!我已经添加了它。
S
SherylHohman

经过大量研究,我找到了这个解决方案:Creating full width (100% ) container inside fixed width container。我认为这是最好的解决方案,因为它不依赖于任何外部因素,只依赖于你想要扩展的 div。

<div class="container" style="width: 750px; margin: 0 auto;">
   <div class="row-full">
     --- Full width container ---
   </div>   
</div>

.row-full{
     width: 100vw;
     position: relative;
     margin-left: -50vw;
     left: 50%;
}

好主意,但是如果视口宽度小于元素宽度(主体的最小宽度+浏览器窗口不够宽)就会中断
只需将您的响应式设计缩小到 320 像素宽,您真的不必担心它会损坏......但请注意滚动条的差异......我添加了一个 javascript 来检测页面是否有可见的滚动条或透明的。然后在这种情况下添加 .has-scrollbar .full-width { margin-left: calc((-100vw + 15px) / 2); margin-right: calc((-100vw + 15px) / 2); width: calc(100vw - 15px); }.has-scrollbar .row-full
如果您需要支持 RTL 文本(即阿拉伯语),那么指定 margin-right:-50vw;right: 50%; 也很重要。
A
Aximili

您现在可以执行此操作

.full-width {
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
}

或这个

.full-width {
    width: 100vw;
    position: relative;
    left: 50%;
    right: 50%;
    margin-left: -50vw;
    margin-right: -50vw;
}

更多详情:https://css-tricks.com/full-width-containers-limited-width-parents/


O
Organiccat

通常,响应元素、引导程序或 Foundation 允许您添加“行”元素。您可以将“wide-div”放在带有“row”的元素之外,它应该扩展以占据整个宽度。

或者,您可以对忽略大多数继承设置的元素使用绝对定位:

.wide-div {
    position: absolute;
    left: 0;
    right: 0;
}

直到不在位置相对的父级内
A
Altimus Prime

我有点惊讶在过去 4 年里没有人提供以下服务。 css position:fixed 属性将项目拉出并相对于窗口进行缩放。在某些情况下,这可能不起作用,但是如果您正在对模态框或其他东西进行 Javascript 处理,则可以正常工作。

.wide-div{
    position:fixed;
    top:0px;
    left:0px;
    width:100%;
    height:100%; // in case you need to cover the height as well
    background-color:rgba(0,0,0,.8); //just so you can see the div is on top of your content
    z-index:1; // you may need to adjust the index of your other elements as well
}

这种方法的主要问题是,在修复后,div 不会随着页面内容的其余部分滚动。
你是绝对正确的,但如果这是原始海报的要求,那么他们没有提到它。
S
SherylHohman

您可以使用 vw。演示http://jsfiddle.net/fsLhm6pk/

.parent { 宽度:200px;高度:200px;背景:红色; } .child { 宽度:100vw;高度:50px;背景:黄色; }

你是对的,这不适用于居中的 div。试试这个:

编辑http://jsfiddle.net/fsLhm6pk/1/

.parent { 宽度:200px;高度:200px;背景:红色;边距:0 自动; } .child { 宽度:100%;左:0;右:0;位置:绝对;高度:50px;背景:黄色; }


我的父 div 居中,这会将子 div 扩展到右侧,而不是左侧。
并非所有浏览器都支持它..如果您关心的话。
此方法仅扩展至最后一个 position:relative; 父 div,而不扩展至浏览器窗口的宽度。
S
Stavros

我的50cent在这里..

虽然我发现其他人的答案也是正确的,但我认为需要提到一个旧的 css 技巧来存档这个

.wide-div {    
   padding: 0 9999%;
   margin: 0 -9999%;
}

同样在这种情况下,如果出现水平滚动条,您可以使用

body {overflow-x: hidden;} 

视情况而定,这段代码的不同之处在于这里的内部内容与父宽度保持对齐

身体 {overflow-x: hidden;} div { min-height: 40px; box-sizing:边框框; } #parent { 宽度:400px;边框:1px纯黑色;边距:0 自动; } #something { 边框:2px 纯红色; } #something-else { 边框:2px 纯红色; } #wide-div { 填充:0 9999%;保证金:0 -9999%;边框:2px 纯绿色; }

Red
Wide
其他内容< /div>


知道什么风格会阻止这个工作吗?我使用了类似的策略,它适用于 3 个父母中的 2 个,即 .wide-div 有 3 个祖先,它比其中 2 个更宽,但无论我尝试什么,它都受到最外层的限制。
你能把它放在一个codepen或什么的吗? @UcheOzoemena