javascript - 如何使用 JavaScript 修复侧边栏错误

标签 javascript html css

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 时,它会破坏滚动时的侧边栏,例如这个image第二个问题是这样的image



当我调整窗口大小时,这两个问题都会产生。第一个问题是调整窗口大小后,它没有完美地添加粘性类(看起来像是出现故障),第二个问题是当我位于顶部时,粘性类不会删除。我也尝试了这个代码:

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()">&times;</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()">&#9776; 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> 

关于javascript - 如何使用 JavaScript 修复侧边栏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59465375/

相关文章:

javascript - 如何重构以等待 AJAX 查询完成后再导出到 CSV?

html - Perl,使用 Mechanize-Firefox,如何在保留在较大框架集中的同时扩展框架。

javascript - 使用 document.write 异步加载 javascript

javascript - 在 Jquery $().append(); 中插入 javascript 代码;

jquery - 如何使 jQuery 生成的文本居中

html - 滚动时悬停文本不会相对于元素移动

css - 如何在 HTML 分区标记之前或之后出现某些内容?

css - 只运行一次 CSS3 动画(在页面加载时)

jquery - 用js判断一个元素的宽度是否由其内容决定?

javascript - karma 不会在 javascript 测试中运行我的 typescript 测试