javascript - 如何使用 JavaScript 修复侧边栏错误
问题描述
function sidebarSticky() {
let sidebar = document.getElementById("sidebar"),
sidebarHeight = sidebar.offsetTop + sidebar.clientHeight;
function process() {
let windowHeight = document.documentElement.scrollTop + window.innerHeight;
if (windowHeight > sidebarHeight) {
sidebar.className = "sticky";
} else if (windowHeight < sidebarHeight) {
sidebar.className = "";
}
}
//WithOut Scrolling...
process();
//With Scrolling...
window.addEventListener('scroll', function(){
process();
})
}
sidebarSticky();
*,
*::before,
*::after{
box-sizing: border-box;
}
body{
margin: 0;
}
nav{
height: 80px;
width: 100%;
position: fixed;
top: 0;
background-color: #000;
z-index: 100;
}
#sidebar{
min-height: 100%;
width: 160px;
background-color: #ddd;
position: absolute;
left: 0;
}
.sticky{
position: fixed !important;
bottom: 0 !important;
}
<nav> </nav>
<div style="height: 80px;"></div>
<!-- Sidebar -->
<div id="sidebar">
<span> Start </span>
<span style="position: absolute; top: 50%;"> Middle </span>
<span style="position: absolute; bottom: 0;"> End </span>
</div>
<!-- Sidebar -->
<content style="display: block;margin: 20px 20px 20px 180px;">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptatem, earum.
<hr>
<h1>
distinctio facilis quisquam officia tenetur veniam quasi. Fugiat placeat, repellat iusto totam illum tenetur odio doloribus, fugit omnis incidunt quae repudiandae, quia quaerat perferendis! Minima laboriosam vero reprehenderit officia. Dolor rerum eligendi nemo ad quasi quisquam veniam aliquid commodi enim rem, consequuntur quos sequi veritatis nobis amet? Ab quis voluptas corrupti. Excepturi voluptatibus aut dignissimos perspiciatis culpa eaque repellat laborum illum, et vel saepe architecto temporibus inventore, corrupti laudantium quae? Sequi, dolorem? nostrum in odio quos mollitia dolores quas consectetur doloremque perferendis saepe quibusdam eaque totam vitae pariatur incidunt quaerat, vero exercitationem tenetur, sunt architecto ex voluptatem. Iure voluptas quae et. Ducimus, pariatur cumque itaque nihil neque blanditiis deleniti ullam consectetur quo, cum ipsam tempora exercitationem saepe accusamus. Officia ex voluptatum veri
</h1>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo sunt, fuga minima iure temporibus consequuntur blanditiis laboriosam architecto accusamus hic inventore, harum nisi dignissimos corrupti ad quae culpa asperiores ut. Necessitatibus et, magnam fugiat atque odio ad dolor quo minima in porro sint debitis tempora quasi, beatae accusamus distinctio repellat voluptas? Porro ratione nt accusamus quam odit laudantium a excepturi impedit, eaque voluptates dicta , sint illum recusandae quisquam laborum! Architecto fugit debitis similique suscipit amet saepe aut id ipsum beatae nam quas possimus sint autem atque quod aperiam earum, distinctio facilis quisquam officia tenetur veniam quasi. Fugiat placeat, repellat iusto totam illum tenetur odio doloribus, fugit omnis incidunt quae repudiandae, quia quaerat perferendis! Minima laboriosam vero reprehenderit officia. Dolor rerum eligendi nemo ad quasi quisquam veniam aliquid commodi enim rem, consequuntur quos sequi veritatis nobis amet? Ab quis voluptas corrupti. Excepturi voluptatibus aut dignissimos perspiciatis culpa eaque repellat illum, et vel saepe architecto temporibus inventore, corrupti laudantium quae? Sequi, dolorem? Cupiditate nostrum in odio quos mollitia dolores quas consectetur doloremque perferendis saepe quibusdam eaque totam vitae pariatur incidunt quaerat, vero exercitationem tenetur, sunt architecto ex voluptatem. Iure voluptas quae et. Ducimus, pariatur cumque itaque nihil neque blanditiis deleniti ullam consectetur quo, cum ipsam tempora exercitationem saepe accusamus. Officia quibusdam ex voluptatum veritatis possimus minus deleniti, aliquid facere quia? Amet odio recusandae soluta est esse expedita. Nemo at, voluptate impedit praesentium a doloremque architecto doloribus. Est eum enim veniam nobis rerum, corrupti accusantium et libero itaque inventore tenetur hic obcaecati voluptas sint id eligendi consequatur incidunt quaerat a asperiores laborum blanditiis tempora autem. Rem, non cupiditate. Eligendi non eaque laborum, sapiente praesentium iusto dicta atque consequatur ratione error fugiat. Voluptas eaque explicabo dolorum molestias, ad consectetur animi odio. Deserunt cum velit rerum corporis aliquid. Vitae, et exercitationem consequuntur debitis nobis a esse assumenda. Ex id reprehenderit sint vero debitis, temporibus sed aperiam saepe error mollitia vel iure, adipisci ipsam perspiciatis. Blanditiis libero minima mollitia enim voluptatibus tenetur voluptas. Labore voluptatum ratione unde esse ad voluptates deserunt reiciendis delectus! Quaerat eos, unde officia facere adipisci expedita alias? Ratione sapiente, facere, nemo, fuga repellendus obcaecati saepe consequuntur eos consectetur natus ipsa? Eaque vitae aspernatur ipsum? Cum, numquam fugiat ullam ipsum nemo quibusdam, error eius asperiores nostrum id laudantium veniam enim voluptatem, vero cumque esse tempore atque quae animi. Aliquam reprehenderit ullam repudiandae accusamus aut molestiae placeat odit?
</content>
一切通常都很好,但是当我调整窗口/打开 inspact elm 的大小时,它会像这样在滚动时破坏侧边栏,第二个问题是这样的。
当我调整窗口大小时,这两个问题都会产生。第一个问题是在调整窗口大小后,它没有完美地添加粘性类(看起来像故障),第二个问题是当我在顶部时,粘性类不会删除。我也试试这段代码:
window.onresize = function (event) {
process();
//failed again :(
};
解决方案
试试下面的示例代码
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
font-family: "Lato", sans-serif;
}
.sidenav {
height: 100%;
width: 0;
position: fixed;
z-index: 1;
top: 0;
left: 0;
background-color: #111;
overflow-x: hidden;
transition: 0.5s;
padding-top: 60px;
}
.sidenav a {
padding: 8px 8px 8px 32px;
text-decoration: none;
font-size: 25px;
color: #818181;
display: block;
transition: 0.3s;
}
.sidenav a:hover {
color: #f1f1f1;
}
.sidenav .closebtn {
position: absolute;
top: 0;
right: 25px;
font-size: 36px;
margin-left: 50px;
}
#main {
transition: margin-left .5s;
padding: 16px;
}
@media screen and (max-height: 450px) {
.sidenav {padding-top: 15px;}
.sidenav a {font-size: 18px;}
}
</style>
</head>
<body>
<div id="mySidenav" class="sidenav">
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">×</a>
<a href="#">About</a>
<a href="#">Services</a>
<a href="#">Clients</a>
<a href="#">Contact</a>
</div>
<div id="main">
<h2>Sidenav Push Example</h2>
<p>Click on the element below to open the side navigation menu, and push this content to the right.</p>
<span style="font-size:30px;cursor:pointer" onclick="openNav()">☰ open</span>
</div>
<script>
function openNav() {
document.getElementById("mySidenav").style.width = "250px";
document.getElementById("main").style.marginLeft = "250px";
}
function closeNav() {
document.getElementById("mySidenav").style.width = "0";
document.getElementById("main").style.marginLeft= "0";
}
</script>
</body>
</html>
推荐阅读
- c# - 如何将特定节点从xml导入treeview c#
- android - Pjsip Android:如何使用 PjCamera 类显示用户预览
- corda - Corda 枚举序列化和 PersistentState
- javascript - 如何查看用户是否已从 Javascript 应用程序中注销身份服务器
- gensim - Gensim 的 FastText KeyedVector 超出了词汇量
- grails - 如何解决同步方法中的连接关闭问题?
- wordpress - 是否可以过滤通过 WooCommerce REST API 可见的订单?
- dictionary - 如何在 Groovy 中的对象中使用变量作为键?
- qt - QML 在一行中显示多个文本
- azure - NSG 流日志和 NSG 诊断差异