JS实现图片切换动画:动态生成与CSS3过渡效果解析
本文详解如何使用JavaScript结合CSS3 transition属性实现图片切换动画。通过动态生成多个div元素,利用background-position-x控制背景图显示,并配合setInterval定时器与递归调用实现平滑的逐帧切换效果。
JS图片切换动画实现概述
本文基于妙味课堂的教学内容,介绍如何实现带有动画效果的图片切换功能。
该效果的实现逻辑相对直观,主要涉及DOM操作与CSS样式的动态调整。
CSS背景定位属性预备知识
在编写代码前,需要掌握以下基础知识:
【1】CSS属性 background-position-x 的用法
background-position 用于设置由 background-image 定义的背景图像位置。使用此属性的前提是指定了背景图像。
background-position 接受两个值,格式为 background-position: x | y。在实际应用中,可以单独使用 background-position-x 和 background-position-y 来分别控制水平或垂直方向的偏移。
代码实现步骤详解
准备工作完成后,开始编写具体代码。
第一步:动态生成DOM元素
由于动画效果需要大量的div元素参与,直接手动编写HTML过于繁琐,因此采用JavaScript动态添加的方式。具体实现代码如下:
动态生成DOM元素
<style>
body{
margin: 0;
background-color: #5e5e5e;
}
#box{
width: 857px;
height: 574px;
padding-top: 126px;
padding-left:143px;
background: url(img/bg.png) no-repeat;
margin: 0px auto;
}
#wrap{
width: 700px;
height: 420px;
transform-style: preserve-3d;
perspective: 800px;
}
#wrap div{
width: 10px;
height: 420px;
background: url(img/01.png) no-repeat;
float: left;
transition: .5s;
}
</style>
</head>
<body>
<div id="box">
<div id="wrap"></div>
</div>
<script>
//在wrap下,写70个div,每个div显示一张图片的一小片部分,这样70个div能完整的显示出一张图片
for(var i=0;i<70;i++){
str +='<div style="background-position-x:'+(-10*i)+'px"></div>';
}
oWrap.innerHTML = str;
//获取70个div
var divs = oWrap.getElementsByTagName('div');
</script>
</body>
第二步:定义动画核心函数
编写 tab() 函数,用于控制每个div在动画过程中的透明度及背景图片显示。
tab() 函数的具体逻辑如下:
核心动画函数tab()逻辑
// 每个div设置前一个div的透明度为1,并且设置自己的透明度为0和背景图片
function tab(n){
// 0
if(divs[n-1]){
divs[n-1].style.opacity = 1;
}
// 70
if(divs[n]){
divs[n].style.opacity = 0;
divs[n].style.backgroundImage = "url(img/0"+imgNum+".png)";
}
}
第三步:实现动画循环控制
编写 go() 函数,利用 setInterval 定时器不断改变 tab() 函数的参数,并适时更新背景图片,从而实现连续切换效果。
go() 函数的实现逻辑如下:
定时器控制函数go()逻辑
//给tab()函数传递n值
function go(){
timer = setInterval(function(){
tab(num);
num++;
//一张图片切换完毕
if(num == 71){
clearInterval(timer);
//切换下一张图片
imgNum++;
//num清0,动画效果从第一个div开始
num = 0;
//当切到最后一张图片时,在从第一张开始切换
if(imgNum == 6){
imgNum = 1;
}
//切换完一张图片时切换下一张图片的间隔
setTimeout(go,800);
}
//div变换的速度
},80);
}
总结:该动画效果的实现难度适中,代码结构清晰。核心难点在于理解动画实现的思路,即通过动态改变DOM元素的样式属性来模拟视觉变化。
完整源码如下:
完整HTML/CSS/JS源码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图片切换(动画版)</title>
<style>
body{
margin: 0;
background-color: #5e5e5e;
}
#box{
width: 857px;
height: 574px;
padding-top: 126px;
padding-left:143px;
background: url(img/bg.png) no-repeat;
margin: 0px auto;
}
#wrap{
width: 700px;
height: 420px;
transform-style: preserve-3d;
perspective: 800px;
}
#wrap div{
width: 10px;
height: 420px;
background: url(img/01.png) no-repeat;
float: left;
transition: .5s;
}
</style>
</head>
<body>
<div id="box">
<div id="wrap"></div>
</div>
<script>
//在wrap下,写70个div,每个div显示一张图片的一小片部分,这样70个div能完整的显示出一张图片
for(var i=0;i<70;i++){
str +='<div style="background-position-x:'+(-10*i)+'px"></div>';
}
oWrap.innerHTML = str;
//获取70个div
var divs = oWrap.getElementsByTagName('div');
go();
//给tab()函数传递n值
function go(){
timer = setInterval(function(){
tab(num);
num++;
//一张图片切换完毕
if(num == 71){
clearInterval(timer);
//切换下一张图片
imgNum++;
//num清0,动画效果从第一个div开始
num = 0;
//当切到最后一张图片时,在从第一张开始切换
if(imgNum == 6){
imgNum = 1;
}
//切换完一张图片时切换下一张图片的间隔
setTimeout(go,800);
}
//div变换的速度
},80);
}
// 每个div设置前一个div的透明度为1,并且设置自己的透明度为0和背景图片
function tab(n){
// 0
if(divs[n-1]){
divs[n-1].style.opacity = 1;
}
// 70
if(divs[n]){
divs[n].style.opacity = 0;
divs[n].style.backgroundImage = "url(img/0"+imgNum+".png)";
}
}
</script>
</body>
</html>
以上内容为本文的全部介绍,希望能为读者的学习或工作提供参考。如有需要,欢迎继续支持本站获取更多技术分享。
JS怎么使用classList添加、删除和切换class
2026-11-05 17:26:02
网页开发三者分工:HTML结构、CSS样式与JavaScript交互怎么协作
2026-11-05 12:51:22
JS解析URL参数时怎么处理中文乱码和特殊字符
2026-11-05 12:47:23
js-cookie 存储 JSON 对象:自动序列化与反序列化技巧
2026-11-05 12:36:26
marked.js 快速上手:安装与基础 Markdown 转 HTML 示例
2026-11-05 09:32:53
