我正在try 创建一个下拉菜单,可以在单击按钮或将鼠标悬停在其上时打开.

使用我的代码,下拉菜单在单击或悬停时闪烁.换句话说,显示和不透明度不会一直存在.我希望能够点击或悬停在下拉菜单标题上以显示下拉菜单.以下是Html、css和JS:

`<div class="menu-link dropdown">
                <p class="dropdown-select">Item</p>
                <div class="dropdown-menu">
                    <div class="top">
                        <div class="arr-wrap">
                            <div class="arr"></div>
                        </div>
                    </div>
                    <p class="menu-link"><a href="./link.html">Item</a></p>
                    <p class="menu-link"><a href="./link.html">Item</a></p>
                    <p class="menu-link"><a href="./item.html">Item</a></p>
                    <p class="menu-link"><a href="./item.html">Item</a></p>
                    <p class="menu-link"><a href="./item.html">Item</a></p>
                </div>
            </div>`


`
.menu-link {
    width: 100px;
    text-align: right;
    transition: 0.3s;
    margin-right: 25px;
}
.dropdown .menu-link {
    width: 200px;
    text-align: left;
    padding: 15px 0px;
    margin-left: 35px;
    height: 25px;
}
.dropdown-menu {
    position: absolute;
    top: 100px;
    opacity: 0;
    width: fit-content;
    height: fit-content;
    margin-left: -8px;
    width: fit-content;
    flex-flow: column;
    z-index: 3;
    border-radius: 10px;
    transition: 0.2s;
    background-color: white;
    box-shadow: 2px 2px 10px lightgrey;
    display: none;
}

.dropdown-select {
    height: fit-content;
}


.menu .menu-link {
    width: 100px;
    text-align: right;
    transition: 0.3s;
    margin-right: 25px;
}
.dropdown .menu-link {
    width: 200px;
    text-align: left;
    padding: 15px 0px;
    margin-left: 35px;
    height: 25px;
}
.dropdown-menu {
    position: absolute;
    top: 100px;
    opacity: 0;
    width: fit-content;
    height: fit-content;
    margin-left: -8px;
    width: fit-content;
    flex-flow: column;
    z-index: 3;
    border-radius: 10px;
    transition: 0.2s;
    background-color: white;
    box-shadow: 2px 2px 10px lightgrey;
    display: none;
}
.dropdown-select {
    height: fit-content;
}
.display {
    display: flex;
    opacity: 1;
    z-index: 3;
}`

   `document.addEventListener('DOMContentLoaded', load, false);
    function load() {
         document.getElementsByClassName("dropdown")[0].addEventListener("click", dropdown, false);
         document.getElementsByClassName("dropdown")[0].addEventListener("mouseover", dropdown, false);
}
   function dropdown() {
    var dropdown = document.getElementsByClassName("dropdown-menu")[0];
    
    dropdown.classList.toggle("display");
}`
  

推荐答案

这是一个很容易犯的错误: 菜单闪烁是因为每次鼠标在元素上移动一点就会触发"鼠标悬停".所以,当你把鼠标移到下拉菜单上时,鼠标移到它上面,不断地调用切换"Display"类的函数,所以它打开,然后关闭,然后再次打开,以此类推,直到无限.

要修复它,您应该try 如下所示:

document.getElementsByClassName("dropdown")[0].addEventListener("click", dropdownClick, false);
document.getElementsByClassName("dropdown")[0].addEventListener("mouseenter", dropdownMouseEnter, false);
document.getElementsByClassName("dropdown")[0].addEventListener("mouseleave", dropdownMouseLeave, false);

function dropdownClick() {
    var dropdown = document.getElementsByClassName("dropdown-menu")[0];
    dropdown.classList.toggle("display");
}

function dropdownMouseEnter() {
    var dropdown = document.getElementsByClassName("dropdown-menu")[0];
    dropdown.classList.add("display");
}

function dropdownMouseLeave() {
    var dropdown = document.getElementsByClassName("dropdown-menu")[0];
    dropdown.classList.remove("display");
}

这不是制作下拉菜单的最好方法,但这会让你的工作更好,更像你最初想要的.

如前所述,每次鼠标光标移动到元素上时,MouseOver都会触发,而MouseEnter将在鼠标第一次悬停元素时触发一次,而Mouseleave将在鼠标不再悬停元素时再次触发.

我已经冒昧地对它进行了一些修改,使其更具功能性.有关结果,请参见下文:

function _(id) { return document.getElementById(id); }

_("dropdown1").addEventListener("click", dropdownClick, false);
_("dropdown1").addEventListener("mouseenter", dropdownMouseEnter, false);
_("dropdown1").addEventListener("mouseleave", dropdownMouseLeave, false);

function dropdownClick() {
    _("dropdown1").classList.toggle("show");
}

function dropdownMouseEnter() {
    _("dropdown1").classList.add("show");
}

function dropdownMouseLeave() {
    _("dropdown1").classList.remove("show");
}
*, *::before, *::after {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
    font-family: 'Open Sans', sans-serif;
    font-weight: 500;
    margin: 0;
    padding: 0;
}

body {
    background-color: #eee;
    margin: 0.5rem;
}

.dropdown-wrap {
    position: absolute;
}

.dropdown-wrap .menu-link {
    padding: 1rem;
}

.dropdown-wrap .dropdown-select {
    padding: 1rem;
    cursor: pointer;
    width: 7rem;
    background-color: white;
    border-radius: 0.8rem;
}

.dropdown {
    min-width: 12rem;
    text-align: left;
    position: absolute;
    opacity: 0;
    display: flex;
    flex-flow: column;
    left: 0;
    top: calc(100% + 0.5rem);
    z-index: 3;
    border-radius: 0.8rem;
    transition: 0.2s;
    background-color: white;
    box-shadow: 2px 2px 10px lightgrey;
    transform-origin: top left;
    scale: 0;
}

.dropdown-wrap.show .dropdown {
    scale: 1;
    opacity: 1;
}
<div id="dropdown1" class="dropdown-wrap">
    <p class="dropdown-select">Item</p>
    <div class="dropdown">
        <p class="menu-link"><a href="./link.html">Item</a></p>
        <p class="menu-link"><a href="./link.html">Item</a></p>
        <p class="menu-link"><a href="./item.html">Item</a></p>
        <p class="menu-link"><a href="./item.html">Item</a></p>
        <p class="menu-link"><a href="./item.html">Item</a></p>
    </div>
</div>

Javascript相关问答推荐

如何在不分配整个数组的情况下修改包含数组的行为主体?

在React中获取数据后,如何避免不必要的组件闪现1秒?

如何修复(或忽略)HTML模板中的TypeScript错误?'

如何为我的astro页面中的相同组件自动创建不同的内容?

如何让npx在windows中运行js脚本?

阿波罗返回的数据错误,但在网络判断器中是正确的

React.Development.js和未捕获的ReferenceError:未定义useState

在数组中查找重叠对象并仅返回那些重叠对象

使用VUE和SCSS的数字滚动动画(&;内容生成)

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

每次重新呈现时调用useState initialValue函数

更新Redux存储中的对象数组

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

基于产品ID更新条带产品图像的JavaScript命中错误

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

在GraphQL解析器中修改上下文值

如何在Reaction中清除输入字段

如何处理不带参数的redux thunk payloadCreator回调函数?

如何动态呈现适合未知屏幕大小的最大数量的表行?苗条的