能力越大,责任越大。
CSS 允许您控制的其中一项内容是许多对象的悬停状态,最显著的是锚 (<a>) 元素。通常,悬停状态通过颜色变化来设置样式,或者可能是更花哨一点的东西,比如背景图像更改(或关于 CSS 精灵 的背景位置更改)。
但这并不是您可以更改的所有内容。同样轻松地,您可以更改字体粗细、边距、填充,或者如果您正在处理块级元素,则可以更改高度和宽度。在悬停时更改任何这些内容都进入了**危险区域**。
为什么危险?因为您正在更改元素的可点击区域。如果新的可点击区域的位置导致光标落在其外部,则悬停事件将触发关闭并恢复到其默认样式,这将再次更改可点击区域,这将导致您的光标再次位于其中,这将再次更改样式,这将……。您明白了,“CSS抖动”。
“CSS抖动”可能在您在悬停时更改对象大小时随时发生。
就这么简单。如果您想避免 CSS 抖动,请不要以任何方式设置对象的悬停状态以更改大小。
在某些情况下,更改大小是安全的。基本上,如果可点击区域**在所有方向上都变得更大**。例如,在悬停时加粗文本。由于加粗会导致对象在所有方向上都变大,因此您永远不会触发抖动。但是,如果您执行相反的操作,即在悬停时取消加粗文本,则可点击区域将变小,并且几乎肯定会触发抖动。
以下是一些可能触发“CSS抖动”的悬停样式
- 加粗/取消加粗文本
- 更改边距或填充
- 更改边框大小
- 更改宽度或高度
- 更改行高
看看 CSS 抖动侠。
好吧,这真的很蠢,但为了准确说明我所说的内容,我创建了 CSS 抖动侠。抖动侠是一个锚元素,默认情况下宽度为 246px,但在悬停时,它会缩小到 212px 宽。因此,如果您从右侧或左侧将鼠标移到抖动侠上,它将缩小。这会导致可点击区域缩小,从而使您的鼠标位于其外部,它将再次变大……从而导致抖动。查看示例
这并不是什么大规模的流行病,它只是需要注意的一件事。它很可能以更微妙的方式出现,这实际上是我最初获得这个想法的地方。我曾使用锚元素的 border-bottom,以便在底划线之前在底部提供一些填充。然后在悬停时,我将该填充减少了一个像素,因此底划线似乎向上跳动了一点,这是一个不错的效果。但这导致了一个像素区域,CSS 抖动将在那里发生。不好。最终,我为悬停选择了另一种方法。
当我看到抖动侠在做他的事时,我实际上笑出声来了!
我想这可以对您有利,就像您提到的那样,它确实在受控时产生了一种很酷的效果。
Chris
喜欢你的抖动侠!:p
太棒了!我很高兴有人喜欢它=)。我发布它时只是畏缩不前,以为人们会认为它很蠢。
哦,抖动侠以为他可以像那样挥舞着胳膊飞起来……
很棒的文章。
哈哈
抖动侠很棒!;-)
这种悬停跳动真的很烦人。当我开始使用 CSS 时,存在这个问题,无论何时我在悬停时更改块元素的边框。我不知道这是否是最好的方法,但现在,我只是简单地向块元素本身添加一个与背景颜色匹配的边框,并在悬停时更改边框颜色,然后它就可以完美地工作了,不再跳动了。
问候
哈哈@抖动侠跳舞。那真是好东西。
我认为抖动侠跳舞的原因是图像尺寸和 div 尺寸大小不相同。
好的建议,谢谢!
由于假期,我晚些时候才读到这篇文章,但在周一早上看到它真是让人开心:哈哈
关于您说可以通过使其“抖动”一两个像素来有效地将其用于悬停状态,我不同意,因为它会导致使用 elpelyte 的人遇到问题,并且还可能导致整个页面移动/抖动,这会对观看者造成干扰。
这里的诀窍是使用精灵背景等技术(http://www.alistapart.com/articles/sprites)。
抱歉,ydx,但抖动问题不是由图像尺寸和分割尺寸不同引起的。
Krumpet
哎呀,实际上,我应该提交此链接
http://wellstyled.com/css-nopreload-rollovers.html
这实际上就是这个想法的来源。A List Apart 只是对其进行了扩展。
Krumpet
我们也在这里发布了关于 CSS 精灵 的内容。
哈哈……很棒的文章。
这太棒了。这是官方名称还是你们自己用的?不过,我一直被这个问题困扰,但我不知道该怎么称呼它或者为什么会发生。谢谢!
我实际上希望有一些关于如何避免项目四处跳动的信息(例如,当活动元素显示虚线框时)。我很清楚我应该避免它,我不需要被告知。但问题是如何做到?
问候,
感谢您对 CSS 操作的所有良好建议。
这个问题仍然存在吗?这篇文章的日期是 2007 年。
在使用悬停效果(过渡、变换)缩放 CSS 圆形时,我遇到了随机内容抖动的问题。
是否有解决此类问题的办法?
谢谢,
我在搜索此问题的解决方案时发现了这篇文章;由于这篇文章没有提供解决方案,我不得不继续寻找。我遇到的问题是由于在悬停时添加边框而导致的抖动。我找到的解决方案是简单地将为悬停状态设计的样式添加到元素的固有状态,但以不可见的方式。例如,有一个默认的
border-bottom:1px solid transparent
;然后在悬停状态下为border-bottom:1px solid red;
。我想类似的方法可以用于其他会导致抖动的难题。
实际上,有一个解决方法可以在悬停时使文本加粗,方法如下
这个例子使用了
<a>
标签,所以它的 HTML 代码是这样的发生的事情是——因为我们使用
a:before
设置了完全相同的文本,但它是加粗且透明的——我们确保<a>
标签的宽度根据它在悬停时获得的宽度来设置。Chris Silverman 撰写了一篇文章分享他的文章 修复抖动错误。11年后!