大家好,我是 Liam Goodacre,Chris 让我写一篇关于如何实现渐变悬停效果的简短 jQuery 教程。我将演示如何执行颜色和图像混合。我们将使用 jQuery 和 jQuery 颜色插件。
当我第一次编写类似的东西时,我设置了一个背景 div,在鼠标悬停时淡入,在鼠标离开时淡出。我发现,如果我快速地将鼠标移入和移出链接,背景会闪烁与我的鼠标移动次数相同的次数。然后我告诉动画在设置新动画之前停止,这解决了问题,但又产生了一个新的问题。
新问题:如果我进行相同的测试(重复鼠标悬停),那么链接的鼠标离开状态会慢慢地看起来与悬停状态相同,因此背景在几次之后停止淡出。我注意到 Chris 的网站上也有同样的问题。
然后我有了个想法;在鼠标悬停时,如果我停止当前动画,并将背景重置为不可见,然后淡入,而不是从其当前状态开始淡入。这似乎解决了问题。
好的,让我们开始吧……
我们需要一个包含两件事的 div;一个锚元素和另一个 div,我将将其称为 subDiv。subDiv 将显示在鼠标悬停时淡入的图像。锚元素将覆盖 subDiv 并具有透明背景。
HTML 代码
我们将使用 jQuery 动态地将 subDiv 添加到 div 中,以减少我们需要编写的 html 代码量。当有多个这样的链接时,这很有帮助。
这是我们目前的 html 代码……
<div class="hoverBtn">
<a href="https://css-tricks.org.cn/">Go to CSS-Tricks</a>
</div>
我们有一个类名为 hoverBtn 的 div,其中包含一个指向 CSS-Tricks 的链接。
CSS 代码
div.hoverBtn {
position: relative;
width: 100px;
height: 30px;
background: #000 url(your_background_image.png) repeat-x 0 0 scroll;
}
div.hoverBtn a {
position: relative;
z-index: 2;
display: block;
width: 100px;
height: 30px;
line-height: 30px;
text-align: center;
color: #000;
background: transparent none repeat-x 0 0 scroll;
}
div.hoverBtn div {
display: none;
position: relative;
z-index: 1;
width: 100px;
height: 30px;
margin-top: -30px;
background: #FFF url(your_hover_image.png) none repeat-x 0 0 scroll;
}
subDiv 现在位于锚元素下方,我已将背景图形应用于 div 和 subDiv。
JavaScript 代码
我将假设您对如何使用 jQuery 有基本的了解,尽管即使您没有,代码也几乎不言而喻。
这是我们的起点……
//when the dom has loaded
$(function(){
});
我相信你们大多数人都完全意识到,在这两行代码中编写的任何代码都将在 DOM 加载完成后立即运行。
现在我们需要添加 subDiv。我们可以使用 jQuery 对象的“append”方法来实现。
//when the dom has loaded
$(function(){
//display the hover div
$("div.hoverBtn").show("fast", function() {
//append the background div
$(this).append("<div></div>");
});
});
我将“append”包装在 show 方法的回调中,以便我们可以使用“this”来引用每个 div.hoverBtn 元素。
现在我们需要编写链接的悬停事件代码。我们将使字体颜色淡入淡出,因此我们应该指定一个悬停颜色。我们还可以使用“rel”属性来存储每个锚元素的初始颜色。这对于不同颜色的链接很有用。
var hoverColour = "#FFF";
//when the dom has loaded
$(function(){
//display the hover div
$("div.hoverBtn").show("fast", function() {
//append the background div
$(this).append("<div></div>");
//on link hover
$(this).children("a").hover(function(){
//store initial link colour
if ($(this).attr("rel") == "") {
$(this).attr("rel", $(this).css("color"));
}
//fade in the background
$(this).parent().children("div")
.stop()
.css({"display": "none", "opacity": "1"})
.fadeIn("fast");
//fade the colour
$(this) .stop()
.css({"color": $(this).attr("rel")})
.animate({"color": hoverColour}, 350);
},function(){
//fade out the background
$(this).parent().children("div")
.stop()
.fadeOut("slow");
//fade the colour
$(this) .stop()
.animate({"color": $(this).attr("rel")}, 250);
});
});
});
所以基本上,发生的事情是;
- 声明一个悬停颜色
- 当 DOM 加载完成后……
- 将一个 subDiv 附加到 hoverBtn div
- 在链接的悬停事件上
将初始颜色存储在链接的 rel 属性中
停止 subDiv 的动画
将其隐藏,然后设置为淡入
停止链接的动画
重置其颜色并设置为淡入悬停颜色 - 在悬停事件的回调中
停止 subDiv 的动画
然后将其设置为淡出
停止链接的动画
然后将其设置为淡入其初始颜色
进一步开发
您可以尝试通过动态加载包含的 div 来改进这一点。这可能还涉及将包含的 div 的大小设置为锚元素的大小。
Liam,在我看来真的很棒,我正在尝试更多地了解 jQuery,这似乎是替代其他库的一个不错的途径,我可能会在我的博客上实现它,或者像你说的那样进行实验。
我非常喜欢这个教程。感谢 Chris 和 Liam!为了分享,我想分享一个具有额外功能的类似教程——它允许在最终用户未启用 JS(谁会这样做?)的情况下使用 CSS 精灵作为备用方案。Dave Shea 在 A List Apart 上写过这个想法——自己查看一下!
我在网上找到了多个教程,这是最简单、最容易理解的。感谢 Chris 和 Liam!
如果菜单中的链接具有这种漂亮的渐变效果,为什么侧边栏上的搜索按钮缺少渐变?我认为新的设计在没有这种细微的不一致的情况下会感觉更好。
非常棒的教程。易于理解,最终产品值得付出这个过程。现在我需要弄清楚如何将它应用到我的 WordPress 博客中……有什么提示吗?
查看演示文件时,我第一次将鼠标悬停在第一个链接上时,它的悬停状态保持白色。第一次之后就消失了。很奇怪。我不知道我是否有任何奇怪的东西(XP/FF3)。感谢发布!
@Jesse
我看到了同样的问题。我在 Mac 上使用 FF3。在 Safari 上我没有看到白色。
很棒的文章 Liam。我唯一的问题是为什么你使用“rel”属性来存储颜色?除了这一点,你的标记非常语义化。为什么不使用 jQuery data 函数,如下所示
// 存储
$(this).data('color', $(this).css('color'));
// 检索
$(this).css('color', $(this).data('color'));
感谢大家的评论!
@Gaber
抱歉,我目前没有 WordPress 的经验,但我很快就会有,所以可能需要等一下再回复你。
@jesse & @Benjamin
我也刚刚注意到这一点,它似乎只发生在在线示例中,在我的桌面本地运行时没有显示白色块……很奇怪,我会调查一下为什么会这样。
@brad dunbar
啊,很有趣,我使用 rel 属性是因为 Chris 一直在使用它,所以我只是采用了这种方法。我之前没听说过 jQuery 有一个 data 方法,我以后会使用它,谢谢。我可能还会通知 Chris 修改教程,以便其他人也能从中受益。
——Liam
非常感谢,我希望你能做一个关于侧边栏中包含热门帖子和特色帖子的选项卡的教程,我非常喜欢它们,我无法弄清楚你是如何做到的。
很棒的教程,非常感谢,对 jQuery 库有了更好的理解。
太棒了,我上周才在我的网站导航中使用了它。绝对是未来趋势。
@oshouip,不确定Chris是否是这样实现的,但可以尝试查看jQuery的scrollTo和localScroll插件。
大家好!这个新菜单看起来非常棒。我对jQuery有一个普遍的问题。我注意到,当我在IE中打开我的网站时,它总是显示一些关于使用jQuery的警告弹出窗口。为什么会发生这种情况?为什么在你那里没有发生?谢谢!
感谢Chris和Liam,非常有趣。我以后一定会尝试一下。@oshouip,Chris在NETTUTS上有一个关于侧边栏的教程。点击
这里阅读文章。希望对您有所帮助。
@Gaber 对于WordPress,您应该使用WordPress的特殊函数从其自己的库中包含jQuery。然后在WordPress中,您应该在JavaScript中使用“jQuery”而不是“$”。查看关于此的教程
感谢这个很棒的jQuery菜单。我已经下载了它,并将把它用在我的新项目中。 :)
不错的菜单。但可惜它是用jQuery而不是Prototype或MooTools。
它让我想起了那些可怕的Frontpage风格的Java驱动的按钮。
它绝对不是未来……
不错的菜单,不确定我会不会使用它,但总体来说还不错。
伙计,感谢你提供如此具有解释性的教程,以及Liam提供的帮助说明!!!
请继续提供jQuery教程……
大家好。我已经让Matthew的建议运行得相当好了(感谢Matthew),但我的知识再次让我有些沮丧。在我的<ul>的初始状态下没有背景,我希望它淡入一种颜色,然后在鼠标移出时淡回无色,而不是淡入另一种颜色。有没有人对如何实现这一点有任何建议?
有没有人可以使其在没有JS的情况下优雅降级?
@kidvector,
我认为在这种情况下你只需要动画化opacity属性。
谢谢,好文章。
你好
我正在尝试将你的JS与手风琴菜单JS一起使用,但我无法使其工作。悬停效果可以工作,但手风琴菜单无法打开。
我已经尝试了几种方法,但都没有成功。如果你能指点我正确的方向,我将不胜感激。
我也无法使其工作。
很棒的工具,但它似乎每次访问页面时都无法完全加载。有时只有背景时间的上半部分加载。有什么想法可以使其加载更快并完整吗?