【发布时间】:2019-12-30 00:53:33
【问题描述】:
作为一个偶尔的 HTML/CSS/JavaScript 编码器,我遇到了一个看似简单的问题。
我想构建一个非常简单的网站布局,其中包含一个内容 div 和一个可以隐藏的左侧边栏。内容 div 具有可变宽度;右侧始终贴在浏览器窗口的右侧,左侧调整到侧边栏。如果显示侧边栏,它应该使用浏览器窗口宽度的定义比例部分。
function toggleSidebar() {
var sidebar = document.getElementById("mySidebar");
var content = document.getElementById("myContent");
if (sidebar.style.width === "0%") {
sidebar.style.width = "25%";
content.style.marginLeft = "25%";
} else {
sidebar.style.width = "0%";
content.style.marginLeft = "0%";
}
}
#myHeaderBar {
position: fixed;
left: 0px;
right: 0px;
height: 90px;
z-index: 1;
border-bottom: 1px solid #A2A2A2;
}
#mySidebar {
background-color: #F7F7F7;
position: fixed;
top: 98px;
left: 0px;
width: 25%;
bottom: 0px;
overflow-y: auto;
border-right: 1px solid #A2A2A2;
transition: 0.5s;
}
#myContent {
position: absolute;
top: 98px;
margin-left: 25%;
bottom: 0px;
overflow-y: auto;
transition: 0.5s;
}
<!DOCTYPE html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Sidebar Test</title>
</head>
<body>
<div id="myHeaderBar">
<h2>Header</h2>
<a href="#" onclick="toggleSidebar()">Toggle Sidebar</a>
</div>
<div id="mySidebar">
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
</div>
<div id="myContent">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
</body>
</html>
这都是微不足道的,而且工作得很好。
当我尝试限制侧边栏的最小和最大宽度时出现了我的问题(这是我想要做的)。
当然,我可以添加
max-width:200px;
min-width:120px;
到 #mySidebar 和(如果显示侧边栏)
sidebar.style.minWidth = "120px";
或(如果隐藏侧边栏)
sidebar.style.minWidth = "0px";
到 toggleSidebar()。
但是 #myContent div 没有等效参数,即没有 min-margin-left 和 max-margin-left 这样的东西。结果,边缘情况下的文本重叠或间隙:
function toggleSidebar() {
var sidebar = document.getElementById("mySidebar");
var content = document.getElementById("myContent");
if (sidebar.style.width === "0%") {
sidebar.style.width = "25%";
sidebar.style.minWidth = "120px";
content.style.marginLeft = "25%";
} else {
sidebar.style.width = "0%";
sidebar.style.minWidth = "0px";
content.style.marginLeft = "0%";
}
}
#myHeaderBar {
position: fixed;
left: 0px;
right: 0px;
height: 90px;
z-index: 1;
border-bottom: 1px solid #A2A2A2;
}
#mySidebar {
background-color: #F7F7F7;
position: fixed;
top: 98px;
left: 0px;
width: 25%;
max-width:200px;
min-width:120px;
bottom: 0px;
overflow-y: auto;
border-right: 1px solid #A2A2A2;
transition: 0.5s;
}
#myContent {
position: absolute;
top: 98px;
margin-left: 25%;
bottom: 0px;
overflow-y: auto;
transition: 0.5s;
}
<!DOCTYPE html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Sidebar Test</title>
</head>
<body>
<div id="myHeaderBar">
<h2>Header</h2>
<a href="#" onclick="toggleSidebar()">Toggle Sidebar</a>
</div>
<div id="mySidebar">
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
<p>Some Link</p>
</div>
<div id="myContent">
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
</body>
</html>
是否有针对此问题的简洁 CSS/JavaScript 解决方案?我确实不因此想要使用任何 Javascript 库。
提前感谢您的任何提示!
【问题讨论】:
-
看看 CSS-Grid。它可以做你想做的事,根本不需要任何 Javascript。
-
所有这些定位都必要吗?
-
@Holli:我无法用我能想到的所有 CSS 网格变体得到想要的结果。如何将网格列宽设置为 25%,同时限制其最小值和最大值,并将其从 25% 设置为 0%,反之亦然,同时确保相邻网格会效仿?如果您确定我的问题可以通过这种方式解决,请详细说明。
-
@Paulie_D:据我所知,这是为了实现我想要的,但无论如何,这不是我问题的原因。
标签: javascript html css border sidebar