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 相关文章推荐
利用JQuery为搜索栏增加tag提示
Jun 22 Javascript
JavaScript 空位补零实现代码
Feb 26 Javascript
jquery trim() 功能源代码
Feb 14 Javascript
jquery获得下拉框值的代码
Aug 13 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
Dec 30 Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
Jul 17 Javascript
JSON.stringify()方法讲解
Jan 31 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
Feb 18 Javascript
layui 实现表格某一列显示图标
Sep 19 Javascript
JS实现超级好看的鼠标小尾巴特效
Dec 01 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 购物车实例(申精)
2009/05/11 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
js实现二级导航功能
2017/03/03 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
vue过滤器用法实例分析
2019/03/15 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
python lambda的使用详解
2021/02/26 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
人力资源管理专业学生自我评价
2013/11/20 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
社区党务公开实施方案
2014/03/18 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
公司联欢会主持词
2015/07/04 职场文书
校园之声广播稿
2015/08/18 职场文书
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript