基于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 相关文章推荐
JavaScript 模拟用户单击事件
Dec 31 Javascript
JavaScript版DateAdd和DateDiff函数代码
Mar 01 Javascript
地址栏传递中文参数乱码在js里用escape转码
Aug 28 Javascript
JavaScript二维数组实现的省市联动菜单
May 08 Javascript
jquery获取所有选中的checkbox实现代码
May 26 Javascript
jquery操作ID带有变量的节点实例
Dec 07 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
Dec 16 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
JS实现队列的先进先出功能示例
May 10 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
Jun 08 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
jquery实现轮播图特效
Apr 12 jQuery
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
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
ThinkPHP分页实例
2014/10/15 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
input框中的name和id的区别
2016/11/16 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
Python程序设计入门(3)数组的使用
2014/06/16 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
毕业生就业自荐信
2013/12/04 职场文书
请假条标准格式规范
2014/04/10 职场文书
干部对照检查材料范文
2014/08/26 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
运动会开幕式主持词
2015/07/01 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
Python基础 括号()[]{}的详解
2021/11/07 Python