首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS在` `display: none`和` `display: flex`之间切换

JS在` `display: none`和` `display: flex`之间切换
EN

Stack Overflow用户
提问于 2020-01-07 23:14:30
回答 2查看 1.1K关注 0票数 0

我有一个用于响应导航的JS函数,当屏幕太小时,可以用一个汉堡按钮来隐藏和显示导航。

我的问题是,即使CSS样式显示为display:none,导航的链接也会在加载时显示,之后该按钮会按预期工作,并让我在display: nonedisplay: flex之间切换。是什么导致它在加载时忽略display: none

代码语言:javascript
复制
function myBurger() {
  var x = document.getElementById("navLinks");
  if (x.style.display === "none") {
    x.style.display = "flex";
  } else {
    x.style.display = "none";
  }
}
代码语言:javascript
复制
.navigation1 {
  width: 100%;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: space-between;
  padding: 3rem 3rem;
  .logo img {
    height: 5rem;
  }
  i {
    display: none;
  }
  .navLinks {
    display: flex;
    a {
      padding-left: 2rem;
      align-self: center; //vertical align
      color: $secondaryColor;
    }
  }
}


/*responsive*/

@media (max-width: 700px) {
  #icon {
    align-self: center;
    i {
      font-size: 3rem;
      display: block;
    }
  }
  .navLinks {
    flex-direction: column;
    width: 100%;
    padding-top: 2rem;
    padding-bottom: 2rem;
    display: none;
    .nav-link {
      padding-left: 0;
    }
  }
}
代码语言:javascript
复制
<div class="navigation1">
  <!--nav container -->
  <div class="logo">
    <img src="logo.svg" alt="logo">
    <!--logo image -->
  </div>
  <!--burger menu -->
  <a href="javascript:void(0);" id="icon" onclick="myBurger()">
    <i class="fa fa-bars"></i>
  </a>
  <div class="navLinks" id="navLinks">
    <!--links, no need to be put in a list -->
    <a class="nav-link active" href="#">Home</a>
    <a class="nav-link" href="#">Portfolio</a>
    <a class="nav-link" href="#">Services</a>
    <a class="nav-link" href="#">About</a>
    <a class="nav-link" href="#">Contact</a>
  </div>
</div>

谢谢

EN

回答 2

Stack Overflow用户

发布于 2020-01-08 00:11:23

因为HTMLElement.prototype.style只返回内联style=""属性中的属性,所以x.style.display == 'none'表达式不起作用。

您需要的是getComputedStyle(),它返回应用于该元素的有效样式规则。

代码语言:javascript
复制
function myBurger() {
    const el = document.getElementById( 'navLinks' );
    if( window.getComputedStyle( el ).display === "none" ) {
        el.style.display = "flex";
    } else {
        el.style.display = ""; // unset flex, so it returns to `none` as defined in the CSS.
    }
}

也就是说,您不需要任何JS来实现这一点-- just use a for a hidden with the :checked ~-trick

CSS

代码语言:javascript
复制
#menuTrigger { display: none; }

#menuTrigger:not(:checked) ~ #navLinks {
    display: none;
}

#menuTrigger:checked ~ #navLinks {
    display: flex;
}

HTML:

代码语言:javascript
复制
<div class="navigation1">

    <div class="logo">
        <img src="logo.svg" alt="logo">
    </div>

    <input type="checkbox" id="menuTrigger" />
    <label for="menuTrigger">
        <i class="fa fa-bars"></i>
    </label>

    <div class="navLinks" id="navLinks">
        <!--links, no need to be put in a list -->
        <a class="nav-link active" href="#">Home</a>
        <a class="nav-link" href="#">Portfolio</a>
        <a class="nav-link" href="#">Services</a>
        <a class="nav-link" href="#">About</a>
        <a class="nav-link" href="#">Contact</a>
    </div>

</div>
票数 2
EN

Stack Overflow用户

发布于 2020-01-08 00:26:26

实际问题是CSS选择器的专用性,您需要在媒体查询中使用此选择器:

代码语言:javascript
复制
@media (max-width: 700px) {  
    // ... 
    .navigation1 .navLinks {
        display: none;
        // ...
    }
}

而不是:

代码语言:javascript
复制
@media (max-width: 700px) {  
    // ... 
    .navLinks {
        display: none;
        // ...
    }
}

因此,它将比顶部的选择器更具体:

代码语言:javascript
复制
.navigation1 {
  // ...
  .navLinks {
    display: flex;
    // ...
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59631153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档