【问题标题】:How to close a collapsed sidebar on click using JavaScript?如何使用 JavaScript 在单击时关闭折叠的侧边栏?
【发布时间】:2021-08-29 05:46:16
【问题描述】:

我创建了一个使用动画汉堡菜单图标打开的折叠侧边栏。但是,我无法使用 JavaScript 关闭它。我的目标是在单击动画图标时打开和关闭侧边栏。如果有任何建议,将不胜感激!希望下面的代码足以重现问题。

HTML:

<h1>Sidebar Navigation</h1>

    <div id="mySidebar" class="sidebar">
        <a><i class="fa fa-home"></i> &nbsp;Home</a>
        <a><i class="fa fa-file-text"></i> &nbsp;Menu</a>
        <a><i class="fa fa-user-circle"></i> &nbsp;About</a>
        <a><i class="fa fa-group"></i> &nbsp;Careers</a>
        <a><i class="fa fa-map-marker"></i> &nbsp;Find a Store</a>
    </div>

    <div id="content">
        <div class="openBtn" onclick="myFunction(this)"> 
            <div class="bar1"></div>
            <div class="bar2"></div>
            <div class="bar3"></div>
        </div>
        <p>Content pushed to the right when hamburger icon is clicked on which opens the sidebar.</p>
    </div>

CSS:

h1 {
    text-align: center;
    color: black;
}

.bar1, .bar2, .bar3 {
    width: 35px;
    height: 5px;
    background-color: black;
    margin: 6px 0;
    position: relative;
    bottom: 60px;
    left: 10px;
    cursor: pointer;
    transition: 0.4s;
}

.change .bar1 {
    -webkit-transform: rotate(-45deg) translate(-9px, 6px) ;
    transform: rotate(-45deg) translate(-9px, 6px) ;
}

.change .bar2 {
    opacity: 0;
}

.change .bar3 {
    -webkit-transform: rotate(45deg) translate(-8px, -8px) ;
    transform: rotate(45deg) translate(-8px, -8px) ;
}

.sidebar {
    height: 100%;
    width: 0;
    position: fixed;
    background-color: #007CC7;
    top: 0;
    left: 0;
    padding-top: 20px;
    z-index: 1;
    overflow-x: hidden;
    transition: 0.5s;
}

.sidebar a {
    padding: 6px 8px 6px 16px;
    display: block;
    font-size: 25px;
    transition: 0.3s;
}

.sidebar a:hover {
    cursor: pointer;
}

#content {
    color: black;
    transition: margin-left 0.5s;
}

a {
    color: white;
}

JavaScript:

function myFunction(x) {
  x.classList.toggle("change");
  document.getElementById("mySidebar").style.width = "250px";
  document.getElementById("content").style.marginLeft = "250px";
}

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    调整 myFunction 函数的内部逻辑。在使用 Vanilla.js 触发切换事件之前,先判断这次是否需要调整元素宽度。

    您可以点击下面的运行代码sn-p或展开sn-p按钮,看看该功能是否满足您的问题要求。..

    function myFunction(x) {
      adjustWidth("mySidebar");
      x.classList.toggle("change");
    }
    
    function adjustWidth(id){
      const btnDiv = document.getElementById('content');
      const e = document.getElementById(id);
      const eWidth = e.style.width;
      e.style.width = eWidth == '' ? "250px" : '';
      btnDiv.style.marginLeft = e.style.width;
    }
    h1 {
        text-align: center;
        color: black;
    }
    
    .bar1, .bar2, .bar3 {
        width: 35px;
        height: 5px;
        background-color: black;
        margin: 6px 0;
        position: relative;
        bottom: 60px;
        left: 10px;
        cursor: pointer;
        transition: 0.4s;
    }
    
    .change .bar1 {
        -webkit-transform: rotate(-45deg) translate(-9px, 6px) ;
        transform: rotate(-45deg) translate(-9px, 6px) ;
    }
    
    .change .bar2 {
        opacity: 0;
    }
    
    .change .bar3 {
        -webkit-transform: rotate(45deg) translate(-8px, -8px) ;
        transform: rotate(45deg) translate(-8px, -8px) ;
    }
    
    .sidebar {
        height: 100%;
        width: 0;
        position: fixed;
        background-color: #007CC7;
        top: 0;
        left: 0;
        padding-top: 20px;
        z-index: 1;
        overflow-x: hidden;
        transition: 0.5s;
    }
    
    .sidebar a {
        padding: 6px 8px 6px 16px;
        display: block;
        font-size: 25px;
        transition: 0.3s;
    }
    
    .sidebar a:hover {
        cursor: pointer;
    }
    
    #content {
        color: black;
        transition: margin-left 0.5s;
    }
    
    a {
        color: white;
    }
    <h1>Sidebar Navigation</h1>
    
    <div id="mySidebar" class="sidebar">
        <a><i class="fa fa-home"></i> &nbsp;Home</a>
        <a><i class="fa fa-file-text"></i> &nbsp;Menu</a>
        <a><i class="fa fa-user-circle"></i> &nbsp;About</a>
        <a><i class="fa fa-group"></i> &nbsp;Careers</a>
        <a><i class="fa fa-map-marker"></i> &nbsp;Find a Store</a>
    </div>
    
    <div id="content">
        <div class="openBtn" onclick="myFunction(this)"> 
            <div class="bar1"></div>
            <div class="bar2"></div>
            <div class="bar3"></div>
        </div>
        <p>Content pushed to the right when hamburger icon is clicked on which opens the sidebar.</p>
    </div>

    【讨论】:

    • 这个解决方案真的很有帮助,我非常感谢您的反馈。在 JavaScript 方面,我仍然是初学者,所以我会尽可能多地学习。为了更好地理解这个解决方案,您介意与我分享您的思考过程吗?看起来很简单,但我想确保我能完全掌握这个概念。
    • 我不介意分享我的思考过程。在设计一个函数的时候,我建议你在开始写之前先想好你需要它达到什么样的结果。比如这个问题可以看成我有一个按钮,点击就调用了一个函数。这个函数的最终结果是实现打开或关闭侧边栏的结果。你已经完成了一半。您已经可以打开侧边栏了。唯一剩下的就是关闭侧边栏了,因为不管是打开还是关闭,都是用同一个函数来控制事件。
    • 没有分成两个功能分别控制打开或关闭,所以打开侧边栏的时候需要判断是否需要打开,那么如何判断侧边栏是否打开呢?如果没有打开,你会发现它的宽度是一个空字符串,如果已经打开,按照你的逻辑,就是250px,所以根据这两个条件,我们可以很容易的判断出它的状态侧边栏,打开了就关闭,关闭了就打开,从而实现动态打开或关闭处理
    猜你喜欢
    • 2018-06-04
    • 2017-05-29
    • 2019-09-20
    • 2013-10-24
    • 2020-02-18
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多