sass - 使用 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>
解决方案
上面的块可以这样写,因为你的主类是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;
}
}
}
推荐阅读
- javascript - 如何在具有对象的深度嵌套数组中获取最后一个孩子
- python - Kivy - 在代码中的 TabbedPanelItems 之间切换
- r - 是否可以在 igraph R 库中使用多线程?
- gcc - printf 与 utf-8 编码字符串的兼容性
- android-studio - 我想用我的 android 手机作为模拟器在 windows 7 上运行颤振。在我的调试模式下进行了调整。如何解决颤振医生命令的问题
- microsoft-graph-api - Microsoft Graph:NextLink...上一个链接呢?
- android - AppCompatDialogs 在使用 alpha 版本的各种操作系统版本上崩溃 Material Components
- python - Python 2.7 的 input() 和 raw_input() 问题。用户输入的数据未正确读取。到底是怎么回事?
- shell - sqlplus 命令在 linux 中从 crontab 执行时返回帮助页面
- r - 清理具有获得姓氏和名字的分隔空间的列,以便我可以从我的数据框中过滤它