【问题标题】:Trying to Open/Close a div with one button尝试一键打开/关闭 div
【发布时间】:2016-05-16 01:03:17
【问题描述】:
function openNav() {
    document.getElementById("mySidenav").style.width = "200px";
}

/* Set the width of the side navigation to 0 */
function closeNav() {
    document.getElementById("mySidenav").style.width = "0";
}

<div onclick="openNav()" class="minimenubutton"><img src="images/menu.png"/></div>

我正在寻找一种每次单击此按钮时都可以更改功能的方法,以便我可以用一个按钮打开我的 div。截至目前,我已将 closeNav 设置为该 div 内的一个按钮,但我想只使用“minimenubutton”来完成这一切。

我是 Javascript 新手,所以请放轻松。我查找了切换开关,但无法弄清楚。

【问题讨论】:

  • 您能否在问题中包含#mySidenav 元素?

标签: javascript html css


【解决方案1】:

您只需要一个带有 2 个条件(if 和 else)的函数;

function togNav() {
  var nav = document.getElementById("nav");
  if (nav.style.width == '200px') {
    nav.style.width = '0';
    nav.style.opacity = 0;
  } else {
    nav.style.width = "200px";
    nav.style.opacity = 1;
  }
}
#nav {
  transition: opactity 3s ease-in;
  opacity: 0;
  cursor: pointer;
}
<p>Click under this paragraph</p>
<nav id="nav" onclick="togNav()" class="minimenubutton">
  <img src="https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png" />
</nav>

【讨论】:

  • 这非常有效。感谢您的帮助和知识!
  • 这里将 CSS 与 JS 分离的一种方法是让切换代码只添加/删除 CSS 类并在这些类中定义样式规则。
  • 我通常是这样做的,但我认为对 OP 来说更重要的是更好地掌握他所熟悉的内容。
  • 我不喜欢这种方法...基于元素宽度的条件似乎“粗略”...不考虑客户端屏幕尺寸、缩放级别、可访问性设置等因素。我会做一些事情,比如在每次点击时添加/减去一个 CSS 类,并根据需要为该类设置 CSS。我的 0.02 美元。
【解决方案2】:

您可以使用getComputedStyle()、切换0px200px 来检查元素的css width;将overflow 设置为hidden #mySidenav css

#mySidenav {
  display: inline-block;
  width: 0px;
  position: relative;
  overflow: hidden;
}
<script>
  function toggleNav() {
    var el = document.getElementById("mySidenav");
    el.style.width = window.getComputedStyle(el).width === "0px" ? "200px" : "0px";
  }
</script>
<div id="mySidenav">side nav</div>
<div onclick="toggleNav()" class="minimenubutton">
  <img src="http://lorempixel.com/50/50/nature" />
</div>

【讨论】:

  • 你能分解一下“el.style.width = window.getComputedStyle(el).width === "0px" ? "200px" : "0px";"对我有用吗?我知道我不是发布这个问题的人,但我一直在关注它寻找不是 jquery 的答案。我试图更好地理解 jquery 背后的 javascript。如果你有时间那就太好了。谢谢!
  • @JamesHamann OP 未在问题中提供 html#mySidenav。如果#mySidenav width 设置为css,而不是元素的style 属性,则检查element.style.width === 200px0px 将不会返回预期结果。 .getComputedStyle() 还将返回在 .css 文件中设置的样式。 true ? //do stuff://else do other stuff 是三元运算符
  • 酷,很高兴知道。所以这行“===”0px”的最后一部分?“200px”:“0px”;”,这会切换宽度吗?我只是不确定如何。问号和冒号有什么作用?抱歉这么多问题
【解决方案3】:

如果布局允许,您也可以使用checkbox + div 实现此目的。完全没有 Javascript。

input.toggler { display: none; }
input.toggler + label + div { display: none; }
input.toggler:checked + label + div { display: block; }
<input type=checkbox id=sometoggler class=toggler />
<label for=sometoggler>open/close</label>
<div>content to show / hide </div>

【讨论】:

    【解决方案4】:
    function toggleNav() {
        var el = document.getElementById("mySidenav");
        if(el.style.width == "200px"){
            el.style.width = "0px";
        } else {
            el.style.width = "200px";
        }
    }
    
    <div onclick="toggleNav()" class="minimenubutton"><img src="images/menu.png"/></div>
    

    【讨论】:

      【解决方案5】:

      首先检查元素的宽度。如果元素的宽度为 200px,则将其设置为 0px,但如果不是 200px,则必须为 0px;所以设置宽度为200px。

      function togNav() {
          var e = document.getElementById("mySidenav");
          if (e.style.width == "200px") ? e.style.width = "0px" : e.style.width = "200px";
      }
      

      【讨论】:

      • 糟糕的解决方案 - 过于耦合。如果需要的高度会改变怎么办?我相信 Javascript 应该统治逻辑,而不是表现。演示文稿用于 CSS。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 2014-07-21
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多