ChatGPT解决这个技术问题 Extra ChatGPT

如何在不指定父级高度的情况下强制子级 div 为父级 div 高度的 100%?

我有一个具有以下结构的站点:

<div id="header"></div>

<div id="main">
  <div id="navigation"></div>
  <div id="content"></div>
</div>

<div id="footer"></div>

导航在左侧,内容 div 在右侧。内容 div 的信息是通过 PHP 拉进来的,所以每次都不一样。

无论加载哪个页面,如何垂直缩放导航使其高度与内容 div 的高度相同?

在父级上使用显示表格并在子级上显示表格单元格。这将使孩子只要父母是。请参阅stackoverflow.com/q/22712489/3429430
您可以为 div#main 设置 display: flex; align-items: stretch;。并且不要height: 100% 用于 div#content

F
Flimzy

对于家长:

display: flex;

您应该添加一些前缀 http://css-tricks.com/using-flexbox/

正如@Adam Garner 所说, align-items: stretch;不需要。它也适用于父母,而不是儿童。如果你想定义孩子的伸展,你可以使用 align-self。

.parent { 背景:红色;填充:10px;显示:弹性; } .other-child { 宽度:100px;背景:黄色;高度:150px;填充:0.5rem; } .child { 宽度:100px;背景:蓝色; }

仅用于拉伸父级


IE11 不能很好地配合 flexbox 和 heights。点击此处的“已知问题”:caniuse.com/#feat=flexbox
@SuperUberDuper 好吧,你可以在引导程序中使用它:jsfiddle.net/prdwaynk 但如果我是你,我会使用可以使用 flexbox 进行生产的基础:foundation.zurb.com/sites/docs/xy-grid.html BS4 也将具有 Flexbox,但它仍处于 alpha 阶段,并且我反正觉得基础比较好。
如果您使用 align-items: center,那么您需要拉伸的项目需要 align-self: normal
这不是一个正确的答案,因为这需要设置父高度。问题说“没有指定父母的身高?”。
@Aiphee downvoting,因为您似乎没有看到不必在原始问题文本中设置父母身高的部分,但您的“解决方案”正是这样做的。
c
csvan

注意:此答案适用于不支持 Flexbox 标准的旧版浏览器。有关现代方法,请参阅:https://stackoverflow.com/a/23300532/1155721

我建议你看看Equal Height Columns with Cross-Browser CSS and No Hacks

基本上,以与浏览器兼容的方式使用 CSS 执行此操作并非易事(但对于表格来说是微不足道的),因此请为自己找到一个合适的预打包解决方案。

此外,答案因您想要 100% 高度还是等高而异。通常它的高度相同。如果它是 100% 的高度,答案会略有不同。


这看起来是一个不错的解决方案,直到您在 container2 上绘制边框 border:1px solid blue :蓝色边框位于前两列,而不是您所期望的仅在第二列上。
@bfritz,更好的解决方案是使用 display:table
T
Travis

这是设计师一直在处理的一个令人沮丧的问题。诀窍是您需要在 CSS 中将 BODY 和 HTML 的高度设置为 100%。

html,body {
    height:100%;
}

这个看似毫无意义的代码是向浏览器定义 100% 意味着什么。令人沮丧,是的,但这是最简单的方法。


除非它并不总是有效,例如,如果您在绝对定位的元素中有一个相对定位的元素,它不再强制 hasLayout。
此外,如果您想摆脱窗口右侧的滚动条(出现在 Firefox v28 中),请给窗口一些喘息的空间:html { height: 100%; } body { height: 98%; }
这仅适用于所有父母的身高 100%,仅设置 html 和正文是不够的,所有父母都必须定义一个高度。
我同意你的看法,但这似乎回答了一个不同的问题。 OP是否在谈论整个页面?它现在的读取方式看起来只是父元素高度的 100%,这可能不是页面或视口。
不适用于普通的div
J
John

我发现将两列设置为 display: table-cell; 而不是 float: left; 效果很好。


