jquery动画3.创建一个带遮罩效果的图片走廊


Posted in Javascript onAugust 24, 2012
#frame 
{ 
position: relative; 
width: 700px; 
height: 400px; 
overflow: hidden; 
z-index: 0; 
} 
#frame img 
{ 
width: 700px; 
height: 400px; 
position: absolute; 
top: 0; 
left: 0; 
z-index: 1; 
} 
#frame img.visible 
{ 
z-index: 2; 
} 
#frame a 
{ 
display: block; 
width: 50%; 
height: 100%; 
position: absolute; 
top: 0; 
z-index: 10; 
color: transparent; 
background-image: url(transparent.gif); 
filter: alpha(opacity = 0); 
text-align: center; 
text-decoration: none; 
font: 90px "Palatino Linotype" , "Book Antiqua" , Palatino, serif; 
line-height: 400%; 
} 
#frame a:hover 
{ 
color: #fff; 
text-shadow: 0 0 5px #000; 
filter: alpha(opacity = 100); 
filter: Shadow(Color=#000, Direction=0); 
} 
#frame a:focus 
{ 
outline: none; 
} 
#prev 
{ 
left: 0; 
} 
#next 
{ 
right: 0; 
} 
#overlay 
{ 
width: 100%; 
height: 100%; 
position: absolute; 
left: 0; 
top: 0; 
z-index: 3; 
} 
#overlay div 
{ 
position: absolute; 
}

接下来介绍jquery.tranzify.js插件如何制作,该部分以讲解为主,插件的详细代码和如何使用,还是参照demo。

第一步是搭建插件的骨架:

(function ($) { 
$.tranzify = { 
defaults: { //默认配置 
transitionWidth: 40, //遮罩层每一小片段的宽度 
transitionHeight: '100%', //遮罩层每一小片段高度 
containerID: 'overlay', //遮罩层id 
transitionType: 'venetian',//默认遮罩层动画效果 
prevID: 'prev',//上一条导航ID 
nextID: 'next',//下一条导航ID 
visibleClass: 'visible' //可见性class 
}, 
//插件初始化操作 
createUI: function (config) { 
}, 
//创建遮罩层 
createOverlay: function (config) { 
}, 
//运行动画效果 
runTransition: function (config) { 
} 
}; 
$.fn.extend({ 
//创建插件函数 
tranzify: function (options) {return this; 
} 
}); 
})(jQuery);

基本骨架有了,我们先来实现插件函数tranzify的实现。代码还是很简单的,就是获取当前的dom对象,对其创建相关html元素和相应事件,最后把this返回回去,实现链式模式,代码如下:
//创建插件函数 
tranzify: function (options) { 
//扩展配置 

var config = $.extend($.tranzify.defaults, options); 

//获取当前dom对象,传给config.selector 

config.selector = "#" + this.attr('id'); 

//计算出我们需要创建的遮罩层片段数 

config.multi = parseInt(this.width()) / config.transitionWidth; 

//创建插件 

$.tranzify.createUI(config); 

//返回对象本身,实现链式效果 

return this; 
}

 接下来我们介绍createUI函数。首先获取图片总数:
var imgLength = $(config.selector).find('img').length,

接下来定义‘上一条'和‘下一条'导航,并添加到selector对象上。
prevA = $('<a></a>', { 
id: config.prevID, 
href: '#', 
html: '«', 
click: function (e) { 
e.preventDefault(); 
//隐藏导航 
$(config.selector).find('a').css('display', 'none'); 
//创建遮罩 
$.tranzify.createOverlay(config); 
//获取当前显示状态的图片 
var currImg = $('.' + config.visibleClass, $(config.selector)); 
//当前图片不是第一张图片 
if (currImg.prev().filter('img').length > 0) { 
//将上一张图片设置为可显示状态 
currImg.removeClass(config.visibleClass).prev().addClass(config.visibleClass); 
} else { 
//设置最后一张图片为可显示状态 
currImg.removeClass(config.visibleClass); 
$(config.selector).find('img').eq(imgLength - 1).addClass(config.visibleClass); 
} 
//运行遮罩效果 
$.tranzify.runTransition(config); 
} 
}).appendTo(config.selector), 
nextA = $('<a></a>', { 
id: config.nextID, 
href: '#', 
html: '»', 
click: function (e) { 
e.preventDefault(); 
//隐藏导航 
$(config.selector).find('a').css('display', 'none'); 
//创建遮罩 
$.tranzify.createOverlay(config); 
//获取当前显示状态的图片 
var currImg = $('.' + config.visibleClass, $(config.selector)); 
//当前图片不是最后一张图片 
if (currImg.next().filter('img').length > 0) { 
//将下一张图片设置为可显示状态 
currImg.removeClass(config.visibleClass).next().addClass(config.visibleClass); 
} else { 
//设置第一张图片为可显示状态 
currImg.removeClass(config.visibleClass); 
$(config.selector).find('img').eq(0).addClass(config.visibleClass); 
} 
//运行遮罩效果 
$.tranzify.runTransition(config); 
} 
}).appendTo(config.selector);

最后别忘记把第一张图片设置为显示状态。
$(config.selector).find('img').eq(0).addClass(config.visibleClass);

下面介绍创建遮罩层的代码。主要思路是:创建一组div,div的背景就是当前显示的图片,通过设置各个div css的left值,背景的backgroundPosition值,使这组div组成一个完整的图片效果。还是看代码吧,一看就一目了然了。

//div left的偏移量 
var posLeftMarker = 0, 
//div 背景position的偏移量 
bgHorizMarker = 0, 
//遮罩层总的包装对象 
overlay = $('<div></div>', { 
id: config.containerID 
}); 
//循环,确定需要创造的片段数 
for (var i = 0; i < config.multi; i++) { 
//创造片段,每个片段只包含当前显示图片的一部分图片 
$('<div></div>', { 
//设置宽度 
width: config.transitionWidth, 
//设置高度 
height: config.transitionHeight, 
css: { 
//设置背景图片,来源就是当前处于显示状态的图片 
backgroundImage: 'url(' + $('.' + config.visibleClass, $(config.selector)).attr('src') + ')', 
//设置背景图片大小,让他们和外部容器高度、宽度一致。 
//这样无论你图片的大小,都会和容易大小匹配 
backgroundSize: $(config.selector).width() + 'px ' + $(config.selector).height() + 'px', 
//设置背景偏移量 
backgroundPosition: bgHorizMarker + 'px 0', 
//设置left值 
left: posLeftMarker, 
top: 0 
} 
}).appendTo(overlay);//添加到遮罩层容器 
//重新计算偏移量 
bgHorizMarker -= config.transitionWidth; 
posLeftMarker += config.transitionWidth; 
} 
//遮罩层容器添加到页面 
overlay.insertBefore('#' + config.prevID);

ok, 只剩运行遮罩层的代码了。这段代码也很简单,就是获取遮罩层容易下面的各个div,对他们添加动画效果,逐个让他们的高度或者宽度变为0,等整个动画结束后,移出遮罩层容器。
//获取遮罩层容器 
var transOverlay = $('#' + config.containerID), 
//获取遮罩层容器下各div 
transEls = transOverlay.children(), 
len = transEls.length - 1; 
//根据配置运行不懂得动画效果 
switch (config.transitionType) { 
case 'venetian': 
transEls.each(function (i) { 
transEls.eq(i).animate({ 
width: 0 
}, 'slow', function () { 
if (i === len) { 
transOverlay.remove(); 
$(config.selector).find('a').css('display', 'block'); 
} 
}); 
}); 
break; 
case 'strip': 
var counter = 0; 
function strip() { 
transEls.eq(counter).animate({ 
height: 0 
}, 150, function () { 
if (counter === len) { 
transOverlay.remove(); 
$(config.selector).find("a").css("display", "block"); 
} else { 
counter++; 
strip(); 
} 
}); 
} 
strip(); 
break; 
}

好了,内容讲完了,把代码拼接起来就可以运行最终效果了。希望这篇文章对你有帮助。

demo下载地址:jQuery.animation.tranzify

Javascript 相关文章推荐
javascript判断iphone/android手机横竖屏模式的函数
Dec 20 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
Oct 31 Javascript
JavaScript中创建字典对象(dictionary)实例
Mar 31 Javascript
老生常谈JavaScript数组的用法
Jun 10 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
Dec 20 Javascript
vue组件之间的数据传递方法详解
Apr 19 Javascript
微信小程序遍历Echarts图表实现多个饼图
Apr 25 Javascript
js实现中文实时时钟
Jan 15 Javascript
js实现随机点名器精简版
Jun 29 Javascript
Vue文本模糊匹配功能如何实现
Jul 30 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 #Javascript
jquery动画1.加载指示器
Aug 24 #Javascript
基于jquery的bankInput银行卡账号格式化
Aug 22 #Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 #Javascript
js选取多个或单个元素的实现代码(用class)
Aug 22 #Javascript
javascript动态加载三
Aug 22 #Javascript
javascript动态加载二
Aug 22 #Javascript
You might like
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
vue实现nav导航栏的方法
2017/12/13 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
Python功能键的读取方法
2015/05/28 Python
Python内置模块turtle绘图详解
2017/12/09 Python
python 瀑布线指标编写实例
2020/06/03 Python
python 模拟登陆github的示例
2020/12/04 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
教师实习的自我鉴定
2013/10/26 职场文书
客服专员岗位职责范本
2013/11/29 职场文书
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
世博会口号
2014/06/20 职场文书
单位委托书怎么写
2014/08/02 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL