图片/图形

仿Apple TV海报背景视觉差特效

阿里云

这是一款效果非常炫酷的 jQuery 和 CSS3 仿 Apple TV 海报背景视觉差特效。该视觉差特效在使用鼠标在屏幕上下左右移动的时候,海报中的各种元素就会以不同的速度运动,形成视觉差效果,并且还带有一些流光特效。

HTML 结构

Apple TV 是由苹果公司继 Airport Express 之后推出的一款高清电视机顶盒产品。如果你曾经使用过,一定会被其中的炫酷电影海报视觉差特效所吸引。该视觉差特效的 HTML 结构使用一个<div>作为容器,在它里面的每一个<div>都是一个“层”。

也想出现在这里?联系我们
创客主机
  1. <div class="poster">
  2.   <div class="shine"></div>
  3.   <div class="layer-1"></div>
  4.   <div class="layer-2"></div>
  5.   <div class="layer-3"></div>
  6.   <div class="layer-4"></div>
  7.   <div class="layer-5"></div>
  8. </div>

<div .shine>是用于制作流光效果的图层。

CSS 样式

为了使包裹元素.poster 制作出 3D 旋转效果,它的父元素需要设置透视和 transform-style。

  1. body {
  2.   background: linear-gradient(to bottom, #f6f7fc 0%,#d5e1e8 40%);
  3.   transform-style: preserve-3d;
  4.   transform: perspective(800px);
  5. }

这里的海报大小设置为固定的 320x500 像素,相对于页面居中,为它制作圆角效果和一些阴影效果。

  1. .poster {
  2.   width: 320px;
  3.   height: 500px;
  4.   position: absolute;
  5.   top: 50%; left: 50%;
  6.   margin: -250px 0 0 -160px;
  7.   border-radius: 5px;
  8.   box-shadow: 0 45px 100px rgba(0, 0, 0, 0.4);
  9.   overflow:hidden;
  10. }

海报的居中采用的是绝对定位居中法:left 和 top 分别为 50%,然后设置 margin-left 和 margin-top 为负的宽度值和高度值。海报中所有的“层”可以通过 div[class*="layer-"]选择器来选择。所有的图层都被设置为绝对定位,背景图片不重复,background-position 设置到左上角位置,背景的大小设置为 100%的宽度和自动高度。

  1. div[class*="layer-"] {
  2.   position: absolute;
  3.   top: -10px;
  4.   left: -10px;
  5.   right: -10px; 
  6.   bottom: -10px;
  7.   background-size: 100% auto;
  8.   background-repeat: no-repeat;
  9.   background-position: 0 0;
  10.   transition:0.1s;
  11. }

注意上面代码中的 top,left,right 和 bottom 属性的值都是-10 像素。它们用于使图层的尺寸比海报的尺寸大 20 像素。这样做的原因是在产生视觉差效果是可以隐藏图层的边部。最后为每一个图层设置背景图片。

  1. .layer-1 {
  2.   background-image: url('images/1.png');
  3. }
  4. .layer-2 {
  5.   background-image: url('images/2.png');
  6. }
  7. .layer-3 {
  8.   top: 0; bottom: 0;
  9.   left: 0; right: 0;
  10.   background-image: url('images/3.png');
  11. }
  12. .layer-4 {
  13.   background-image: url('images/4.png');
  14. }
  15. .layer-5 {
  16.   background-image: url('images/5.png');
  17. }

JavaScript

该视觉差效果的原理是每次用户移动鼠标是时候,.poster 的 transforms: translateY、rotate 和 rotateY 属性将根据鼠标的位置发生变化。鼠标距离左上角越远,动画可见的区域就越多。计算的公式类似于 offsetX = 0.5 – 鼠标位置 / 窗口的宽度。为了给各个层不同的动画速度,这里需要在乘以一个自定义的动画速率值,这个值由 HTML 标签上的 data-offset="number"提供。

  1. <div data-offset="-2" class="layer-1"></div>
  2. <div class="layer-2"></div>
  3. <div data-offset="1" class="layer-3"></div>
  4. <div data-offset="3" class="layer-4"></div>
  5. <div data-offset="10" class="layer-5"></div>

data-offset 的值越大,可见的动画区域就越大。
整个视觉差效果的 JS 代码如下:

  1. var $poster = $('.poster'),
  2.   $shine = $('.shine'),
  3.   $layer = $('div[class*="layer-"]');
  4.  
  5. $(window).on('mousemove', function(e) {
  6.   var w = $(window).width(), //窗口宽度
  7.     h = $(window).height(), /窗口高度
  8.     offsetX = 0.5 - e.pageX / w, //鼠标X坐标
  9.     offsetY = 0.5 - e.pageY / h, //鼠标Y坐标
  10.     dy = e.pageY - h / 2, //@h/2 = 海报容器中心
  11.     dx = e.pageX - w / 2, //@w/2 = 海报容器中心
  12.     theta = Math.atan2(dy, dx), //鼠标和海报中心的RAD角度
  13.     angle = theta * 180 / Math.PI - 90, //转换 rad 为 degrees
  14.     offsetPoster = $poster.data('offset'),
  15.     transformPoster = 'translateY(' + -offsetX * offsetPoster + 'px) rotateX(' + (-offsetY * offsetPoster) + 'deg) 
  16.                        rotateY(' + (offsetX * (offsetPoster * 2)) + 'deg)'; 
  17.  
  18.   //get angle between 0-360
  19.   if (angle < 0) {
  20.     angle = angle + 360;
  21.   }
  22.  
  23.   //gradient angle and opacity
  24.   $shine.css('background', 'linear-gradient(' + angle + 'deg, rgba(255,255,255,' + e.pageY / h * .5 + ') 0%,rgba(255,255,255,0) 80%)');
  25.   //poster transform
  26.   $poster.css('transform', transformPoster);
  27.  
  28.   //parallax foreach layer
  29.   $layer.each(function() {
  30.     var $this = $(this),
  31.       offsetLayer = $this.data('offset') || 0,
  32.       transformLayer = 'translateX(' + offsetX * offsetLayer + 'px) translateY(' + offsetY * offsetLayer + 'px)';
  33.  
  34.     $this.css('transform', transformLayer);
  35.   });

仿 Apple TV 海报背景视觉差特效

已有 444 人购买
查看演示升级 VIP立刻购买

演示地址 下载地址
收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!