以下是来自Alex Young (@the_alexyoung) 的客座文章。 Alex 创建了一种简单的技巧,只需隐藏和显示从不同角度拍摄的多个叠加照片,即可“旋转”照片的主题。 尽情享受!
网页设计师和开发人员总是以有趣且引人入胜的方式与我们互动,这让我们着迷。 我喜欢发现这些设计师/开发人员想出的新技巧。 我特别感兴趣的一种技巧是在Warby Parker 的网站上看到的。 他们能够创造出一种很酷的效果,模型跟随用户的鼠标,展示镜框的不同角度。
我看到这种技巧主要用于展示太阳镜,但我对你们想出其他现实世界中的应用感到好奇。
在我们开始之前,您需要一些东西。 确切地说,是七样东西。 您将需要从七个不同角度拍摄的七张照片。
HTML 设置
我们正在设置一个名为“faces”的容器,然后创建一个区域,我们将在其中显示照片——“face-area”。 我们还有一个div
来容纳七张单独的图像。
<div id="faces">
<div id="face-area">
<div id="image-1" style="display: none;">
<img src="/images/look-left-3.jpg">
</div>
<div id="image-2" style="display: none;">
<img src="/images/look-left-2.jpg">
</div>
<div id="image-3" style="display: none;">
<img src="/images/look-left-1.jpg">
</div>
<div id="image-4" style="display: none;">
<img src="/images/look-center.jpg">
</div>
<div id="image-5" style="display: none;">
<img src="/images/look-right-1.jpg">
</div>
<div id="image-6" style="display: none;">
<img src="/images/look-right-2.jpg">
</div>
<div id="image-7" style="display: none;">
<img src="/images/look-right-3.jpg">
</div>
现在我们将创建一个div
,它将完全按照其名称暗示的那样工作。 它将放在另一个div
的顶部。 我们可以将此div
分成 7 个小列,并在其上平均分配。 这 7 列将用于监听鼠标何时悬停在特定列上。 在每个div
中添加“data-number”将允许我们稍后在 jQuery 中引用每个div
。
<div id="the_faces_overlay">
<div class="the_faces" data-number="1"></div>
<div class="the_faces" data-number="2"> </div>
<div class="the_faces" data-number="3"></div>
<div class="the_faces" data-number="4"></div>
<div class="the_faces" data-number="5"></div>
<div class="the_faces" data-number="6"></div>
<div class="the_faces" data-number="7"></div>
</div>
</div><!-- END #face-area -->
</div> <!-- END #faces -->
CSS 设置
大多数 CSS 都是不言自明的。 我需要提一点很重要的事情,确保这 7 列完美地跨越div
的span
相互配合。
body {
background: #333
}
#faces {
height: 333px;
width: 500px;
margin: 0 auto;
border: 8px solid white;
}
#face-area {
height: 500px;
width: 333px;
position: relative;
}
#the_faces_overlay {
position: absolute;
width: 500px;
top: 0;
left: 0;
}
#faces .the_faces {
height: 333px;
width: 14.2857143%;
float: left;
margin: 0;
padding: 0;
}
jQuery 设置
我们需要监听每列何时被悬停。 这就是“data-numbers”派上用场的地方。 如果我们想在将来添加更多列,我们就不必再添加任何 JavaScript 了。
// Reveal the "center" image
var centerImage = $("#image-4").show();
// Bind hovers to each column
$(".the_faces").each(function() {
$(this).on("mouseover", function() {
$("#image-" + $(this).attr("data-number")).show();
}).on("mouseout",function() {
$("#image-" + $(this).attr("data-number")).hide();
});
});
// Reset center image
$("#face-area").on("mouseleave", function() {
centerImage.show();
}).on("mouseenter", function() {
centerImage.hide();
});
好了!
Check out this Pen!
有了! 现在您有了自己的转头模型。 用它来展示您自己的产品。 这有很多用途。 告诉我您想出什么。
编辑注: 这是一个有趣的工作示例,可以添加触摸支持,不是吗? 跟着滑动或类似的东西。
非常棒,Chris,我喜欢简单易懂的 javascript 来让一切正常工作。
如果我们可以添加一些代码来检测中心图像,那就很酷了。
不错的效果。
为了简化 HTML,ID 和内联样式可以应用于图像本身,而不需要围绕每个图像使用 div。 我认为,这些 div 在这里是不必要的标记。
我想知道你是否也可以做一些聪明的事情,比如跟踪鼠标在父 div 上的位置,并根据鼠标位于图像的哪一部分来确定要显示哪个图像。 与这里显示的原理相同,但可能再次允许删除更多实际上只是为了帮助视觉效果而存在的空 div。
我实现了我的建议(对不起,Chris,我使用 JSFiddle >.<)
http://jsfiddle.net/dilapper/BQjBm/
有效地删除了用于悬停事件的所有标记,并计算出鼠标所在的图像段,并加载相应的图像。 我的变量名有点可疑,我的一部分想知道是否有更简洁的方法来进行数学运算,但它确实有效!
@Eduardo:仅 CSS 很酷
@David:http://jsfiddle.net/jsdev/X2y9f/2/
缓存的 jquery 对象,如果只是顺序的话,不需要 id 属性。 利用 .eq()
很棒。
我想我会用一种略微不同的方法来尝试一下
http://codepen.io/JTParrett/pen/AlEgF
它可以工作,但在 Chrome 26 中,图像每次更改时都会闪烁,这非常不理想。
确实如此。 我只是添加了一些简单的图像预加载。 有没有好一点?
另一种方法。 找到光标位置以应用于相应的背景图像:http://codepen.io/JTParrett/pen/bHqjp
那个*
更好。 现在您只需使用 AJAX 预加载图像即可。
谢谢,哥们:D
我刚刚对 pen 进行了一些更新。 你能告诉我加载是否看起来更好,并告诉我我是否正确地做到了吗? 我对 ajax 东西还比较陌生:P
我之前解决过类似的问题。
很高兴听到你们的意见(我不是专业人士)
http://codepen.io/ahoiii/pen/yraze
Touchswipe 插件 (http://labs.rampinteractive.co.uk/touchSwipe/demos/) 应该很乐意为以触摸为中心的界面提供服务。
我可能会玩玩这个。
很酷的效果。 我还没有花太多时间研究它,但它看起来可能可以清理一下以使用更少的标记。 另外,JavaScript 可以更有效率和更容易阅读,并且应该使用 $.data 来获取数据属性
另一种方法可以帮助防止某些浏览器中的“闪烁”问题,那就是使用绝对定位和 z-index 来显示/隐藏图像
http://codepen.io/anon/pen/IsBHG
权衡:这种方法最适合使用小尺寸轻量级图像,因为您需要等待图像加载。
唯一使用 CSS 的方法
http://jsfiddle.net/coma/BZajk/11/
太棒了,伙计!
喜欢! 非常棒。 语义标记也是。 当然,它可能无法在 IE8 或更低版本、Opera 或 Android 浏览器中使用……但无论如何,它是一个不错的解决方案。
做得好。
Eduardo,你的方法好了一百倍。 此演示中的代码教人们如何编写不可重用的 js,并在其中到处使用硬编码的 ID,而你的方法适应性强且更通用,干得好。
哇!谢谢大家!这是我在这里的第一个评论!
这是当之无愧的认可。
我在阅读这篇文章时想知道,这是否可以用 HTML 和 CSS 仅实现,而 Eduardo 证实了这一点。很棒的工作!
这太棒了!我想要尽可能避免使用 JS。
感谢分享。
Eduardo 干得好。继续评论! ;)
在 Chrome 中闪烁,但这有效 http://jsfiddle.net/coma/BZajk/11/
喜欢这个反馈!还有什么其他用途?
另外,感谢您对这一点的所有改进。一直在寻找新的和更好的做事方式。
不确定这是否是一种不同的用途(这是一个激进的变化),但第一个想到的是用用户引导的交换替换轮播。在这种情况下,我建议使“选择”div 变得明显;有标签,并且不会遮挡图像。这样做的好处是它将消除轮播自动加载的烦恼。
惊人的效果……如果我们使用透明的 gif 或 png,主体放置得很好,并且使用 CSS3 过渡,我们可以实现类似 3D 的效果……很巧妙的技巧!
正如已经在 Twitter 上讨论的那样,可以通过使用更语义化的 HTML 来大幅改进它,并允许 JS 做它最擅长的事情 - 为我们计算东西 - 在这种情况下是鼠标位置,并查看要显示哪个图像。我正在制作一个屏幕录制来解释主要问题,但这里有一个简单的 vanilla 演示,它适用于键盘、鼠标和触摸设备(在 Firefox 和 Chrome 中的 Android 上测试过)http://vanillawebdiet.com/demos/imageswivel/index.html 。闪烁问题也消失了,这不仅是预加载问题,而且在移动鼠标时还有太多事件处理程序和 DOM 交互。
已完成写作:http://christianheilmann.com/2013/05/17/giving-image-swivel-the-vanilla-web-diet-treatment/
谢谢,但我觉得这可以用纯 HTML 和 CSS 来实现,不需要 jQuery。
很酷的效果!对于珠宝或雕塑画廊来说,这将是一个很棒的应用程序。谢谢!
Eduardo = 天才
向你致敬 +1
我想知道这是否可以用 CSS 过渡来实现,使其看起来更流畅。
如答应 Alex 的,这里有一篇长篇文章和 25 分钟的屏幕录制,解释了演示代码的性能和维护问题,以及如何在没有任何库依赖的情况下重写它,并且在更改 HTML 时具有键盘和触摸支持,同时完全可维护:http://christianheilmann.com/2013/05/17/giving-image-swivel-the-vanilla-web-diet-treatment/
很巧妙的东西。我以前见过类似的东西,没有 jQuery,使用在 onmouseover 事件上触发的普通 javascript 函数。我想知道它在图像数量加倍时会是什么样子,以获得更流畅的效果。也许这可以通过使用视频素材而不是静态照片更好地实现,从中可以提取单个 jpeg 帧。