首页 > 解决方案 > 使用 BEM 重写扩展导航栏(因此所有元素都具有相同的特异性)

问题描述

我想重写这个 scss 代码以使其遵循 BEM 方法,以便每个元素都具有相同的特异性,以便以后在没有 !important 关键字的情况下轻松覆盖它。

我被困在这门课上.ig-snttb-navbar-toggler {...},在这里:

.ig-snttb-dropdown-menu__container:hover > ul,
.ig-snttb-dropdown-menu__container:focus-within > ul,
.ig-snttb-dropdown-menu__container ul:hover {
  visibility: visible;
  opacity: 1;
  display: block;
}

是否有可能使这个导航菜单对所有具有相同特性的类起作用?

这是此导航的工作示例:

https://codepen.io/iuriiGav/pen/OJWdMJR

谢谢!


$nav-height: 100px;
$logo-font-size: 1.6rem;
$logo-font-weight: 900;
$logo-font-family: serif;
:root {
  --color-white: white;
  --color-dark: black;
}
body {
  background-color: gray;
}


// hamburger button button
.ig-snttb-navbar-toggler {
  position: absolute;
  top: 40px;
  right: 40px;
  height: 20px;
  width: 25px;
  z-index: 5;

  &:hover {
    cursor: pointer;
  }

  &:focus {
    opacity: 0.8;
  }
  &__trigger {
    display: none;

    &:checked + label {
      span {
        opacity: 0;
        top: 50%;
      }
      span:first-child {
        opacity: 1;
        transform: rotate(405deg);
      }
      span:last-child {
        opacity: 1;
        transform: rotate(-405deg);
      }
    }
    // pressed button opening the full screen nav
    &:checked ~ nav {
      min-height: 800px;
      transition-delay: 0s;
        display: flex;
    justify-content: center;
      > ul {
        visibility: visible;
        > li {
          opacity: 1;
        }
      }
    }
  }

  &__line {
    position: absolute;
    width: 100%;
    height: 2px;
    top: 50%;
    margin-top: -1px;
    left: 0;
    display: block;
    background: var(--color-white);
    transition: 0.5s;

    &:first-child {
      top: 3px;
    }
    &:last-child {
      top: 16px;
    }
  }
}


// navbar
.ig-snttb-nav {
  &__container {
    background: var(--color-dark);
    width: 100%;
    height: $nav-height;
    min-height: $nav-height;
    z-index: 3;
    transition: 0.5s;
    transition-delay: 0.5s;
    overflow: hidden;
  }
  &__list {
    text-align: center;
    visibility: hidden;
    margin-top: calc(#{$nav-height} + 20px);
  }

  &__list-item {
    opacity: 0;
    transition: 0.5s;
    transition-delay: 0s;
    position: relative;
    box-sizing: border-box;
    font-size: 1.6rem;
    padding: 0 1.5em;
  }
  &__link {
    text-decoration: none;
    text-transform: uppercase;
    color: var(--color-white);
    font-weight: 700;
    font-family: var(--font-secondary);
    display: inline-block;
    padding: 30px;
    width: 100%;
    transition: all 0.2s ease;

  }
}


// dropdown menu
.ig-snttb-dropdown-menu {
  &__list {
    position: absolute;
    left: 100%;
    top: 5px;
    width: fit-content;
    visibility: hidden;
    opacity: 0;
    transition: all 0.2s ease;
   
  }

  &__list-item {
    opacity: 1;
    transition: 0.5s;
    transition-delay: 0s;
    font-size: 1.4rem;
  }
  &__link {
    text-decoration: none;
    text-transform: uppercase;
    color: var(--color-white);
    font-weight: 400;
    display: inline-block;
    padding: 30px;
    width: 100%;
    transition: all 0.2s ease;

  
  }
}



// responsible for dropdown menu opening

.ig-snttb-dropdown-menu__container:hover > ul,
.ig-snttb-dropdown-menu__container:focus-within > ul,
.ig-snttb-dropdown-menu__container ul:hover {
  visibility: visible;
  opacity: 1;
  display: block;
}
    <input class="ig-snttb-navbar-toggler__trigger" id="ig-snttb-nav-toggler" type="checkbox" data-js-trigger='snttb-navbar-toggler-checkbox' />

    <label class="ig-snttb-navbar-toggler" for="ig-snttb-nav-toggler" tabindex="0" data-js-trigger="snttb-navbar-toggler">
        <span class="ig-snttb-navbar-toggler__line"></span>
        <span class="ig-snttb-navbar-toggler__line"></span>
        <span class="ig-snttb-navbar-toggler__line"></span>
    </label>


    <nav class="ig-snttb-nav__container" data-js-trigger='snttb-navbar-container'>
      

        <ul class="ig-snttb-nav__list">
            <li class="ig-snttb-nav__list-item">
                <a href="#" class="ig-snttb-nav__link ig-snttb-nav__link">Home</a>
            </li>
            <li class="ig-snttb-nav__list-item">
                <a href="#" class="ig-snttb-nav__link">Biography</a>
            </li>
            <li class="ig-snttb-nav__list-item">
                <a href="#" class="ig-snttb-nav__link">Events</a>
            </li>

            <li class="menu-item-has-children ig-snttb-dropdown-menu__container ig-snttb-nav__list-item" data-js-trigger="snttb-dropdown-container">
                <a href="#" class="ig-snttb-nav__link" data-js-trigger="snttb-dropdown-toggler">Dropdown</a>
                <ul aria-label="submenu" class="ig-snttb-dropdown-menu__list  depth_0">
                    <li id="ig-menu-item-28" class="ig-snttb-nav__list-item ig-snttb-dropdown-menu__list-item">
                        <a class="ig-snttb-dropdown-menu__link" href="#">Recordings</a>
                    </li>
                    <li id="ig-menu-item-31" class="ig-snttb-nav__list-item ig-snttb-dropdown-menu__list-item">
                        <a class="ig-snttb-dropdown-menu__link" href="#">Press</a>
                    </li>
                    <li id="ig-menu-item-32" class="ig-snttb-nav__list-item ig-snttb-dropdown-menu__list-item">
                        <a class="ig-snttb-dropdown-menu__link" href="#">Videos</a>
                    </li>
                </ul>
            </li>
            <li class="ig-snttb-nav__list-item">
                <a href="#" class="ig-snttb-nav__link">Contact</a>
            </li>
        </ul>

    </nav>

标签: sassbem

解决方案


上面的块可以这样写,因为你的主类是ig-snttn-drop-down-menu并且container是你的块,所以它被删除了。休息你需要hoverfocus这样ul可以一起使用。

.ig-snttb-dropdown-menu {
  &__container {
    &:hover > ui,
    &:focus-witin > ul,
    ul:hover {
       visibility: visible;
        opacity: 1;
        display: block;
    }
  }
}

推荐阅读