MS自己不再支持它了,如果这有助于任何人说服他们的客户......
这应该是公认的答案。时代变了,这个答案适用于all browsers(在 Safari 5.1.17 中有一个小怪癖)。两行 CSS,您立即拥有您正在寻找的效果,没有我能想到的任何退步。
举起这个答案。小伙子们,把你的后背放进去!
这是最好的答案。是的,我们可以制作一个表格来执行此操作,但它不是表格数据,而是我们将 div 视为表格单元格......太棒了!
这实际上使我在不同的情况下朝着正确的方向前进。如果有人在努力使用 Firefox 或 Edge 中的 flex 容器的方形 div,请记住将 :before 元素设置为 display: table。不要问我为什么,但它解决了它。
D
David Thomas

如果您不介意在出现意外短内容 div 的情况下将导航 div 剪掉,那么至少有一种简单的方法:

#main {
position: relative;
}

#main #navigation {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 10em; /* or whatever */
}

#main #content {
margin: 0;
margin-left: 10em; /* or whatever width you set for #navigation */
}

否则还有 faux-columns 技术。


非常感谢,你拯救了我的一天。不知道可以同时定义顶部和底部,它会以这种方式工作。
这将使容器的内容停止调整它的大小。
+1,因为它专门解决了 OP 的问题“如何在不指定父母高度的情况下将子 Div 强制为父母 Div 的 100%?”我的问题不需要列(在问题详细信息中提到但在主标题中没有提到),而是一个 div 在另一个之后。这个答案适用于两个应用程序。
R
Roman Kuntyi
#main {
    overflow: hidden;
}
#navigation, #content {
    margin-bottom: -1000px;
    padding-bottom: 1000px;
}

我必须说我正在寻找这种解决方案。死的简单,如此明显,以至于没有人想出来。恭喜@Roman!
非常感谢!我也认为这是我的许多类似 CSS 问题的 goto 解决方案,其中使用溢出和百分比宽度/高度限制在区域内的元素经常推动外部布局 - 这一切显然是由于底部边距。
f
flavius

使用 jQuery:

$(function() {
    function unifyHeights() {
        var maxHeight = 0;
        $('#container').children('#navigation, #content').each(function() {
            var height = $(this).outerHeight();
            // alert(height);
            if ( height > maxHeight ) {
                maxHeight = height;
            }
        });
        $('#navigation, #content').css('height', maxHeight);
    }
    unifyHeights();
});

Math.max() 将成为您的朋友。
无法让 CSS 在所有情况下都能正常工作,我真的只需要一个快速修复。这可能不是最标准的方法,但这做得很好。谢谢! :-]
使用 JQuery 的 css 函数时,您无法像使用纯 CSS 解决方案时那样区分屏幕媒体和打印媒体。因此,您可能会遇到打印问题。
A
Aurelio
#main {
   display: table;
} 
#navigation, #content {
   display: table-cell;
}

查看this example


这正是我正在做的,想添加一个答案。我也在使用 height: 100%,但事实证明它是不需要的。
不建议将 CSS 布局中的表格用于现代网站
L
Lajos Mészáros

height : <percent> 仅在顶层具有指定高度百分比的所有父节点以及以像素、ems 等为单位的固定高度时才有效。这样,高度将向下级联到您的元素。

您可以将 100% 指定为 html 和 body 元素,如 @Travis 前面所述,以使页面高度向下级联到您的节点。


T
Tony C

尝试将下边距设为 100%。

margin-bottom: 100%;

或 padding-bottom: 100%;它并不精确,但在某些情况下效果很好。
padding-bottom 在我的情况下可以解决问题。这个解决方案与@Roman Kuntyi 发布的非常相似。
H
Hakan Fıstık

经过长时间的搜索和尝试,除了

style = "height:100%;"

在儿童 div 上

并为父母申请这个

.parent {
    display: flex;
    flex-direction: column;
}

另外,我正在使用引导程序,这并没有破坏对我的响应。


我必须删除 flex-direction: column; 才能为我工作。
D
Dziamid

display: grid 添加到父级


D
Dmitry Efimenko

基于此 article 中描述的方法,我创建了 .Less 动态解决方案:

html:

<div id="container3">
    <div id="container2">
        <div id="container1">
            <div id="col1">Column 1</div>
            <div id="col2">Column 2</div>
            <div id="col3">Column 3</div>
        </div>
    </div>
</div>

较少的:

/* Changes these variables to adjust your columns */
@col1Width: 60%;
@col2Width: 1%;
@padding: 0%;

/* Misc variable. Do not change */
@col3Width: 100% - @col1Width - @col2Width;

