我有一个具有以下结构的站点:
<div id="header"></div>
<div id="main">
<div id="navigation"></div>
<div id="content"></div>
</div>
<div id="footer"></div>
导航在左侧,内容 div 在右侧。内容 div 的信息是通过 PHP 拉进来的,所以每次都不一样。
无论加载哪个页面,如何垂直缩放导航使其高度与内容 div 的高度相同?
display: flex; align-items: stretch;
。并且不要将 height: 100%
用于 div#content
对于家长:
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;背景:蓝色; }
注意:此答案适用于不支持 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
:蓝色边框位于前两列,而不是您所期望的仅在第二列上。
display:table
这是设计师一直在处理的一个令人沮丧的问题。诀窍是您需要在 CSS 中将 BODY 和 HTML 的高度设置为 100%。
html,body {
height:100%;
}
这个看似毫无意义的代码是向浏览器定义 100% 意味着什么。令人沮丧,是的,但这是最简单的方法。
html { height: 100%; } body { height: 98%; }
。
我发现将两列设置为 display: table-cell;
而不是 float: left;
效果很好。
如果您不介意在出现意外短内容 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 技术。
#main {
overflow: hidden;
}
#navigation, #content {
margin-bottom: -1000px;
padding-bottom: 1000px;
}
使用 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
函数时,您无法像使用纯 CSS 解决方案时那样区分屏幕媒体和打印媒体。因此,您可能会遇到打印问题。
#main {
display: table;
}
#navigation, #content {
display: table-cell;
}
查看this example。
height: 100%
,但事实证明它是不需要的。
height : <percent>
仅在顶层具有指定高度百分比的所有父节点以及以像素、ems 等为单位的固定高度时才有效。这样,高度将向下级联到您的元素。
您可以将 100% 指定为 html 和 body 元素,如 @Travis 前面所述,以使页面高度向下级联到您的节点。
尝试将下边距设为 100%。
margin-bottom: 100%;
经过长时间的搜索和尝试,除了
style = "height:100%;"
在儿童 div 上
并为父母申请这个
.parent {
display: flex;
flex-direction: column;
}
另外,我正在使用引导程序,这并没有破坏对我的响应。
flex-direction: column;
才能为我工作。
将 display: grid
添加到父级
基于此 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;
}
}
}
}
对于 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.
}
这是我正在做的事情:
我知道自从提出问题以来已经过了很长时间,但我找到了一个简单的解决方案,并认为有人可以使用它(抱歉英语不好)。它是这样的:
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>
简单的例子。请注意,您可以转变为响应能力。
我的解决方案:
$(window).resize(function() {
$('#div_to_occupy_the_rest').height(
$(window).height() - $('#div_to_occupy_the_rest').offset().top
);
});
您使用 CSS Flexbox
.flex-container { 显示:弹性;背景颜色:DodgerBlue; } .flex-container > div { 背景颜色:#f1f1f1;边距:10px;填充:20px;字体大小:30px; }
灵活布局必须有一个父元素,其 display 属性设置为 flex。
直接子元素弹性容器的(s)自动变成弹性项目。
我可能有点晚了,但我发现了一个可能有点破解的解决方法。首先给父母一个 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 */
}
问题的标题和内容有点矛盾。标题提到了父 div,但这个问题听起来像是您希望两个兄弟 div(导航和内容)具有相同的高度。
您是否 (a) 希望导航和内容的高度均为 main 的 100%,或者 (b) 希望导航和内容的高度相同?
我假设(b)......如果是这样,我认为你将无法在你当前的页面结构下做到这一点(至少,不是纯 CSS 和没有脚本)。您可能需要执行以下操作:
<main div>
<content div>
<navigation div></div>
</div>
</div>
并将内容 div 设置为具有导航窗格宽度的左边距。这样,内容的内容就在导航的右侧,您可以将导航 div 设置为内容高度的 100%。
编辑:我完全在脑海中这样做,但您可能还需要将导航 div 的左边距设置为负值或将其绝对左侧设置为 0 以将其推回最左侧。问题是,有很多方法可以解决这个问题,但并非所有方法都与所有浏览器兼容。
[在另一个答案中参考 Dmity 的 Less 代码] 我猜这是某种“伪代码”?
据我了解,尝试使用应该可以解决问题的人造列技术。
http://www.alistapart.com/articles/fauxcolumns/
希望这可以帮助 :)
将 position: absolute;
给在我的案例中工作的孩子
这个答案不再理想,因为 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>
我遇到了同样的问题,它根据 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%;
}
如前所述,flexbox 是最简单的。例如。
#main{ display: flex; align-items:center;}
这会将所有子元素与父元素的中心对齐。
.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 提供的答案相同
这个技巧确实有效:在您的 HTML 部分中添加一个 final 元素,其样式为 clear:both;
之前的所有内容都将包含在高度中。
对我有用的是将 style={{ display: 'flex', overflowY: "auto" }}
添加到孩子的所有父母,然后将 style={{ overflowY: "auto" }}
添加到孩子本身。
最简单的方法就是伪造它。多年来,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 类。
align-items: center
,那么您需要拉伸的项目需要align-self: normal