基于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 相关文章推荐
基于jQuery的图片大小自动适应实现代码
Nov 17 Javascript
Javascript 面向对象(三)接口代码
May 23 Javascript
open 动态修改img的onclick事件示例代码
Nov 13 Javascript
js实现目录定位正文示例
Nov 14 Javascript
ie 7/8不支持trim的属性的解决方案
May 23 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
Aug 18 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
使用Promise解决多层异步调用的简单学习心得
May 17 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 Javascript
JS查找英文文章中出现频率最高的单词
Mar 20 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
基于vue 动态菜单 刷新空白问题的解决
Aug 06 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
PHP判断图片格式的七种方法小结
2013/06/03 PHP
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
input 高级限制级用法
2009/03/26 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
python实现按行分割文件
2019/07/22 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
Collection和Collections的区别
2016/05/02 面试题
优秀员工自荐书范文
2013/12/08 职场文书
留学推荐信怎么写
2015/03/26 职场文书
简爱读书笔记
2015/06/26 职场文书
公司开业主持词
2015/07/02 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
公司员工培训管理制度
2015/08/04 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python