#container3 {
    float: left;
    width: 100%;
    overflow: hidden;
    background-color: red;
    position: relative;

    #container2 {
        float: left;
        width: 100%;
        position: relative;
        background-color: yellow;
        right: @col3Width;

        #container1 {
            float: left;
            width: 100%;
            position: relative;
            right: @col2Width;
            background-color: green;

            #col1 {
                float: left;
                width: @col1Width - @padding * 2;
                position: relative;
                left: 100% - @col1Width + @padding;
                overflow: hidden;
            }

            .col2 {
                float: left;
                width: @col2Width - @padding * 2;
                position: relative;
                left: 100% - @col1Width + @padding + @padding * 2;
                overflow: hidden;
            }

            #col3 {
                float: left;
                width: @col3Width - @padding * 2;
                position: relative;
                left: 100% - @col1Width + @padding + @padding * 4;
                overflow: hidden;
            }
        }
    }
}

V
VimNing

对于 2021 年的读者:

尝试这个:

.parent {
  position: relative;

  display: flex;                 // And you will probably need this too.
  flex-direction: row;           // or column.
}

.child {
  position: absolute;
  top: 0;
  bottom: 0;

  align-self: center;            // And you will probably need this too.
}

这是我正在做的事情:


P
Paula Fleck

我知道自从提出问题以来已经过了很长时间,但我找到了一个简单的解决方案,并认为有人可以使用它(抱歉英语不好)。它是这样的:

CSS

.main, .sidebar {
    float: none;
    padding: 20px;
    vertical-align: top;
}
.container {
    display: table;
}
.main {
    width: 400px;
    background-color: LightSlateGrey;
    display: table-cell;
}
.sidebar {
    width: 200px;
    display: table-cell;
    background-color: Tomato;
}

HTML

<div class="container clearfix">
    <div class="sidebar">
        simple text here
    </div>
    <div class="main">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam congue, tortor in mattis mattis, arcu erat pharetra orci, at vestibulum lorem ante a felis. Integer sit amet est ac elit vulputate lobortis. Vestibulum in ipsum nulla. Aenean erat elit, lacinia sit amet adipiscing quis, aliquet at erat. Vivamus massa sem, cursus vel semper non, dictum vitae mi. Donec sed bibendum ante.
    </div>
</div>

简单的例子。请注意,您可以转变为响应能力。


哦,我忘了:如果你想在中间对齐 .sidebar 内容,只需将“vertical-align:top”更改为“vertical-align:middle”即可。
S
Sunil Garg

我的解决方案:

$(window).resize(function() {
   $('#div_to_occupy_the_rest').height(
        $(window).height() - $('#div_to_occupy_the_rest').offset().top
    );
});

I
Ini

您使用 CSS Flexbox

.flex-container { 显示:弹性;背景颜色:DodgerBlue; } .flex-container > div { 背景颜色:#f1f1f1;边距:10px;填充:20px;字体大小:30px; }

1
2
3< /div>

灵活布局必须有一个父元素,其 display 属性设置为 flex

直接子元素弹性容器的(s)自动变成弹性项目。


T
The Whiz of Oz

我可能有点晚了,但我发现了一个可能有点破解的解决方法。首先给父母一个 flex 和 100vh 的高度

像这样的东西:

.parent {
   display: flex;
   justify-content: center;
   align-items: center;
   height: 100vh;/* Can be less depends on the container, basically this forces the element to expand */
}

P
Paul Abbott

问题的标题和内容有点矛盾。标题提到了父 div,但这个问题听起来像是您希望两个兄弟 div(导航和内容)具有相同的高度。

您是否 (a) 希望导航和内容的高度均为 main 的 100%,或者 (b) 希望导航和内容的高度相同?

我假设(b)......如果是这样,我认为你将无法在你当前的页面结构下做到这一点(至少,不是纯 CSS 和没有脚本)。您可能需要执行以下操作:

<main div>
    <content div>
         <navigation div></div>
    </div>
</div>

并将内容 div 设置为具有导航窗格宽度的左边距。这样,内容的内容就在导航的右侧,您可以将导航 div 设置为内容高度的 100%。

编辑:我完全在脑海中这样做,但您可能还需要将导航 div 的左边距设置为负值或将其绝对左侧设置为 0 以将其推回最左侧。问题是,有很多方法可以解决这个问题,但并非所有方法都与所有浏览器兼容。


J
Jonathan Julian

[在另一个答案中参考 Dmity 的 Less 代码] 我猜这是某种“伪代码”?

据我了解,尝试使用应该可以解决问题的人造列技术。

http://www.alistapart.com/articles/fauxcolumns/

希望这可以帮助 :)


