基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享


Posted in Javascript onSeptember 21, 2015

效果展示如下:

基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享

查看演示     下载源码

HTML结构

Apple TV是由苹果公司继 Airport Express 之后推出的一款高清电视机顶盒产品。如果你曾经使用过,一定会被其中的炫酷电影海报视觉差特效所吸引。

该视觉差特效的HTML结构使用一个<div>作为容器,在它里面的每一个<div>都是一个“层”。

<div class="poster">
 <div class="shine"></div>
 <div class="layer-1"></div>
 <div class="layer-2"></div>
 <div class="layer-3"></div>
 <div class="layer-4"></div>
 <div class="layer-5"></div>
</div>
<div.shine>是用于制作流光效果的图层。

CSS样式

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

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

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

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

海报的居中采用的是绝对定位居中法:left和top分别为50%,然后设置margin-left和margin-top为负的宽度值和高度值。

海报中所有的“层”可以通过div[class*="layer-"]选择器来选择。所有的图层都被设置为绝对定位,背景图片不重复,background-position设置到左上角位置,背景的大小设置为100%的宽度和自动高度。

div[class*="layer-"] {
 position: absolute;
 top: -10px;
 left: -10px;
 right: -10px; 
 bottom: -10px;
 background-size: 100% auto;
 background-repeat: no-repeat;
 background-position: 0 0;
 transition:0.1s;
}

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

最后为每一个图层设置背景图片。

.layer-1 {
 background-image: url('images/1.png');
}
.layer-2 {
 background-image: url('images/2.png');
}
.layer-3 {
 top: 0; bottom: 0;
 left: 0; right: 0;
 background-image: url('images/3.png');
}
.layer-4 {
 background-image: url('images/4.png');
}
.layer-5 {
 background-image: url('images/5.png');
}

JavaScript

该视觉差效果的原理是每次用户移动鼠标是时候,.poster的transforms: translateY、rotate和rotateY属性将根据鼠标的位置发生变化。鼠标距离左上角越远,动画可见的区域就越多。

计算的公式类似于 offsetX = 0.5 ? 鼠标位置 / 窗口的宽度。

为了给各个层不同的动画速度,这里需要在乘以一个自定义的动画速率值,这个值由HTML标签上的data-offset="number"提供。

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

data-offset的值越大,可见的动画区域就越大。

整个视觉差效果的JS代码如下:

var $poster = $('.poster'),
 $shine = $('.shine'),
 $layer = $('div[class*="layer-"]');
$(window).on('mousemove', function(e) {
 var w = $(window).width(), //窗口宽度
  h = $(window).height(), /窗口高度
  offsetX = 0.5 - e.pageX / w, //鼠标X坐标
  offsetY = 0.5 - e.pageY / h, //鼠标Y坐标
  dy = e.pageY - h / 2, //@h/2 = 海报容器中心
  dx = e.pageX - w / 2, //@w/2 = 海报容器中心
  theta = Math.atan2(dy, dx), //鼠标和海报中心的RAD角度
  angle = theta * 180 / Math.PI - 90, //转换 rad 为 degrees
  offsetPoster = $poster.data('offset'),
  transformPoster = 'translateY(' + -offsetX * offsetPoster + 'px) rotateX(' + (-offsetY * offsetPoster) + 'deg) 
            rotateY(' + (offsetX * (offsetPoster * 2)) + 'deg)'; 
 //get angle between 0-360
 if (angle < 0) {
  angle = angle + 360;
 }
 //gradient angle and opacity
 $shine.css('background', 'linear-gradient(' + angle + 'deg, rgba(255,255,255,' + e.pageY / h * .5 + ') 0%,rgba(255,255,255,0) 80%)');
 //poster transform
 $poster.css('transform', transformPoster);
 //parallax foreach layer
 $layer.each(function() {
  var $this = $(this),
   offsetLayer = $this.data('offset') || 0,
   transformLayer = 'translateX(' + offsetX * offsetLayer + 'px) translateY(' + offsetY * offsetLayer + 'px)';
  $this.css('transform', transformLayer);
 });
Javascript 相关文章推荐
MSN消息提示类
Sep 05 Javascript
从JavaScript 到 JQuery (1)学习小结
Feb 12 Javascript
&amp;lt;script defer&amp;gt; defer 是什么意思
May 10 Javascript
javascript 中的 delete及delete运算符
Nov 15 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
Dec 03 Javascript
基于javascript实现仿百度输入框自动匹配功能
Jan 03 Javascript
Jquery元素追加和删除的实现方法
May 24 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
利用ES6语法重构React组件详解
Mar 02 Javascript
AugularJS从入门到实践(必看篇)
Jul 10 Javascript
jQuery实现的表格前端排序功能示例
Sep 18 jQuery
Vue.js中的高级面试题及答案
Jan 13 Javascript
Java Mybatis框架入门基础教程
Sep 21 #Javascript
JS实现仿微博可关闭弹出层效果
Sep 21 #Javascript
jQuery+HTML5美女瀑布流布局实现方法
Sep 21 #Javascript
JavaScript实现网页加载进度条代码超简单
Sep 21 #Javascript
Javascript验证方法大全
Sep 21 #Javascript
JavaScript验证Email(3种方法)
Sep 21 #Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 #Javascript
You might like
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
layui分页效果实现代码
2017/05/19 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
pandas通过loc生成新的列方法
2018/11/28 Python
numpy.where() 用法详解
2019/05/27 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
法律专业实习鉴定
2013/12/22 职场文书
优秀实习生感言
2014/03/01 职场文书
人事任命书格式
2014/06/05 职场文书
新农村建设汇报材料
2014/08/15 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python