读者 Jaime Morrison 通过电子邮件发送
我一直都在考虑使用一种链接样式,其中链接的下划线在悬停时“向上滑动”以成为背景高亮。
我开始思考如何自己实现这一点的一些想法。最终,我尝试了两件事,但没有一件是绝对完美的。
尝试一
我们知道我们将在这里使用 jQuery(或某些 JavaScript 库),因为需要动画。我的第一个想法是在链接上设置相对定位,然后使用 jQuery 将空的 <span> 附加到每个链接。span 的高度为 1px(类似于下划线),绝对定位在底部向下 1 像素,并具有 100% 的宽度(与链接一样长)。然后,在悬停时,您将 span 的高度动画设置为行高。
$(function() {
var $el = $(),
linkHeight = parseInt($("p").css("line-height")),
speed = 175; // 1000 = 1 second
$("#first a").each(function() {
$el = $(this);
// If the link spans two lines, put a line break before it.
if ($el.height() > linkHeight) {
$el.before("<br />");
}
$el.prepend("<span></span>");
}).hover(function() {
$el = $(this);
$el.find("span").stop().animate({ height: linkHeight, opacity: 0.3 }, speed);
}, function() {
$el = $(this);
$el.find("span").stop().animate({ height: "1px", opacity: 1 }, speed);
});
});
事实证明,这有点有效,但它充满了许多奇怪的问题和跨浏览器不一致。例如,如果链接分成两行怎么办?在这种情况下,span 肯定无法正常工作。所以我尝试通过首先测量链接的高度,如果它高于行高(如果它是两行,则会是这样),然后在它前面插入一个换行符,以便它都在一行上。有效,但它可能会创建一些奇怪的参差不齐的段落。
其他更主要的问题:任何版本的 IE 都无法正确向上动画 span。span 将始终位于文本的顶部,因此它需要具有不透明度才能使文本可读。我尝试将文本包装在 <em> 中并使用 z-index 与之抗衡,但没有用。即使在 Firefox 中,出于某种原因,开始新行的链接也不想工作。
因此,尝试一失败了……
尝试二
在我看来,尝试一最大的问题是多行链接。在尝试思考解决方法时,使用实际的背景链接的属性似乎是最好的方法。
在这种尝试中,我创建了一个红色的大色块作为图像。我将其设置为链接的背景,但使用背景定位将其向下推。我将链接上的溢出设置为隐藏,并将该背景向下推到足以使一小部分显示出来。然后,在悬停时,背景位置会动画化,将其拉回到整个链接下方。
$(function() {
var $el = $(),
speed = 175; // 1000 = 1 second
// SECOND TECHNIQUE
$("#second a").hover(function() {
$el = $(this);
$el.stop().animate({ backgroundPosition: "(0px 0px)", color: "white" }, speed);
}, function() {
$el = $(this);
$el.stop().animate({ backgroundPosition: "(0px 15px)", color: "#900" }, speed);
});
});
此技术的一个问题是不同浏览器如何处理行高。如果我在 Firefox 中将下划线设置为 1px 高,许多浏览器(例如 WebKit)根本不会显示下划线,因为行高显然少 1 像素,因此整个背景图像被隐藏。因此,我在 Firefox 中将其设置为 2px 高,然后 WebKit 将其显示为 1px。不一致,但有效。
这将是一个“完美”的解决方案,除了 IE 7 会对多行链接或开始新行的链接进行修补,从一开始就覆盖整个链接的背景。IE 8 则正确处理了这种情况。
因此,最终,这两个都不完全完美。如果您有此“下划线动画向上成为悬停时的背景”的其他解决方案,请告诉我。
您可以在此处查看演示。
更新
正如一些人建议的那样,我添加了技巧#3,它是#2的改编。链接现在具有 1px 的底部边框(边框颜色和背景颜色匹配),并且背景从更远的距离向上滑动,这应该可以解决 IE 7 问题。
哦,不错。一个 jQuery 挑战:) 如果我成功了会让你知道的:)
实际上,我放弃了:) 我尝试了一些东西,但最终得到了与第二个示例中相同的结果,我认为这是最好的结果。
哈哈!你真烂!
我期待着看到你的解决方案……
很酷的效果。
会尝试:)
我真的很喜欢尝试二的效果 - 看起来非常光滑!
非常性感的效果:)
说实话,我不是很喜欢,我认为它看起来相当俗气,而且不是很流畅。不过我钦佩你的努力,干得好。
当我阅读它时,我认为它听起来很酷。但我同意 Sam 的说法;(有效的)演示只是让它看起来有点业余。不知道为什么。
是的……出于某种原因,它让我想起了 HTML 的口语化时代,当时动画 GIF 和滚动字幕统治着世界,如果可以使用/发现了一个技巧,就必须使用它。话虽如此,客户却喜欢这些东西。因此,我会将此保存到那些我绝对无法说服客户“少即是多”的日子。
在进行了几次快速尝试后,我想不出任何能胜过这两个选项的东西。在我运行的一些测试中,选项#2 似乎最可靠。
我同意 Sam 的说法,这不是一个非常漂亮的效果。也许如果变化足够微妙并且与设计相符。我不认为我将来会找到任何用途的东西。
无论如何,这是一个有趣的实验,我希望今天早上有更多时间玩。肯定要再回来看看。
作为对尝试二的修改,您可以尝试在链接上使用实际的底部边框,完全隐藏背景图像,然后在悬停时将其向上滑动。
使底部边框与背景图像的颜色相同(为了产生错觉),并希望您能够以这种方式避免 Firefox/WebKit 的差异。
仍然不完美,但我认为我应该提出来。
我认为这就是关键。我会在有空的时候试试。
如果这是技巧#3,仅供参考,它在 Chrome 中不起作用。
抱歉,一定是赶上了添加代码的页面。现在工作正常了。请删除此评论和上面的评论。:)
Chrome 对我来说很好。
//题外话:Chris - 当您在缩进的对话中回复时,您在评论中为自己突出显示的部分会丢失。
@Mayo 呃……不是!
虽然在演示中我没有看到它是一个问题,但当我阅读“边框”时,我的第一个想法是盒子模型。
通常边框位于盒子模型外部,但会对页面产生影响,所以带链接的线会占用多 1px,对吧?
如果属实,那么
outline
似乎更合适。——
Gringer
PS:我认为在文章中您是想写“first thought”,而不是“first though”。只多加了一个字母,但却是不同的词 ;-)
【题外话】Chris,你能提供一些关于可用性和可访问性的 CSS 教程吗?先谢谢了。
不错的效果!!!
我知道第一版被归类为失败,但我真的很喜欢透明效果,我认为实心图像块看起来不太好看 :/
我想我会尝试一下,获得相同的效果,但要应用于多行!不过目前我还是想使用向上偏移 1px 的链接 :p
我在一位 jQuery/CSS 高手的博客上看到过这种优雅的实现,但我已经找了半个小时,找不到他的网站。效果完全如你所述,下划线扩展成一个漂亮的圆角盒子。
如果有人知道我在说的哪个网站,我很乐意听听你的消息!
花哨。对于像超链接这样简单的东西,越少越好。接下来是什么,闪烁的背景?!
@Chris – 嗯... 加点声音,那将是**完美的解决方案**。请考虑一下。此致!
如果它是来自第一个 Doom 游戏的音效,那将是完美无缺的!
你的变量前面不需要美元符号。这是什么?$el = $(),
这个变量似乎没有任何意义?
许多开发人员会在任何包含 jQuery 元素集合的变量前面加上“$”。
我在顶部声明它一次,这样我就不必在下面的每个实例中使用 var = 重新声明它。在我看来这很有道理,但如果有更好的方法,请指教。
Austin 是正确的,我喜欢在打算作为一组元素而不是单个值的变量上加上 $。
执行 $el = $() 会不必要地查询 DOM 并返回一个空的 jQuery 对象。由于你在使用它之前就重新定义了 $el,所以这样做没有多大意义。
执行类似 var $el, speed = 175; 这样的操作可能正是你想要的,并且性能会更好。
是的,但你正在声明并将其赋值为空。简单的声明就足够了。
var $el;
太好了,感谢您的澄清。我不知道可以在不赋值的情况下声明变量。我不是一个程序员,你知道的。
那么你可能想阅读《JavaScript,优秀部分》这本书,并了解更多关于 JavaScript 语言的酷炫部分,尽管这本书没有谈论 DOM。
无论如何,这是一个好网站。
是的。有点生硬且分散注意力。特别是当链接跨两行时。
不过很有创意。
我挺喜欢这种效果的,也许是因为使用的颜色显得有点俗气。我认为柔和的色彩可能效果会更好。不过 Chris,这是一个不错的实验,我可以看到一些人会采用它。
Chris,最近一直在讨论链接。我想知道你是如何在悬停事件中让下划线颜色与文本本身的颜色不同的?抱歉,这有点偏题了。
有人在老旧的 IE6 中尝试过这个吗?我在链接上使用 border-bottom,但在 IE6 中查看时它们不会显示。并不是说我担心边框之类的东西,但似乎它对这个效果不起作用。我没有安装 IE6,但不幸的是,人们仍在使用它。
嗨,Chris!
你的脚本有点问题。已访问的链接将以白色显示。
在白色背景上,这是一个不错的效果 :-)
谁能解决这个问题?
当你增大文本大小(使用浏览器“查看”缩放工具)时,方案 #2 会增加链接底部边框的宽度,看起来非常丑陋。
方案 #1 和 #3 则没问题...
很棒的教程... 我会尝试一下的
如果你想彻底疯狂,可以将其与 CSS3 的 background-gradient(参见 http://snook.ca/archives/html_and_css/multiple-bg-css-gradients)功能结合起来,以消除对图像的需求。
你需要设置几个渐变停止级别,这些级别将所需的背景颜色向上/向下移动一定的百分比。
请不要修改我们的链接样式,谢谢。
有趣的东西!当你增大字体大小时,只有方案 #3 效果良好。
使用 easing 插件,这可以为极具吸引力的主导航创建效果。如果我以后尝试一下,我会在这里发布一篇帖子。
有趣的效果,我将研究方案 #3,因为它看起来很有希望。感谢分享。
好的教程,你太棒了
不错的工作,但请记住,你应该始终绑定到 focus 事件。并非每个人都使用鼠标进行导航...
不错的效果创意。不过我不会在所有链接上都使用它。它可以用于一些“号召性用语”链接等。Joe McCann 关于也将其绑定到 focus 事件的观点很好。
是的,方案 e 在 ie6 和 firefox 2 中有效
是的,只有方案 3 在 ie6 和 firefox 2 中有效