根据答案的排序顺序,很难说出“this”指的是什么......我猜它是关于 Dmitry 的代码。因此,此评论属于他的答案下方的评论!而且,为了您的信息,它不是伪代码,它是 Less 语言的代码,一种以程序方式定义 CSS 的方式。
n
neoDev

position: absolute; 给在我的案例中工作的孩子


D
DevWL

这个答案不再理想,因为 CSS flexbox 和 grid 是在 CSS 中实现的。但是它仍然是一个有效的解决方案

在较小的屏幕上,您可能希望保持高度自动,因为 col1、col2 和 col3 彼此堆叠。

但是,在媒体查询断点之后,您希望 cols 彼此相邻出现,并且所有列的高度相同。

1125 px 只是窗口宽度断点的一个示例,之后您希望将所有列设置为相同的高度。

<div class="wraper">
    <div class="col1">Lorem ipsum dolor sit amet.</div>
    <div class="col2">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eos laudantium, possimus sed, debitis amet in, explicabo dolor similique eligendi officia numquam eaque quae illo magnam distinctio odio, esse vero aspernatur.</div>
    <div class="col3">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorem, odio qui praesentium.</div>
</div>

当然,如果需要,您可以设置更多断点。

<script>
    $(document).ready(function(){
        $(window).on('load resize', function() {
            let vraperH = $('.wraper').height();
            if (window.innerWidth>= 1125) {
              $('.col1').height(vraperH);
              $('.col2').height(vraperH);
              $('.col3').height(vraperH);
            }
            if (window.innerWidth < 1125) {
              $('.col1').height('auto');
              $('.col2').height('auto');
              $('.col3').height('auto');
            }
        });
    });
</script>

B
Builo

我遇到了同样的问题,它根据 Hakam Fostok 的回答工作,我创建了一个小示例,在某些情况下它可能无需在父容器上添加 display: flex;flex-direction: column; 就可以工作

.row {
    margin-top: 20px;
}

.col {
    box-sizing: border-box;
    border: solid 1px #6c757d;
    padding: 10px;
}

.card {
    background-color: #a0a0a0;
    height: 100%;
}

JSFiddle


C
Chandan Purohit

如前所述,flexbox 是最简单的。例如。

#main{ display: flex; align-items:center;}

这会将所有子元素与父元素的中心对齐。


这不能回答问题,他们想要相等的高度,而不是使内容居中
e
eaglei22
.row-eq-height {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display:         flex;
 }

从:

http://getbootstrap.com.vn/examples/equal-height-columns/equal-height-columns.css

状态引导程序,但您不需要引导程序来使用它。回答这个老问题,因为这对我有用,而且似乎很容易实现。

这与我为此 Question 提供的答案相同


P
Paul V

这个技巧确实有效:在您的 HTML 部分中添加一个 final 元素,其样式为 clear:both;

之前的所有内容都将包含在高度中。


A
Akaisteph7

对我有用的是将 style={{ display: 'flex', overflowY: "auto" }} 添加到孩子的所有父母,然后将 style={{ overflowY: "auto" }} 添加到孩子本身。


A
Aaron Brethorst

最简单的方法就是伪造它。多年来,A List Apart 对此进行了广泛的介绍,like in this article from Dan Cederholm from 2004

这是我通常的做法:

<div id="container" class="clearfix" style="margin:0 auto;width:950px;background:white url(SOME_REPEATING_PATTERN.png) scroll repeat-y center top;">
    <div id="navigation" style="float:left;width:190px;padding-right:10px;">
        <!-- Navigation -->
    </div>
    <div id="content" style="float:left;width:750px;">
        <!-- Content -->
    </div>
</div>

您可以通过将#container 包装在另一个div 中,将标题div 作为#container 的兄弟元素嵌入,并将边距和宽度样式移动到父容器中,轻松地在此设计中添加标题。此外,CSS 应该被移动到一个单独的文件中,而不是保持内联等。最后,可以在 positioniseverything 上找到 clearfix 类。