本文介绍如何利用Require.js模块化规范,将原生JavaScript轮播图功能拆分为get.js、init.js、slider.js及StartMove.js四个独立模块。通过定义依赖关系与接口,实现样式获取、动画逻辑与轮播控制的解耦,提供了一套完整且可复用的前端组件封装方案。
HTML结构构建
首先构建HTML结构,定义轮播图容器及内部元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>require.js封装轮播图</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
list-style: none;
}
#banner{
width: 830px;
height: 440px;
border: solid 1px;
margin: 50px auto;
position: relative;
overflow: hidden;
}
#banner ul{
position: absolute;
left: 0;
top: 0;
}
#banner ul li{
width: 830px;
height: 440px;
float: left;
}
#banner p{
position: absolute;
left: 50%;
bottom: 10px;
margin-left: -30px;
}
#banner p span{
display: block;
float: left;
width: 15px;
height: 15px;
margin-right: 6px;
background: #ccc;
border-radius: 50%;
}
#banner p .on{
background: red;
}
</style>
<script type="text/javascript" src="require.js" data-main='init'></script>
<!--<script type="text/javascript">
require(['slider'],function(mod){
mod.slide()
})
</script>-->
</head>
<body>
<div id="banner">
<ul>
<li><img src="images/1.jpg"/></li>
<li><img src="images/2.jpg"/></li>
</ul>
<p>
<span class="on"></span>
<span></span>
<span></span>
</p>
</div>
</body>
</html>
样式获取模块封装
在中,定义了模块,主要提供获取元素计算样式的工具函数。该函数兼容IE及其他现代浏览器,通过判断currentStyle或getComputedStyle来返回指定CSS属性的值。
define(function(require,exports,module){
exports.getStyle = function (obj,name){
if(obj.currentStyle){
return obj.currentStyle[name];
}else{
return getComputedStyle(obj,false)[name];
};
};
});
轮播初始化逻辑
在中,编写了初始化脚本。该脚本利用Require.js加载slider模块,并调用其slide方法以启动轮播功能。
require(['slider'],function(mod){
mod.slide();
});
轮播核心控制实现
在中,实现了slider.js核心逻辑。该模块依赖StartMove动画模块,获取轮播图容器、列表项及控制按钮元素。代码计算了所有图片的总宽度并设置给ul元素。slide函数遍历按钮,为每个按钮绑定点击事件,点击时更新当前激活状态,并调用move函数执行左移动画,实现图片切换。
define(function(require, exports, module) {
var move = require('StartMove');
var aBtn = document.getElementById('banner').getElementsByTagName('span');
var oUl = document.getElementById('banner').getElementsByTagName('ul')[0];
var aLi = oUl.children;
//三张图片所占的宽度,length返回的是字符串中的字符数
oUl.style.width = aLi.length * aLi[0].offsetWidth + 'px';
exports.slide = function() {
for(var i = 0; i < aBtn.length; i++) {
aBtn[i].index = i;
aBtn[i].onclick = function() {
for(var i = 0; i < aBtn.length; i++) {
aBtn[i].className = '';
}
aBtn[this.index].className = 'on';
move.move(oUl, {
left: -this.index * aLi[0].offsetWidth;
});
};
};
};
});
通用动画模块设计
在中,定义了StartMove.js动画模块。该模块依赖get.js获取样式。move函数接收目标对象、目标属性json及完成回调。它清除原有定时器,设置动画持续时间(默认1000ms)和缓动方式(默认ease-out)。通过计算总步数和起始位置,利用setInterval逐步更新元素样式,并在动画结束时执行回调函数。
define(function(require, exports, module) {
var get = require('get');
exports.move = function move(obj, json, complete) {
clearInterval(obj.timer);
var complete = complete || {};
complete.dur = complete.dur || 1000;
complete.easing = complete.easing || 'ease-out';
var count = parseInt(complete.dur / 30); //总次数
var start = {}; //{width:300,height:300}
var dis = {};
//{width:300,height:300}
for(var name in json) {
start[name] = parseFloat(get.getStyle(obj, name));
dis[name] = json[name] - start[name];
}
var n = 0; //当前步数
obj.timer = setInterval(function() {
n++;
for(var name in json) {
var a = n / count;
switch(complete.easing) {
case 'linear':
var cur = start[name] + a * dis[name];
break;
case 'ease-in':
var cur = start[name] + Math.pow(a, 3) * dis[name];
break;
case 'ease-out':
var a = 1 - n / count;
var cur = start[name] + (1 - Math.pow(a, 3)) * dis[name];
break;
};
if(name == 'opacity') {
obj.style[name] = cur;
obj.style.filter = 'alpha(' + cur * 100 + ')';
} else {
obj.style[name] = cur + 'px';
};
};
if(n == count) {
clearInterval(obj.timer)
complete.fn && complete.fn();
};
}, 30);
};
});
上述内容展示了使用Require.js封装原生JavaScript轮播图的完整实现过程。通过模块化拆分,代码结构更加清晰,便于维护和复用。如有任何疑问,欢迎留言交流,小编将及时回复。感谢支持。