JavaScript实现小米官网风格图片轮播特效详解
本文详细解析如何仿照小米官网实现图片轮播特效。通过Chrome开发者工具分析HTML结构,利用CSS定位与z-index控制层级,结合opacity和display属性实现淡入淡出效果。核心逻辑包含手动左右切换与自动播放功能,通过取余运算处理索引边界,并封装运动函数实现平滑过渡。
实现思路与页面布局
小米官网的设计风格给人以大气、简洁的印象,丰富的特效应用带来了耳目一新的视觉体验。鉴于其首页轮播图的实现方式颇具特色,此处尝试进行模仿开发。
初步效果已呈现,具体展示如下:

借助Chrome浏览器的F12开发者工具审查小米官网HTML源码,可以发现其使用了五个div元素包裹图片。通过CSS定位及z-index属性控制各div的层级关系,并利用opacity(透明度)和display(显示状态)属性来管理元素的可见性。
相关属性截图如下(重点观察红框标注的opacity属性):

明确实现原理后,首先构建页面基础布局。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Mking_js_</title>
<script type="text/javascript" src="js/moveopacity_1.js"></script>
<style type="text/css">
#warp{ width:800px; height: 400px; margin: 20px auto;
position: relative;}
#imgWarp{ width:600px; height: 400px;
position: absolute; top:0; left: 100px; display: inline-block;
}
.btn:hover{cursor: pointer;}
.btn{line-height: 30px; text-align: center;font-size: 25px; font-weight: bold;
color: #fff;width:80px; height: 30px;top:185px;background: #5f7c8a;position: absolute;
border-radius: 3px;
}
.btn:nth-of-type(1){
left: 0; }
.btn:nth-of-type(2) {
right: 0; }
img
{
position: absolute;
width:600px; height: 400px;
background-size:contain;
opacity: 0;
display: none;
z-index: 0;
}
img:nth-of-type(1) {
opacity: 1;
display: block;
z-index:5;
}
.links{ width:300px; height: 30px;
position: absolute; right:100px; bottom: 10px; z-index: 10; }
em{font-style: normal; display: inline-block; height: 30px; width: 30px;
margin-right: 15px; border: 1px solid #000000; vertical-align: top;
line-height: 30px; font-size: 20px; text-align: center;color: #fff;
font-weight: bold; border-radius: 50%; background-color: #008000;
border-color: #c0c0c0;
box-sizing: border-box;
}
em.active{
background-color: #fff;
color: #000000;
}
</style>
</head>
<body>
<div id="warp">
<div id="imgWarp" >
<img id="img1" src="product/1.jpg" TITLE="img1" />
<img id="img2" src="product/2.jpg" TITLE="img2"/>
<img id="img3" src="product/3.jpg" TITLE="img3"/>
<img id="img4" src="product/4.jpg" TITLE="img4"/>
<img id="img5" src="product/5.jpg" TITLE="img5" />
</div>
<span class="btn" id="left">left</span>
<span class="btn" id="right">right</span>
<div class="links">
<em class="active"></em>
<em></em>
<em></em>
<em></em>
<em></em>
</div>
</div>
</body>
</html>
在确立HTML结构的基础上,接下来引入JavaScript代码以实现动态交互效果。
页面基础JS逻辑如下:
核心逻辑与运动函数
window.onload = function(){
var oLeft = document.getElementById("left");
var oRight = document.getElementById("right");
var oWarp = document.getElementById("imgWarp");
var aImg = oWarp.getElementsByTagName("img");
var aEm = document.getElementsByTagName("em");
var i = 5;
btn = true;
oLeft.onclick = function(){
clearInterval(autoTimer);
if(btn){
btn=false;
fnAutoLeft();
}
};
function fnAutoLeft(){
var a = i % 5;
i-=1;
var b = i % 5;
startOpacMove(aImg[a],0,aImg[b],100);
setStyle(b);
}
oRight.onclick = function(){
if(btn){ //单位时间内只能触发一次元素的显示隐藏
clearInterval(autoTimer);
btn=false;
fnAutoRight();
}
};
var count =0;
function fnAutoRight(){
var a = i % 5;
i+=1;
var b = i % 5;
startOpacMove(aImg[a],0,aImg[b],100);
setStyle(b);
if(i==10){
i=5;
for(var j = 0;j<aImg.length;j++){
if(j==0){
aImg[0].style.cssText ="opacity: 1; z-index: 5; display: block;";
}
else{
aImg[j].style.cssText ="opacity: 0; z-index: 0; display: none;";
}
}
}
}
var autoTimer = setInterval(fnAutoRight,5000);
function setStyle(a){
for(var i=0;i<aEm.length;i++){
aEm[i].className="";
}
aEm[a].className="active";
}
}
核心运动逻辑代码:
function startOpacMove(obj1,tag1,obj2,tag2)
{
var iCur1 = 0;
var iCur2 = 0;
var iTimer = null;
var iSpeed1 = -2;
var iSpeed2 = 2;
clearInterval(iTimer);
iTimer = setInterval(function(){
var iBtn = true;
iCur1 = css(obj1,'opacity')*100;
iCur2 = css(obj2,'opacity')*100;
iCur1 = Math.floor(iCur1);
iCur2 = Math.floor(iCur2);
if(iCur1 != tag1 && iCur2 != tag2){
iBtn = false;
obj1.style.opacity = (iCur1+iSpeed1)/100;
// console.log("隐藏元素时候的透明度值:"+(iCur1+iSpeed1)/100);
obj1.style.filter = 'alpha(opacity='+(iCur1+iSpeed1)+')';
obj1.style.zIndex = 0;
obj2.style.opacity = (iCur2+iSpeed2)/100;
obj2.style.filter = 'alpha(opacity='+(iCur2+iSpeed2)+')';
obj2.style.zIndex = 5;
obj2.style.display ="block";
}
if(iBtn){
clearInterval(iTimer);
obj1.style.display ="none";
obj1.style.opacity =0;
obj2.style.opacity =1;
btn = true;
}
},10);
}
function css(obj,attr){
if(obj.currentStyle){ //当前浏览器下存在currentStyle属性
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
}
具体分析JavaScript代码是如何驱动图片切换的。
思考一个关键问题:图片如何实现向左或向右切换,以及完成该动作的必要条件。假设当前显示的是第一张图片,当执行向右切换时,需隐藏第一张并显示第二张。具体操作为:隐藏索引为0的图片,显示索引为1的图片;再次点击向右按钮时,隐藏索引为1的图片,显示索引为2的图片,以此类推。因此,需要获取的索引序列为0、1、2、3、4。最后需注意右侧边界的处理即可。
具体代码实现如下:
切换控制与自动播放
var i = 5;
function fnAutoRight(){
var a = i % 5;
i+=1;
var b = i % 5;
}
利用变量i对5取余,所得结果为0至4之间的数值,恰好对应所需的索引。此时,变量a和b分别代表需要隐藏和显示的图片索引。调用预先编写好的运动函数及底部指示器更新函数,即可完成向右切换的功能。
关于图片向左移动,需确定隐藏和显示图片的索引。假设当前显示第一张图片,点击向左按钮时,需隐藏索引为0的图片,显示索引为4的图片;再次点击时,隐藏索引为4的图片,显示索引为3的图片。由此可见,所需的索引序列为0、4、3、2、1。
向左切换的代码如下:
var i=5;
function fnAutoLeft(){
var a = i % 5;
i-=1;
var b = i % 5;
}
同样采用i对5取余的方式,计算得到a为当前需隐藏的图片索引;将i减一后再对5取余,得到b为需显示的图片索引。由此解决了向左切换的问题。
在代码末尾,编写一个setInterval定时播放函数,并设置调用间隔时间,从而实现自动播放功能。
以上内容为本文的全部讲解,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站。
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
