css hover问题?

2023-06-13 274 0

html

<li class="nav-item sc-active position-relative">
    <a class="nav-link waves-effect waves-dark px-lg-3" href="javascript:void(0)">关于我们</a>
    <ul class="sc-children position-absolute list-unstyled">
        <li class="sc-item">
            <a class="sc-link p-3 waves-effect waves-light d-block">子菜单1</a>
        </li>
        <li class="sc-item">
            <a class="sc-link p-3 waves-effect waves-light d-block">子菜单2</a>
        </li>
        <li class="sc-item">
            <a class="sc-link p-3 waves-effect waves-light d-block">子菜单3</a>
        </li>
        <li class="sc-item">
            <a class="sc-link p-3 waves-effect waves-light d-block">子菜单4</a>
        </li>
        <li class="sc-item">
            <a class="sc-link p-3 waves-effect waves-light d-block">子菜单5</a>
        </li>
    </ul>
</li>

css

#header .sc-children {
    left: .3rem;
    top: 75.3px;
    width: 200px;
    background-color: rgba(var(--sc-dark-rgb), .5);
    color: var(--sc-light);
}
#header .sc-link:hover {
    background-color: rgba(var(--sc-primary-rgb), .6);
}
#header .sc-children {
    display: none;
}
#header .nav-item:hover .sc-children {
    display: block;
}

image.png

现在悬停在 '关于我们' 这里, 子菜单会弹出
但是有个问题, 如果鼠标往下移动, 子菜单就会消失
有什么办法能解决这个问题, 让鼠标能够停留在子菜单(注: 不能用js)

不能用 JS 这个要求既然有了,那么就应该要明白 :hover 的“作用域”有多大才行。对于:hover,如果你要用这种方式来实现子菜单的弹出,最简单的道理就是,响应区域要够大。

所以,最简单的解决方法就是,当你的鼠标经过某个菜单的时候,就把该菜单的盒模型大小改变,变得跟子菜单一样大就可以了。

可以试试设置一个CSS3动画?鼠标移进去时触发动画展开下拉框,且保留最后一帧

#header .sc-children {
    opacity: 0;
}
#header .nav-item:hover .sc-children {
    opacity: 1;
    animation-name: isShow;
    animation-fill-mode: forwards;
}
@keyframes isShow {
    from {
        opacity: 0;
    }
    to {
        opacity: 1;
    }
}

个人观点,欢迎指正

因为设置了 top: 75.3px; 导致悬停受限
一个简单的解决思路
去除 top 属性, 改用 padding-top 就可以了
但由于sc-children设置了背景, 悬停上去会导致色块重叠
那么可以在外层加一个无背景的 div, 定位给外面的 div 即可解决

image.png

代码如下

html

<li class="nav-item sc-active position-relative">
    <a class="nav-link waves-effect waves-dark px-lg-3" href="javascript:void(0)">关于我们</a>
    <div class="sc-children position-absolute">
        <ul class="list-unstyled">
            <li class="sc-item">
                <a class="sc-link p-3 waves-effect waves-light d-block">子菜单1</a>
            </li>
            <li class="sc-item">
                <a class="sc-link p-3 waves-effect waves-light d-block">子菜单2</a>
            </li>
            <li class="sc-item">
                <a class="sc-link p-3 waves-effect waves-light d-block">子菜单3</a>
            </li>
            <li class="sc-item">
                <a class="sc-link p-3 waves-effect waves-light d-block">子菜单4</a>
            </li>
            <li class="sc-item">
                <a class="sc-link p-3 waves-effect waves-light d-block">子菜单5</a>
            </li>
        </ul>
    </div>
</li>

css

#header .sc-children {
    left: .3rem;
    padding-top: 35px;
    width: 200px;
    color: var(--sc-light);
}
#header .sc-children>ul {
    background-color: rgba(var(--sc-dark-rgb), .5);
}

样式代码没给全,以我的经验,只需要把 nav-item 的高度设置到和导航条高度一样就可以了,使用 padding 或者 height
image.png

将下拉的内容放到hover元素中,作为hover元素的子标签,当hover在子元素时,会给父元素也起作用。可以使用定位来保持位置。这个例子https://codepen.io/Ritr/pen/WqWQjd是使用checked实现的,你可以参考下改为hover

.sc-children也加上hover

.sc-children:hover {
    display: block;
}

这样在hover到下拉菜单的时候也会显示

但是,这样要确保nav-linksc-children之间不能有缝隙,不然在鼠标经过空隙的时候下拉菜单就隐藏了

回答

相关文章

nuxt2部署静态化和ssr的时候访问首页先报404再出现首页为什么?
`clip-path` 如何绘制圆角平行四边形呢?
多线程wait方法报错?
VUE 绑定的方法如何直接使用外部函数?
vue2固定定位该怎么做?
谁有redis实现信号量的代码,希望借鉴一下?