【问题标题】:How do you apply css to the parent's sibling element when input is checked?检查输入时如何将 css 应用于父级的兄弟元素?
【发布时间】:2020-07-06 15:18:24
【问题描述】:

我正在努力让移动汉堡导航正常工作,但由于元素的嵌套/关系,我无法将 CSS 应用于元素。我有汉堡包图标(#mobile-menu)根据输入(#nav-trigger)是否被检查(变成X)正确动画。

但是当检查987654323 @ 987654323时,我还想更改#header-nav的绝对定位(在选中时将其带到视图中)。这就是我卡住的地方。选中 #nav-trigger 时,如何使用 CSS 选择器将 CSS 规则更改应用到 #header-nav?我正在使用 SCSS,我尝试过嵌套选择器,如 ~+ 等,但我无法让它工作。任何帮助是极大的赞赏。谢谢!

<nav id="header-nav">
    <ul>
        <li>
            <a>Nav item</a>
        </li>
        <li>
            <a>Nav item</a>
        </li>
        <!-- etc... -->
    </ul>
</nav>
<div id="mobile-menu-container">
    <div id="mobile-menu-div">
        <label id="mobile-menu-label" for="nav-trigger"></label>
        <input type="checkbox" id="nav-trigger"/>
        <div id="mobile-menu"></div>
    </div>
</div>

【问题讨论】:

    标签: css sass navigation css-selectors


    【解决方案1】:

    使用 javascript - 没有浏览器支持(目前)只能通过 CSS “返回”“遍历”(父级 - 父级 - 兄弟级等)。

    div :parent :parent ~ .... no way!! :)
    

    StackOverflow 相关问题: Is there a CSS parent selector?


    基本的香草 JS 示例:

      var checkbox = document.querySelector("input[name=hamburger]");
      var header = document.getElementById("header-nav");
      var label = document.getElementById("mobile-menu-label");
      var checked = checkbox.checked;
    
      if (checked){
        // Checkbox is checked..
        header.classList.toggle('active');
        label.innerHTML = "by deafult checked";
      } else{
        label.innerHTML = "by deafult not checked";
      }
    
      checkbox.addEventListener( 'change', function() {
        if(this.checked) {
          // Checkbox is checked..
          header.classList.toggle('active');
          label.innerHTML = "is true";
    
        } else {
          // Checkbox is not checked..
          header.classList.toggle('active');
          label.innerHTML = "is false";
        }
      });
    input[type=checkbox]:checked ~ #mobile-menu {
      color: white;
      background-color: magenta;
      transition: background-color 0.5s ease;
      font-style: normal;
      cursor: pointer;
    } 
    
    #header-nav.active{
      transition: background-color 0.5s ease;
      background: red;
    }
    
    label{
      cursor: pointer;
    }
    <nav id="header-nav">
      <ul>
        <li>
          <a>Nav item</a>
        </li>
        <li>
          <a>Nav item</a>
        </li>
        <!-- etc... -->
      </ul>
    </nav>
    <div id="mobile-menu-container">
      <div id="mobile-menu-div">
        <input name="hamburger" name="nav-trigger" type="checkbox" id="nav-trigger" checked/>
        <label id="mobile-menu-label" for="nav-trigger">Hello</label>
        <div id="mobile-menu">hamburger</div>
      </div>
    </div>

    通过 jquery

    ​​>

    使用toggleClass() Methodhttps://www.w3schools.com/jquery/html_toggleclass.asp

    StackOverflow 相关问题:Jquery if checkbox is checked add a class

    jQuery 遍历方法

    jQuery traversing,意思是“移动通过”,用于“查找”(或 select) HTML 元素基于它们与其他元素的关系。

    https://www.w3schools.com/jquery/jquery_ref_traversing.asp

    【讨论】:

    • 该死,太糟糕了。感谢您的回答,但我做复选框黑客的全部原因是导航在没有 javascript 的情况下也能正常工作。我想我必须重组导航触发器,所以它是主导航的兄弟
    • 无论如何,你应该使用Javascript来关闭/打开汉堡包(显示/隐藏一些菜单)。但是是的——你可以改变 DOM 结构。另一种选择是为导航触发器和主导航的父级添加“活动”(并将其用作选择器)。 .extra-wrapper.active #header-nav{ 背景:红色; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多