我的一些朋友的 乐队 最近经历了一次小规模的成员阵容变更。他们需要更换主页上的照片。我认为在那里做一些稍微互动的东西会很有趣。我们使用了乐队成员的剪影,在鼠标悬停时淡入真实的 фотографии。

可能有很多方法可以做到这一点……这个方法只是突然出现在我的脑海中,我就用了它。这个想法是在一个 div 中使用剪影作为背景图像。然后在该 div 内放置四个图像,所有图像都具有完全相同的尺寸,并突出显示每个乐队成员。默认情况下,这些图像处于隐藏状态。然后在 div 的顶部放置四个绝对定位的区域。这些是鼠标悬停区域/链接。在 jQuery 中,我们监视这些区域的悬停事件,并淡入相应的图像。
HTML
就像我提到的,只是一个 div,里面包含四个图像和四个鼠标悬停区域。所有都具有唯一的 ID 和通用的类名。
<div id="home-photos-box">
<a id="aller" href="#aller" class="home-roll-box"></a>
<a id="neil" href="#neil" class="home-roll-box"></a>
<a id="aaron" href="#aaron" class="home-roll-box"></a>
<a id="scott" href="#scott" class="home-roll-box"></a>
<img src="images/guys-aller.jpg" alt="" id="image-aller" class="single-guy" />
<img src="images/guys-neil.jpg" alt="" id="image-neil" class="single-guy" />
<img src="images/guys-aaron.jpg" alt="" id="image-aaron" class="single-guy" />
<img src="images/guys-scott.jpg" alt="" id="image-scott" class="single-guy" />
</div>
CSS
类名涵盖共性(例如位置样式),ID 涵盖唯一性(特定左侧位置)。
#home-photos-box { float: left; width: 352px; background: url(../images/guys-allblack.png) no-repeat; padding: 334px 0 0 0; position: relative; }
#aller { left: 0; }
#neil { left: 25%; }
#aaron { left: 50%; }
#scott { left: 75%; }
.home-roll-box { position: absolute; z-index: 1000; display: block; height: 334px; top: 0; width: 25%; }
.single-guy { position: absolute; top: 0; left: 0; display: none; opacity: 0; }
jQuery
监视悬停事件,当事件发生时,获取悬停区域的 ID,该 ID 与图像的 ID 相对应,并将其淡入。我们确保在此处使用 .stop() 以防止动画排队,并且我们使用不透明度设置而不是 .fadeToggle(),因为 .fadeToggle() 在鼠标快速移入移出时喜欢进行部分淡入淡出。
$(function() {
var name = "";
$(".home-roll-box").hover(function() {
name = $(this).attr("id");
$("#image-"+name).stop().show().animate({ opacity: 1 });
}, function() {
name = $(this).attr("id");
$("#image-"+name).stop().animate({ opacity: 0 });
});
});
在演示页面上没有看到任何内容……。
可能是您禁用了图像?在我看来工作正常,在 Safari 和 Firefox 中测试。
伙计,添加 return false 以阻止锚点生效,我知道 click 事件没有绑定任何操作,但它仍然很烦人 :p。
不过演示很不错,与这组图像配合得非常好,并且总体来说是一个很棒的想法 :)
之所以没有包含它,是为了让您可以看到井号并确认链接是真实的活动链接。如果您不希望在您的实现中包含它们,请添加它,或将它们更改为 div 而不是锚点链接。
我认为现有的实现很好,并且很有意义。这在逻辑上应该放在一个包含乐队成员信息的页面上,因此单个成员剪影最适合作为链接,这些链接可以被标记为活动或非活动状态,因此当您点击它们时,剪影组下方的 div 可以更新每个成员的个人信息,并突出显示该成员的照片。
通过像 Jamie 提到的那样实现它,此功能将不那么明显。
在 IE(8) 中似乎无法正常工作。
非常棒!像往常一样,Chris,很棒的作品。
在 IE7 中也无法正常工作。
是的,非常棒的想法。在我的 IE 8 中,我悬停的第一个家伙会淡入淡出,但随后效果停止了。
非常棒的想法。
在我的 IE 8 中,它似乎也无法完全正常工作。我悬停的第一个家伙会淡入淡出,但之后就没有了。
反正谁在乎 IE 呢?
尽管 IE 很烦人,但每个设计师仍然应该关注它。简单地说“反正谁在乎 IE 呢?”并不会突然让所有那些 IE 用户消失,并且仍然有很多这样的用户。
同意,此外,它在 IE8 中也无法正常工作。
我不理解关于 IE 的评论。
我维护着 2 个非技术性的网站,如果我不再支持 IE,那么这些网站也可能被关闭,没有多少其他网页浏览器用户访问这些网站,总计不到 25%。不管喜欢与否,IE 都是许多非技术领域的主要浏览器。
演示在我的 IE7 中也无法正常工作,这是我大部分时间都在使用的浏览器,我想这是一种习惯。
Al
.
我同意 Al 的观点,
虽然我不喜欢 IE 的古怪特性,以及大多数样式实现需要一些额外的 hack 和修复才能在 IE 中正常工作的事实,但不可否认的是,它是一个主要的浏览器。
在我维护的最繁忙的网站上(平均每天有 1,000 次独立访问),排名前三的浏览器是
IE – 71.78%
Firefox – 15.17%
Safari – 10.49%
Chrome 的使用率仅为 1.74%,其他所有浏览器的使用率加起来不到 1%。
因此,完全拒绝支持 IE 根本不可行,尤其是在面向主流受众的电商网站中。
这个演示在 IE7 中无法正常工作的事实有点破坏了文章的意图,对不起,Chris。
如果效果在 IE 中无法正常工作,或者至少在 IE7 和 IE8 中无法正常工作,我不会使用它,IE6 不那么重要。我确实注意到在我的网站统计数据中,IE8 的使用率正在超过 IE7,可能是 Windows 7 的影响。
Al
只想告诉你我会怎么做。
从包含所有剪影的背景图像的 div 容器开始。
然后在内部放置四个包含图像的 div。图像的不透明度将设置为 0,直到鼠标悬停在 div 上。
假设我的容器的 id 为“container”。我现在可以使用 jquery 函数:
$('#container div img').hover();
,并且每个图像在鼠标悬停时都可以淡入或淡出。无需为内部 div 指定 id,并且更容易扩展。感谢您创建这个很棒的网站,
我已经来这里一个月了,我发现它非常有用!
Chris
听起来不错 –
但是您能否提供一个链接
到您版本的一个简单的演示页面?
谢谢!
SFdude
太酷了!!!
非常棒的想法,Chris,我迫不及待地想尝试一下!
这很酷.. 我真的开始喜欢 jQuery 了,我可能会在 Flash 中或仅使用标准的鼠标悬停效果来实现这一点,但不是使用 jQuery,它可以在不使用 Flash 等的情况下获得所需的效果。感谢您的教程,它肯定会有用。
我喜欢这音乐。告诉他们他们获得了一位新粉丝。
(剪影效果也很酷,但您已经让我成为了粉丝 :) )
很棒,Chris!我正在从事一个新的项目,这个效果非常适合 :)
话虽如此,它在 IE7 或 IE8 中似乎无法正常工作。只有一个乐队成员会淡入,并且他们只会执行一次。
你能说这是完美的时机吗?我过去两天一直在尝试找到一个好的方法来实现这个效果,但都没有成功。
谢谢Chris!
类似这样的效果用Flash实现会更好更容易。不过,这确实是一个很酷的效果。
我认为,关键是要用CSS而不是Flash来实现。所以才会有CSS-Tricks。
我认为人们过于依赖Flash来实现各种功能,这导致网站变得沉重且混乱。幸运的是,jQuery和Mootools等JS库的兴起,大大减少了在我的手机上无法访问的网站数量!
是的,当然。为此你需要以下条件:
1. 作为开发者,需要Flash许可证(否则你如何开发?)
2. 作为访客,需要Flash插件
3. 作为访客,需要良好的带宽
4. 作为移动用户,需要一台电脑在手边
你的第四个论点是无效的。大多数手机都没有配备JS渲染引擎。我的意思是,除了市场上更新的智能手机之外,大多数手机仍然安装着过时的浏览器,它们只能渲染HTML(以及WAP等)和图片。
但我完全同意你的观点。我认为在大多数情况下,尤其是在这种情况下,JS比Flash更好。
@bjerh
所以,你认为这个论点无效是因为有些人还在使用他们1999年的诺基亚砖头手机?你会承认现在支持JS的手机比支持Flash的手机多,对吧?这似乎使它成为一个有效的论点。
无论如何,如果你查看一些分析数据,你会发现很多人现在都在使用这些叫做iPhone的东西。我认为那个来自Dodgeball的家伙制造了它们。
我同意你最近的智能手机配备了现代化的浏览器,包括JS支持。FlashLite已经支持了多久我不知道。但事实是,并不是每个人都拿着iPhone。或者Palm。例如:诺基亚仍然是手机市场上最大的参与者。除了他们令人作呕地昂贵的超级智能手机之外,他们的大多数手机在渲染HTML方面都装备不足,更不用说运行JS代码了。除非你在过去几年里购买了一部新手机,否则你的手机很可能没有良好的JS/Flash(非精简版)支持。
将鼠标悬停在他们身上让我想要点击他们并获取更多关于每个人的信息。此外,出于品牌目的,让他们以乐队形式出现而不是剪影形式出现是否更好?仅供参考。
你提出了一个有效的观点。这确实是一个非常棒且简单的效果。但是,为什么你不想在他们第一次加载主页时看到他们呢?也许如果这个效果是在乐队简介页面中完成的,然后当你点击每个成员时,你会看到关于该成员的具体信息,或者类似的东西。只是一个想法。
绝对是一个有效的观点。一方面,这种神秘感很有趣,实际上可能效果更好。另一方面,没有看到他们所有人的脸可能会有点让人遗憾。他们的整个网站现在正在审查中,我同意我认为这种效果可能更适合在个人传记风格的页面上使用。
有没有办法让所有四张图片在预定的时间长度后自动淡入?
这样,当用户第一次到达时,他们可以随意将鼠标悬停在剪影上,但他们仍然有机会看到整个乐队?
当然……你可以根据JS的setTimeout()调用淡入逻辑。
哦,这很不错……
不错的技巧
name = $(this).attr("id");
$("#image-"+name)
很高兴知道!
很酷的效果。
不过我有一个问题,我意识到这可能有点跑题了,但它与悬停效果有关,所以我还是在这里发布了。
在jQuery中,有没有办法触发CSS的:hover事件?我知道你可以触发JS的事件,但我现在的情况是,我在CSS中定义了锚点的普通样式和悬停样式,并且我试图在某个操作中将锚点的样式更改为与:hover事件匹配。
目前,我只是将相关的CSS粘贴到.css()命令中,但如果我更改了样式表,更新起来很麻烦。有没有更优雅的解决方案?
是的,添加类名并在悬停事件中移除它们,然后在CSS中为这些类名设置样式。
这看起来太棒了!很棒的文章,Chris。
乐队在他们的网站上只放一张乐队图片的情况很少见,所以我认为不公平地立即否定这个想法。
我同意这可能不适合作为乐队的主要“特色”图片,但它肯定可以在很多其他地方发挥很好的作用(比如前面提到的简介页面)。
再次感谢Chris提供了更多很棒的内容!
这真是一个非常棒的效果!看起来太棒了!
今天我完成了网站的一个部分,并考虑使用这种淡入技术!
你的方法很简单,易于理解,而且看起来我能够轻松地将其应用到我的需求中。非常感谢Chris,很高兴看到你的网站恢复了。
很酷的效果……我能想到很多使用它的方法……而且可能会用到。所以谢谢!
演示无法工作……我使用的是FF 3.5.5。
我喜欢班卓琴在剪影中看起来像巨大的、模糊的靴子。
演示无法工作;(
Mac OS 10.5.8 … Safari 4.0.4
此致
Rata
奇怪:P
第二次重新加载后它可以工作了……非常棒!
此致
Rata
我很好奇你为什么决定将图片放在锚标记之外。我会将它们放在里面并执行以下操作:
$(function() {
$(“.home-roll-box”).hover(function() {
$(this).children(‘img’).stop().show().animate({ opacity: 1 });
}, function() {
$(this).children(‘img’).stop().animate({ opacity: 0 });
});
});
这样,HTML中的标记和JS代码都会减少。
因为锚标记,即.home-roll-box,只有整个div的1/4大小,并且位置特殊。如果图片是锚标记的子元素,则需要另一组规则将它们重新定位到适当的位置,每个图片都不一样。我不确定这样做有什么好处。
我当时的想法是,每个淡入图片都只包含一个人,没有剪影。如果是这样,并且没有重叠,你就可以将图片放在锚标记中并定位锚标记。
但是,由于存在一些重叠,并且在IE6中处理不透明度非常麻烦,所以我完全赞同你这样做。 :)
Chris,你有可能考虑使其兼容IE吗?
我真的很喜欢这个效果,尽管我认为代码可以更简洁一些(就像这里和那里建议的那样)
为什么不尝试使其兼容IE,而不是让Chris去做?付出而不是抱怨。
我第一次在Doomtree的网站上看到这个效果,效果非常好 - http://www.doomtree.net/about/
它在FF 3.5.5中运行良好!
超级酷的效果 - 并且对你朋友的实现很棒!
大家好 —
我想我已经修复了IE的问题。请告诉我。
酷,文章,感谢你让我认识了一个很棒的乐队!
大家好!
Chris,我简化了你的版本,并在IE 6和7、Firefox、Opera和Chrome中进行了测试。此外,对于JQuery,我使用了fadeIn和fadeOut函数,没有使用特殊的CSS。
查看一下:http://www.boriskuzmic.com/jquery/rollovers.html
这很酷,但你没有使用.stop(),这意味着动画会非常快速地排队多次鼠标悬停。然后,如果你确实使用了.stop(),你就会遇到fadeIn/Out无法恢复到完整值的问题,这就是我使用不透明度动画的原因。
我真的很努力地想找到一种方法,可以在不使用stop或以某种更智能的方式使用它的情况下完成一个完整的动画循环。
https://css-tricks.cn/examples/jQueryStop/
唯一一个能够很好地完成完整循环的是顶部的示例,其他的要么没有完成完整的循环,要么很卡顿。
我尝试过使用动画结束后执行的回调函数。
这是对你的测试页面上的第一个示例起作用的解决方案)
我将其添加到演示中,但它仍然在排队动画。
这是我最新的尝试
代码行
var inAnimation = new Array();
应该在$(function())之外,在全局作用域中。
我将其移到了外面,但这没有任何区别。它是在使用它的任何函数之外声明的,以便它们都可以访问。问题在于排队。
是的,你说得对。我昨天在家里的Xubuntu上的Firefox中测试过,看起来更好,但现在我在Windows上看,效果不太好。
但你的最后一个解决方案效果很好。所以,继续努力。
也许我以后会尝试一下——用不同的方法。
这是一个更好的解决方案
http://www.boriskuzmic.com/jquery/rollover_effect.html
为什么不为此使用图像地图呢?
很棒的演示,正是我想要的……
我想用它来制作一些包含国家的地图,但我也想给这些区域命名。
如果乐队的名称也能显示出来,就像一个菜单一样,那就太好了,如果你悬停在乐队的剪影上,名称就会高亮显示。(如果悬停在名称上,剪影也会显示出来,那就太好了。)
……Johnny:我认为图像地图也是可能的,但会增加更多工作,而且可能不太聪明。这是一个CSS技巧网站,图像地图不必只使用CSS,还可以使用Java Script。
Christ,我知道这有点偏题,但你有没有关于如何创建好的剪影(从选择好的图像/表单到剪影,再到实际创建剪影的过程)的好的教程或资源?我之所以这么问,是因为我一直在这方面遇到麻烦。
我只是在Photoshop中打开了照片,拿出了钢笔工具,然后用新的矢量路径仔细地描绘了整个乐队。
如果你想了解更多信息,我在旧的存档中录制了一个关于剪切路径的屏幕录像=)
在这里找到它
https://css-tricks.cn/video-screencasts/22-cutting-clipping-paths/
谢谢,因为我之前没有说=)。
我在上班,使用IE7,是的,演示工作正常。
很巧妙的技巧,给了我一些想法。谢谢!
很好的文章。
但是,我必须礼貌地说,我不喜欢这个特定的东西。虽然它不是导航,但它让我想起了“神秘肉”。
很棒的教程,非常有用。谢谢。
大家好
我在Firefox上工作,演示运行良好。但在IE 6中无法运行。
很棒的技巧。
好的,它已修改,感谢Css-tricks
和 bkuzmic
大家好!
我已经修复了动画效果的排队问题
再次查看演示
http://www.boriskuzmic.com/jquery/rollovers.html
我知道我最终会找到它!澳大利亚乐队The Cat Empire的网站上有一个类似的效果。你可以在这里查看它,…
http://www.thecatempire.com/home.aspx
与CSS无关……但我知道这个乐队的新贝斯手。你永远不知道你会发现什么!很棒的效果和教程。
谢谢。
Dennis