如何使用Jquery切换元素

3
我正在尝试使用HTML、CSS和JS创建导航栏。然而,我在尝试切换汉堡包时遇到了问题。当您单击汉堡包时滑动菜单会弹出,再次单击汉堡包时会隐藏滑动菜单。
为了解决这个问题,我创建了两个函数并通过内联方式调用opennav函数。

function openNav() {
  document.getElementById("mySidenav").style.width = "250px";
}

function closeNav() {
  document.getElementById("mySidenav").style.width = "0";
}
@import url('https://fonts.googleapis.com/css?family=Rubik');
body {
  margin: 0;
  font-family: "Rubik", sans-serif
}

.topnav {
  position: relative;
  overflow: hidden;
  background-color: #122B3C;
  height: 65px;
}

.topnav a {
  float: left;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.topnav a.active {
  background-color: #4CAF50;
  color: white;
}

.topnav-centered a {
  float: none;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.topnav-right {
  float: right;
}

.hamburger {
  display: inline-block;
  cursor: pointer;
  position: fixed;
  z-index: 999;
}

.home-hamburger {
  position: static;
}

.nav-center {
  position: absolute;
  left: 48%;
  width: 40px;
  margin-left: -20px;
  /* halve the width of the image */
}

.doch {
  position: fixed !important;
  top: 0;
}

.bar1,
.bar2,
.bar3 {
  width: 40px;
  height: 3px;
  background-color: #ffffff;
  margin: 7px 0;
  transition: 0.4s;
}

.sidenav {
  height: 100%;
  width: 0;
  position: fixed;
  z-index: 1;
  top: 0;
  left: 0;
  background-color: #304C58;
  overflow-x: hidden;
  transition: 0.5s;
  padding-top: 60px;
}

.sidenav a {
  padding: 8px 8px 8px 16px;
  text-decoration: none;
  font-size: 25px;
  color: #122B3C;
  display: block;
  transition: 0.3s;
  text-transform: uppercase;
  font-weight: 600;
  margin-bottom: 10px;
}

.sidenav a:hover {
  color: #f1f1f1;
}

.sidenav .closebtn {
  position: absolute;
  top: 0;
  right: 25px;
  font-size: 36px;
  margin-left: 50px;
}

3 @media screen and (max-height: 450px) {
  .sidenav {
    padding-top: 15px;
  }
  .sidenav a {
    font-size: 18px;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<div class="topnav">
  <div class="topnav-centered">
    <a href="#home"><img src="https://via.placeholder.com/350x150" alt=""></a>
  </div>
  <a href="#news">
    <div id="toggle" class="hamburger" onclick="openNav()">
      <div class="bar1"></div>
      <div class="bar2"></div>
      <div class="bar3"></div>
    </div>
  </a>
</div>
<div style="padding-left:16px">
  <h2>Responsive Top Navigation with Centered and Right-Aligned Links</h2>
  <p>Resize the browser window to see the responsive effect.</p>
</div>
<div id="mySidenav" class="sidenav">
  <a href="#">What we do</a>
  <a href="#">How we do it</a>
  <a href="#">Team</a>
  <a href="#">Work for us</a>
  <a href="#">Jobs</a>
  <a href="#">Contact Us</a>
</div>

解决我的问题的代码是https://codepen.io/mrsalami/pen/JadoyR


请在已有的答案中选择一个,看是否对您有帮助。 - Gezzasa
3个回答

4

您不一定需要使用jQuery。 您目前的普通JS逻辑可以轻松修改以使其按照您的要求工作。

首先,不要使用内联事件处理程序或CSS,两者都是不良实践。 而是使用无侵入式事件处理程序。 然后,您可以创建一个单一的事件处理程序,通过在元素上切换CSS类来打开和关闭菜单,该类在元素上设置所需的宽度。 尝试这个:

document.getElementById('toggle').addEventListener('click', function() {
  document.getElementById("mySidenav").classList.toggle('open');
});
@import url('https://fonts.googleapis.com/css?family=Rubik');
body {
  margin: 0;
  font-family: "Rubik", sans-serif
}

.topnav {
  position: relative;
  overflow: hidden;
  background-color: #122B3C;
  height: 65px;
}

.topnav a {
  float: left;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.topnav a.active {
  background-color: #4CAF50;
  color: white;
}

.topnav-centered a {
  float: none;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.topnav-right {
  float: right;
}

.hamburger {
  display: inline-block;
  cursor: pointer;
  position: fixed;
  z-index: 999;
}

.home-hamburger {
  position: static;
}

.nav-center {
  position: absolute;
  left: 48%;
  width: 40px;
  margin-left: -20px;
  /* halve the width of the image */
}

.doch {
  position: fixed !important;
  top: 0;
}

.bar1,
.bar2,
.bar3 {
  width: 40px;
  height: 3px;
  background-color: #ffffff;
  margin: 7px 0;
  transition: 0.4s;
}

.sidenav {
  height: 100%;
  width: 0;
  position: fixed;
  z-index: 1;
  top: 0;
  left: 0;
  background-color: #304C58;
  overflow-x: hidden;
  transition: 0.5s;
  padding-top: 60px;
}

.sidenav.open {
  width: 250px;
}

.sidenav a {
  padding: 8px 8px 8px 16px;
  text-decoration: none;
  font-size: 25px;
  color: #122B3C;
  display: block;
  transition: 0.3s;
  text-transform: uppercase;
  font-weight: 600;
  margin-bottom: 10px;
}

.sidenav a:hover {
  color: #f1f1f1;
}

.sidenav .closebtn {
  position: absolute;
  top: 0;
  right: 25px;
  font-size: 36px;
  margin-left: 50px;
}

3 @media screen and (max-height: 450px) {
  .sidenav {
    padding-top: 15px;
  }
  .sidenav a {
    font-size: 18px;
  }
}
<div class="topnav">
  <div class="topnav-centered">
    <a href="#home"><img src="https://via.placeholder.com/350x150" alt=""></a>
  </div>
  <a href="#news">
    <div id="toggle" class="hamburger">
      <div class="bar1"></div>
      <div class="bar2"></div>
      <div class="bar3"></div>
    </div>
  </a>
</div>
<div style="padding-left:16px">
  <h2>Responsive Top Navigation with Centered and Right-Aligned Links</h2>
  <p>Resize the browser window to see the responsive effect.</p>
</div>
<div id="mySidenav" class="sidenav">
  <a href="#">What we do</a>
  <a href="#">How we do it</a>
  <a href="#">Team</a>
  <a href="#">Work for us</a>
  <a href="#">Jobs</a>
  <a href="#">Contact Us</a>
</div>

如果您想使用jQuery,则需要将JS更改为以下内容:
$(function() {
  $('#toggle').click(function() {
    $('#mySidenav').toggleClass('open');
  });
});

3

我使用了JavaScript的切换方法

https://codepen.io/gezzasa/pen/aaOaGN

将您的openNav()更改为toggleNav()

仍然针对同一元素

function toggleNav() {
    document.getElementById("mySidenav").classList.toggle("navWidth");
}

我还添加了宽度的类。
.navWidth {width: 350px;}

0
你可以简单地使用这个。
在CSS文件中。
.toggleClsss{
  width:250px !important;
}

在 JavaScript 文件中
$(document).ready(function(){
    $(".hamburger").click(function(){       
         $('#mySidenav').toggleClass('toggleClsss');
    });
});

1
尽量不要使用!important。相反,加强您选择元素的方式。在未来,!important可能会给您和其他人在代码上工作带来很多问题。 - Gezzasa
当然,有时我们需要添加重要属性来覆盖旧属性并添加新属性。 - Vishnu Chauhan
有时候可以这样做,但这应该是最后的选择。提高选择器优先级是更好的方法。 - Rory McCrossan
@VishnuChauhan 如果你的标记好,你永远不需要使用它。你可以改变选择元素的方式。让它更强大。 - Gezzasa
@Gezzasa 是的,当然可以。 - Vishnu Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接