问题描述
我想重写这个 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 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>
解决方法
上面的块可以这样写,因为你的主类是 ig-snttn-drop-down-menu
而 container
是你的块,所以它被删除了。休息你需要hover
,focus
上的ul
所以可以一起使用。
.ig-snttb-dropdown-menu {
&__container {
&:hover > ui,&:focus-witin > ul,ul:hover {
visibility: visible;
opacity: 1;
display: block;
}
}
}