基于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 相关文章推荐
避免回车键导致的页面无意义刷新的解决方法
Apr 12 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
Jan 25 Javascript
jquery实现metro效果示例代码
Sep 06 Javascript
使用CSS样式position:fixed水平滚动的方法
Feb 19 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
js操作table元素实现表格行列新增、删除技巧总结
Nov 18 Javascript
jQuery插件ajaxFileUpload使用详解
Jan 10 Javascript
JS实现评价的星星功能
Aug 20 Javascript
vue环境搭建简单教程
Nov 07 Javascript
vue自定义指令directive实例详解
Jan 17 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
Apr 03 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中,文件上传
2006/12/06 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
护士自我鉴定总结
2014/03/24 职场文书
小学英语课后反思
2014/04/26 职场文书
诚信贷款承诺书
2014/05/30 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
python数字转对应中文的方法总结
2021/08/02 Python
浅析python中特殊文件和特殊函数
2022/02/24 Python
python实现双链表
2022/05/25 Python