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

How can I expand a child div to 100% screen width if the container div is smaller?

提问人:Mad Scientist 提问时间:7/14/2015 最后编辑:Mad Scientist 更新时间:9/12/2023 访问量:108661

问:

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

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

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

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

我发现了一些关于如何实现这一目标的技巧,但似乎没有一个符合我的要求。我的设计是响应式的,或者至少我正在努力实现这一点。我发现的技巧依赖于了解相关元素的大小,这在我的情况下是不固定的。

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

CSS 响应式设计

评论

1赞 floor 7/14/2015
通过给你的宽 div 一个以 px 为单位的宽度,将给你你想要的结果。它只是为了使其响应,您必须使用 javascript 根据窗口大小计算它。您也可以尝试使用 css calc() 函数。
0赞 Miro 7/14/2015
我同意@floor。大多数使用宽截面的 wp 主题都使用 javascript 计算宽度。这些方法可能无法在真实网站上工作。position:absolute
0赞 Felype 7/14/2015
可以将子 div 设置为宽度 100vw,将父 div 设置为溢出可见
0赞 Liam 8/28/2020
在 2020 年,实现这一目标的方法是使用 CSS 媒体查询

答:

6赞 Organiccat 7/14/2015 #1

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

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

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

评论

2赞 Giulia Nicole Pernice 11/9/2016
till 不在位置相对的父级内
3赞 aahhaa 7/14/2015 #2

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

.parent {
  width: 200px;
  height: 200px;
  background: red;
}

.child {
  width: 100vw;
  height: 50px;
  background: yellow;
}
<div class='parent'>
  <div class='child'></div>
</div>

你是对的,这不适用于居中.请尝试以下操作:div

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

.parent {
  width: 200px;
  height: 200px;
  background: red;
  margin: 0 auto;
}

.child {
  width: 100%;
  left: 0;
  right: 0;
  position: absolute;
  height: 50px;
  background: yellow;
}
<div class='parent'>
  <div class='child'></div>
</div>

评论

0赞 Mad Scientist 7/14/2015
我的父 div 居中,这会将子 div 扩展到右侧,而不是向左扩展。
1赞 floor 7/14/2015
并非所有浏览器都支持它。如果你在乎这个。
1赞 clayRay 12/16/2020
此方法仅扩展到最后一个父 div,而不扩展到浏览器窗口的宽度。position:relative;
132赞 GolezTrol 7/14/2015 #3

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

支持相当不错。 支持所有主流浏览器,包括 IE9+calc() 也是如此。如果您需要支持 IE8 或 Opera Mini,那么这种方法就不走运了。vw

-编辑-

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

-编辑 2021-

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

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

div {
  min-height: 40px;
  box-sizing: border-box;
}
#container {
  position: relative;
}
#parent {
  width: 400px;
  border: 1px solid black;
  margin: 0 auto;
}

#something {
  border: 2px solid red;
}

#wide-div {
  width: calc(100vw - 20px);
  margin-left: calc(-50vw + 50% + 10px);
  border: 2px solid green;
}
<div id="container">
<div id="parent">
  <div id="something">Red</div>
  <div id="wide-div">Green


<br>Green
<br>Green
<br>Green
<br>Green
<br>Green
<br>Green
<br>Green
</div>
  <div id="something-else">Other content, which is not behind Green as you can see.</div>
</div>
</div>

评论

2赞 Miro 7/14/2015
警告:在iPad上确实有问题。calc()
2赞 Rick Hitchcock 7/14/2015
这对我来说是最好的答案。使用 on 会导致它掩盖 .position: absolutewide-divsomething-else
2赞 GolezTrol 7/1/2016
上述备注仅适用于旧版本(IOS Safari 7.1),但之后的版本具有适当的支持。
2赞 SilverSurfer 4/12/2018
@SabaAhang @GolezTrol我遇到了同样的问题,您可以解决添加问题,因为有时它可能需要更多像素。我会更新答案,为未来的访客提供建议。另一方面,不错的答案!overflow-x: hiddenbody
1赞 GolezTrol 4/12/2018
@SilverSurfer谢谢!我已经添加了它。
23赞 crico_aven 10/17/2016 #4

经过大量研究,我找到了这个解决方案:在固定宽度的容器内创建全宽(100%)容器。我认为这是最好的解决方案,因为它不依赖于任何外部因素,只依赖于您要扩展的 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%;
}

评论

0赞 zxcat 6/10/2017
好主意,但如果视口宽度小于元素宽度(正文有最小宽度 + 浏览器窗口不够宽),则会中断
4赞 Coyote6 11/1/2018
只需将您的响应式设计缩小到 320px 宽,您真的不必担心它会损坏......但要注意滚动条的差异......我添加了一个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
1赞 clayRay 12/15/2020
如果您需要支持 RTL 文本(即阿拉伯语),那么指定 和 也很重要。margin-right:-50vw;right: 50%;
11赞 Aximili 12/7/2017 #5

您现在可以执行此操作

.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/

6赞 Altimus Prime 7/14/2019 #6

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

.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
}

评论

1赞 clayRay 12/16/2020
此方法的主要问题是,经过修复,div 不会与其余页面内容一起滚动。
1赞 Altimus Prime 12/17/2020
你是绝对正确的,但如果这是原始海报的要求,那么他们没有提到它。
1赞 Stavros 1/6/2021 #7

我的 50 美分在这里..

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

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

同样在这种情况下,如果出现水平滚动条,您可以使用以下方法解决此问题

body {overflow-x: hidden;} 

根据具体情况,此代码的区别在于此处的内部内容与父宽度保持一致

body {overflow-x: hidden;} 

div {
  min-height: 40px;
  box-sizing: border-box;
}
#parent {
  width: 400px;
  border: 1px solid black;
  margin: 0 auto;
}

#something {
  border: 2px solid red;
}
#something-else {
  border: 2px solid red;
}

#wide-div {
  padding: 0 9999%;
    margin: 0 -9999%;
  border: 2px solid green;
}
<div id="parent">
  <div id="something">Red</div>
  <div id="wide-div">Wide</div>
  <div id="something-else">Other content</div>
</div>

评论

0赞 Uche Ozoemena 11/29/2021
知道什么样式会阻止它工作吗?我使用类似的策略,它适用于 2 个父母中的 3 个,即 .wide-div 有 3 个祖先,它比其中 2 个更宽,但无论我尝试什么,它都受到最外层的限制。
0赞 Stavros 11/30/2021
你能把它放在密码笔什么的吗?@UcheOzoemena
0赞 Moh .S 9/12/2023 #8

这应该可以做到。

#wide-div{
    position: absolute;
    width: 100vh;
    min-width: 100vw;
    max-width: 100vw;
    background: white;
    left: 0;
    margin-left: 0;
    overflow-x: hidden;
    z-index: 99999;
}