html - 如何填充 div 但保持子 div 的纵横比
问题描述
我有以下页面显示 HTML 和 CSS。我希望左侧的五个按钮(div id=button1..5)在任何宽高比和屏幕分辨率下始终是方形的。另外,我希望五个按钮始终填充中间 div(id=menu)。事实上,我可以两者都做,但不能一起做!后者很容易使用 Flex 和前者,正如您在下面的代码中所做的那样。我看过几个关于 SO 的例子,尤其是这个,但他们没有做我所说的。
有什么建议么?注意:最好不要使用 Javascript...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style>
html, body {
margin:0;
padding:0;
}
#container {
display:flex;
flex-direction: column;
background-color: #444;
height:100vh;
width:100%;
margin:0;
padding:0;
}
#top{
background-color: #777;
height:5%;
width:100%;
margin:0;
padding:0;
}
#main{
background-color: #DDD;
height:100%;
width:100%;
margin:0;
padding:0;
align-items: stretch;
}
#menu{
display:flex;
flex-direction: column;
background-color: #FFF;
height:100%;
width:10%;
margin:0;
padding:0;
}
.buttons{
display:inline-block;
position:relative;
height:0;
margin:0;
padding-bottom:100%;
}
#button1{background-color:blue; margin:2px 0 2px 0;}
#button2{background-color:green; margin:2px 0 2px 0;}
#button3{background-color:red; margin:2px 0 2px 0;}
#button4{background-color:black; margin:2px 0 2px 0;}
#button5{background-color:orange; margin:2px 0 2px 0;}
.img-container {
justify-content: center;
display: flex;
flex-direction: row;
overflow: hidden;
padding:16px;
}
.img-container .img-to-fit {
flex: 1;
height: 100%;
}
.fill {
display: flex;
justify-content: center;
align-items: center;
overflow: hidden
}
.fill img {
flex-shrink: 0;
min-width: 100%;
min-height: 100%
}
#bottom {
height:2%;
display:flex;
}
#bottom1{background-color:blue;}
#bottom2{background-color:green;}
#bottom3{background-color:red;}
#bottom4{background-color:white;}
#bottom5{background-color:orange;}
.bottoms{
height:100%;
width:20%;
margin:0;
padding:0;
}
</style>
</head>
<body>
<div id="container">
<div id="top"/>
<div id="main">
<div id="menu">
<div id="button1" class="buttons">
<div class="img-container">
<img class="img-to-fit" src="parcel.png" />
</div>
</div>
<div id="button2" class="buttons"/>
<div id="button3" class="buttons"/>
<div id="button4" class="buttons"/>
<div id="button5" class="buttons"/>
</div>
</div>
<div id="bottom">
<div id="bottom1" class="bottoms"/>
<div id="bottom2" class="bottoms"/>
<div id="bottom3" class="bottoms"/>
<div id="bottom4" class="bottoms"/>
<div id="bottom5" class="bottoms"/>
</div>
</div>
</body>
</html>
解决方案
您已经有了方形按钮。您错过的是这些按钮的宽度,但您可以轻松计算出它。
div#menu
的高度为100vh - 7%
,这意味着您的按钮的高度应为(100vh - 7%) / 5
。
它们的高度等于它们的宽度,所以如果它们有width: calc(93vh / 5)
,它们将填充#menu
.
因此,您可以简单地添加#menu { width: calc(93vh / 5)}
我也会删除#main { height: 100% }
,它不需要。
html, body {
margin:0;
padding:0;
}
#container {
display:flex;
flex-direction: column;
background-color: #444;
height:100vh;
width:100%;
margin:0;
padding:0;
}
#top{
background-color: #777;
height:5%;
width:100%;
margin:0;
padding:0;
}
#main{
background-color: #DDD;
/* height:100%; not needed */
width:100%;
margin:0;
padding:0;
align-items: stretch;
}
#menu{
display:flex;
flex-direction: column;
background-color: #FFF;
height:100%;
width: calc((93vh) / 5); // Width of the menu = Height of the menu divided by the number of buttons
margin:0;
padding:0;
}
.buttons{
display:block;
position:relative;
height:0;
margin:0;
padding-bottom:100%;
}
#button1{background-color:blue; margin:2px 0 2px 0;}
#button2{background-color:green; margin:2px 0 2px 0;}
#button3{background-color:red; margin:2px 0 2px 0;}
#button4{background-color:black; margin:2px 0 2px 0;}
#button5{background-color:orange; margin:2px 0 2px 0;}
.img-container {
justify-content: center;
display: flex;
flex-direction: row;
overflow: hidden;
padding:16px;
}
.img-container .img-to-fit {
flex: 1;
height: 100%;
}
.fill {
display: flex;
justify-content: center;
align-items: center;
overflow: hidden
}
.fill img {
flex-shrink: 0;
min-width: 100%;
min-height: 100%
}
#bottom {
height:2%;
display:flex;
}
#bottom1{background-color:blue;}
#bottom2{background-color:green;}
#bottom3{background-color:red;}
#bottom4{background-color:white;}
#bottom5{background-color:orange;}
.bottoms{
height:100%;
width:20%;
margin:0;
padding:0;
}
<div id="container">
<div id="top">
</div>
<div id="main">
<div id="menu">
<div id="button1" class="buttons">
<div class="img-container">
<img class="img-to-fit" src="parcel.png" />
</div>
</div>
<div id="button2" class="buttons">
</div>
<div id="button3" class="buttons">
</div>
<div id="button4" class="buttons">
</div>
<div id="button5" class="buttons">
</div>
</div>
</div>
<div id="bottom">
<div id="bottom1" class="bottoms">
</div>
<div id="bottom2" class="bottoms">
</div>
<div id="bottom3" class="bottoms">
</div>
<div id="bottom4" class="bottoms">
</div>
<div id="bottom5" class="bottoms">
</div>
</div>
</div>
推荐阅读
- r - 在 ggplot2 中绘制非线性模型输出的输出
- autodesk-forge - 如何在 Autodesk Forge 查看器上通过拖放添加对象
- python - 往返传奇
- java - 使用 append 而不是 LogstashMarker 的 appendRaw 时丢失日志消息
- java - 在 GraphQL 上获取原始字段名称
- optimization - 有没有办法知道在 Gurobi usercuts 中花费了多少时间?
- javascript - 单击导航栏按钮并转到实际的 div?
- python - 是否有一种更简洁的方式来导航这个 Python 嵌套数据结构?
- snowflake-cloud-data-platform - 新帐户命令未将电子邮件识别为字符串
- powershell - 在远程计算机上卸载包