悬停时拦截显示更改

Intercept display change on hover?

本文关键字:显示 悬停      更新时间:2023-09-26

我有一些元素,悬停时会切换子ul的显示(none/block)。不幸的是,我无法通过带有显示的CSS转换淡入淡出。使用不透明度也不起作用,因为悬停区域扩展到不透明度:0 ul,并且两者的组合(过渡不透明度,但仍切换显示)似乎不起作用。

有没有一种方法可以通过Javascript拦截显示更改,并使其在块和无之间衰减?是否有其他建议(我也尝试了高度:0/自动切换,但效果不佳)?我更喜欢intercept方法而不是纯JS方法,以防JS被禁用或其他什么。

如果我理解正确的话。假设类似于:<div class="nav-container"><ul></ul></div>

您可以监听父对象上的悬停,因为它包含子对象:

var parent      = document.getElementsByClassName('nav-container')[0];
var connect     = function (element, event, callback) {/* I think you */};
var disconnect  = function (handle) {                  /* can find */};
var addClass = function (element, className) {      /* these elsewhere. */};
var removeClass = function (element, className) {      /* ... */};
var hoverHandle = connect(parent, 'hover', function (event) {
    addClass(parent, 'hovered');
    if (blurHandle) {
        disconnect(blurHandle);
    }
});
var blurHandle = = connect(parent, 'blur', function (event) {
    removeClass(parent, 'hovered');
    if (hoverHandle) {
        disconnect(hoverHandle);
    }
});  

然后在CSS中:

.nav-container > ul {
    display: none;
    /* do fade out */
} 
.nav-container.hovered > ul {
    display: block;
    /* do fade in */
}

如果您使用的是jQuery 1.7,那么这将变成:

var navContainers = $('.nav-container');
navContainers.on('hover', function () {
     $(this).toggleClass('hovered');
});
navContainers.on('blur', function () {
    $(this).toggleClass('hovered');
});