基于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 字符编码规则
May 04 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
JS实用的动画弹出层效果实例
May 05 Javascript
jQuery结合ajax实现动态加载文本内容
May 19 Javascript
理解javascript中的with关键字
Feb 15 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
Feb 16 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
Jul 04 Javascript
使用jQuery实现动态添加小广告
Jul 11 jQuery
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
Feb 02 jQuery
微信小程序scroll-view锚点链接滚动跳转功能
Dec 12 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
php入门小知识
2008/03/24 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
PHP递归创建多级目录
2015/11/05 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
python实现二分查找算法
2017/09/21 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
大二学期个人自我评价
2014/01/13 职场文书
《夸父追日》教学反思
2014/02/26 职场文书
调解协议书
2014/04/16 职场文书
新书发布会策划方案
2014/06/09 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
房产分割协议书范文
2014/11/21 职场文书
介绍信格式样本
2015/05/05 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
吃通javascript正则表达式
2021/04/21 Javascript