- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
已经有几个问题解决了这个问题。我将我的包括在内有两个原因:
在 CSS 转换
之后,用户必须先移动鼠标,然后鼠标下方的元素才会注意到它处于 :hover
状态。我创建了一个类似菜单的功能,可以滑动打开以显示不同的选项。打开过渡结束时鼠标下的选项与过渡开始时鼠标下的选项不同。因此,我不得不找到解决方法。
你可以找到一个jsFiddle here和下面的演示源。寻找WORKAROUND(在三个地方)看看我做了什么。
要查看问题,请将鼠标移到菜单上,然后将其留在原处,不要移动它。浏览器认为是 :hover
的列表项将以蓝色显示。我的解决方法用 li.ignoreHover
类否决了 li:hover
规则。为了使解决方法不可见,我可以简单地使用标准背景色。相反,我使用蓝色来使问题可见。
我的问题:我注意到按下修饰键之一(Caps、Caps lock、Ctrl, Option/Alt, ⌘ on Mac, ...) 也将强制 :hover
状态为更新。有没有办法将这样的事件发送到 #menu
元素?
(我的尝试没有成功,因此我更愿意为您提供我的解决方法,而不是可能无效的解决方法)。
<!DOCTYPE html>
<html>
<head>
<style>
#menu {
position: relative;
background: #ccc;
display: inline-block;
}
#wrapper {
margin: 5px;
}
#logo {
width: 150px;
height: 50px;
border: 1px solid #000;
margin: 0px auto;
z-index: 10;
}
nav {
width: 100%;
overflow: hidden;
text-align:center;
height: 2em;
}
ul {
position: relative;
display:inline-block;
margin: 0 auto;
padding: 0;
list-style-type: none;
text-align:left;
}
li {
display: block;
margin: 0;
padding:0.25em 0;
line-height: 1.5em;
}
ul.animated, nav {
transition: all 500ms linear 1s;
}
#menu.hover ul, #menu.hover nav {
transition-delay: 0s;
}
li:hover,
li.hover {
background-color: #999;
}
li.ignoreHover {
background-color: #ccf; /* a touch of blue, so you can see it */
}
.selected {
color: #fff;
}
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
</head>
<body>
<div id="menu">
<div id="wrapper">
<div id="logo"></div>
</div>
<nav>
<ul>
<li>Note one</li>
<li>Note two</li>
<li>Note three</li>
<li>Not four much longer</li>
<li>Note five</li>
<li>Note six</li>
</ul>
</nav>
</div>
<script>
var test = {}
;(function createMenu() {
var item = 3;
var minPadding = 5;
var hover = "hover" // class
var $li = $("li");
var $ul = $("ul");
var $menu = $("#menu");
var $nav = $("nav");
var itemHeight = parseInt($li.outerHeight(), 10);
var itemCount = $ul.children().length;
var menuWidth = $menu.outerWidth(true);
var padding = (menuWidth - $ul.width()) / 2;
var transitionDone = false;
var mouseOver = false;
var top;
// Pad the list items to fill the width of the menu
if (padding < minPadding) {
// Widen the menu to allow for the minimum padding
menuWidth += (minPadding - padding) * 2;
$menu.width(menuWidth);
padding = minPadding;
}
$li.css({
paddingLeft: padding,
paddingRight: padding
});
// Scroll to the current selected item
selectItem(true);
function selectItem(scroll) {
$ul.children().removeClass("selected");
$ul.children().eq(item).addClass("selected");
if (scroll) {
top = -(itemHeight * item);
$ul.css({
top: top
});
}
}
// Wait until the initial settings are applied
// before animating the transitions
setTimeout(function () {
$ul.addClass("animated");
}, 1);
// Handle interaction with the menu
$menu.on("mouseover", openMenu);
$menu.on("mouseleave", closeMenu);
$menu.on("transitionend", menuIsOpen);
$ul.on("click", treatClickOnItem);
// <WORKAROUND...
var x
var y
// ... WORKAROUND>
function openMenu(event) {
if (mouseOver) {
// This method may be called multiple times as the menu is
// transitioning to its open state
return
}
// <WORKAROUND...
$menu.on("mousemove", function updateXY(event) {
x = event.pageX
y = event.pageY
})
// ... WORKAROUND>
$menu.addClass(hover);
transitionDone = false;
mouseOver = true;
$nav.css({
height: (itemHeight * itemCount)
});
$ul.css({
top: 0
});
}
function menuIsOpen() {
transitionDone = true;
// <WORKAROUND...
var $hover = $("li:hover").addClass("ignoreHover")
var $item = $(document.elementFromPoint(x, y))
if (mouseOver) {
$item.addClass(hover)
}
$menu.on("mousemove", function () {
$item.removeClass(hover)
$hover.removeClass("ignoreHover")
$menu.off("mousemove")
})
//... WORKAROUND>
if (!mouseOver) {
closeMenu()
}
}
function closeMenu() {
mouseOver = false;
if (transitionDone) {
$menu.removeClass(hover)
$nav.css({
height: itemHeight
});
$ul.css({
top: top
});
}
}
function treatClickOnItem(event) {
item = $(event.target).index();
top = -(itemHeight * item);
selectItem();
// DO MORE STUFF WITH THE SELECTION
}
})()
</script>
</body>
</html>
最佳答案
Seems like it's almost impossible在动画中获取元素的 :hover
状态。
从 CSS 和
中删除 :hover
创建一个具有所需样式的 class .hover
。使用 jQuery 切换 .hover
:
$links.hover(function(){
$(this).toggleClass("hover");
});
现在回到您的问题:
为了在菜单打开时突出显示正确的元素
我们需要始终知道鼠标的 Y 位置:
var mouseY = 0; // Needed to know the mouse position when menu is opening
$(document).on("mousemove", function( e ){
mouseY = e.clientY; // Update the Y value
});
现在,在折叠菜单悬停时,使用 jQuery 为您的菜单设置动画,
在 animate step callback
中获取每一帧的每个链接位置,.filter()
通过定位与鼠标位置匹配的链接位置。
最后将 .hover
应用到那个:
function openMenu() {
$navUl.stop().animate({top: 0});
$nav.stop().animate({height: linkH*nLinks}, {
duration: 600,
step: function( menuHeight ){
// keeps removing and adding class during the animation time.
// (it's an overkill but no other solution to that issue so far)
$links.removeClass("hover").filter(function(i, e){
var t = e.getBoundingClientRect().top;
return mouseY > t && mouseY < t+linkH;
}).addClass("hover"); // only to the link returned by `.filter()` condition
}
});
}
<强>!重要说明: 上面的过滤将与您拥有的元素一样昂贵,因为在每个动画帧中它都会尝试获取位置。如果您检测到缓慢 - 改进上述内容。
回顾
在每一帧检查鼠标 clientX/Y
坐标是否在元素的 element.getBoundingClientRect()
坐标/值
关于javascript - 强制 CSS :hover to update after a transition (opening a menu) 的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427086/
我一直很难编辑我的 .htaccess 文件来一起做这三件事。我已经能够分别获得每个部分,但我只是不明白逻辑流程如何使它们全部工作。 这是我能够使用 bluehost support 上的演示进行整合
我制作的宏将模板工作簿保存为两个单独的文件。每个测试保存一个(位置 1、2、3 或 4),然后在另一个宏中使用每个测试的数据。第二个是保留用于备份的原始数据文件。现在的问题是每次我在每个位置运行测试并
我正在写一篇关于如何使用 OCaml 的模块系统而不是 Java 的 OO 系统(一个有趣的视角)的博客文章。我遇到了一些我不理解的关于强制的事情。下面是一个基本模块和两个包含它的模块: module
我有一段将被执行多次(5,000+)的代码,以及一个仅在第一次为真的 if 语句。我曾想过使用“FIRST”变量并每次都进行比较,但每次都检查它似乎是一种浪费,即使我知道它不需要。 bool FIRS
首先,我是 Perforce 的新手,我主要通过其文档进行学习。 因此,我们即将从 CVS 迁移到 Perforce,我最近学到了一个避免更改每个工作区的 P4CLIENT 的好方法,即在工作区根目录
我正在为一段代码编写测试,其中包含我试图涵盖的 IOException 捕获。 try/catch 看起来像这样: try { oos = new ObjectOutputStream(new
我正在尝试在新闻项目滚动之间添加延迟。我知道 $.each() 通过不等待动画完成来完成其工作,但我想知道如何制作它,以便一次向上滚动一个项目并等到最后一个动画完成后再继续在循环中。 $(functi
假设已经编写了一个方法,需要一个排序列表作为其输入之一。当然这将在代码中进行注释和记录,param 将被命名为“sortedList”,但如果有人忘记,则会出现错误。 有没有办法强制输入必须排序?我正
我正在尝试将传入请求重定向到 https://www.domain.com/和所有 https://www.domain.com/ {所有页面}并且没有什么麻烦。我试过的方法: 添加此行:Redire
我将如何实现以下内容: title_selection = raw_input("Please type in the number of your title and press Enter.\n%
我有一个登录表单,我需要强制关闭自动完成功能。我试过了 jquery: $('#login').attr("autocomplete", "off"); HTML: Javascript:docume
我想知道我应该怎么做才能强制从 dev 分支 merge 到我的 master 分支?使用“git merge dev”会导致很多冲突。但是,我不想单独处理它们。相反,我只是想使用我的 dev 分支中
当安装 Hl7.Fhir.DSTU2 和 Hl7.Fhir.R4 这两个 Nuget 包时,我们得到如下信息: DSTU2 包似乎在使用 Hl7.Fhir.Support.Poco 版本 3.4.0
我正在尝试让一个功能组件在 testFn 执行时强制重新渲染。我想使用状态来做到这一点(如果有更好的方法请说出来),这似乎成功地强制重新渲染但只有两次,然后什么都没有。 我构建了一个简单的演示来模拟这
默认情况下,g++ 似乎会省略未使用的类内定义方法的代码。示例 from my previous question : struct Foo { void bar() {} void baz(
我正在尝试使用 here 中介绍的技术使我的网站背景以比内容慢的速度滚动。我不希望背景固定,只希望更慢。 这是 HTML 的样子: .parallax { perspective: 1px;
我能找到的最相似的问题是 'how to create a row of scrollable text boxes or widgets in flutter inside a ListView?'
我有以下 eslint 配置: "object-curly-newline": ["error", { "ImportDeclaration": "never",
我正在使用 TinyMCE 插件并将 valid_elements 选项设置为: "a[href|target:_blank],strong/b,em/i,br,p,ul,ol,li" 即使没有列出数
您好,我想使用以下命令放置多行描述 p4 --field Description="MY CLN Header \\n my CLN complete description in two -thre
我是一名优秀的程序员,十分优秀!