Today I will share with you a breathing carousel implemented with native JS. The effect is as follows: The following is the code implementation, you are welcome to copy and paste. <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Native JS to implement breathing carousel</title> <style> ul { margin: 0; padding-left: 0; } li { list-style: none; } img { border: none; } #main { width: 280px; height: 330px; overflow: hidden; position: relative; margin: 20px auto 0 auto; } #main ul { position: absolute; left: 0; } #main ul li { width: 280px; height: 330px; float: left; position: absolute; filter:alpha(opacity=0); opacity: 0; } #btn { line-height: 14px; text-align: center; background: #eeeeee; width: 280px; margin: 10px auto 0 auto; display: flex; flex-direction: row; justify-content: space-around; align-items: center; } #btn a { display: inline-block; width: 14px; height: 14px; text-decoration: none; line-height: 12px; text-align: center; border-radius: 7px; } #btn a.index { background-color: #ccc; } #btn a.active { background-color: red; } </style> <script type="text/javascript" src="js/move.js"></script> <script> window.onload = function () { var oMain = document.getElementById('main'); var oUl = oMain.getElementsByTagName('ul')[0]; var aLi = oUl.getElementsByTagName('li'); var oBtn = document.getElementById('btn'); var aA = oBtn.getElementsByTagName('a'); var iNow = 1; var iNow2 = 1; var bBtn = true; var num = 3; var timer = null; oUl.style.width = aLi.length * aLi[0].offsetWidth + 'px'; aA[0].onclick = function () { if (bBtn) { clearInterval(timer); timer = setInterval(autoPlay, 3000); for (var i = 0; i < aLi.length; i++) { aLi[i].style.position = 'relative'; aLi[i].style.filter = 'alpha(opacity=100)'; aLi[i].style.opacity = 1; } oUl.style.left = -(iNow - 1) * aLi[0].offsetWidth + 'px'; if (iNow == 1) { iNow = aLi.length; aLi[aLi.length - 1].style.position = 'relative'; aLi[aLi.length - 1].style.left = -aLi.length * aLi[0].offsetWidth + 'px'; } else { iNow--; } iNow2--; toRun(); bBtn = false; } }; aA[aA.length - 1].onclick = function () { if (bBtn) { clearInterval(timer); timer = setInterval(autoPlay, 3000); for (var i = 0; i < aLi.length; i++) { aLi[i].style.position = 'relative'; aLi[i].style.filter = 'alpha(opacity=100)'; aLi[i].style.opacity = 1; } oUl.style.left = -(iNow - 1) * aLi[0].offsetWidth + 'px'; if (iNow == aLi.length) { iNow = 1; aLi[0].style.position = 'relative'; aLi[0].style.left = aLi.length * aLi[0].offsetWidth + 'px'; } else { iNow++; } iNow2++; toRun(); bBtn = false; } }; for (var i = 1; i < aA.length - 1; i++) { aA[i].index = i; aA[i].onclick = function () { clearInterval(timer); timer = setInterval(autoPlay, 3000); iNow = this.index; iNow2 = this.index; toShow(); }; }; function toRun() { for (var i = 1; i < aA.length - 1; i++) { aA[i].className = 'index'; } aA[iNow].className = 'active'; startMove(oUl, { left: -(iNow2 - 1) * aLi[0].offsetWidth }, function () { if (iNow == 1) { aLi[0].style.position = 'relative'; aLi[0].style.left = 0; oUl.style.left = 0; iNow2 = 1; } else if (iNow == aLi.length) { aLi[aLi.length - 1].style.position = 'relative'; aLi[aLi.length - 1].style.left = 0; oUl.style.left = -(aLi.length - 1) * aLi[0].offsetWidth + 'px'; iNow2 = aLi.length; } for (var i = 0; i < aLi.length; i++) { aLi[i].style.position = 'absolute'; aLi[i].style.filter = 'alpha(opacity=0)'; aLi[i].style.opacity = 0; } oUl.style.left = 0; aLi[iNow2 - 1].style.zIndex = num++; aLi[iNow2 - 1].style.filter = 'alpha(opacity=100)'; aLi[iNow2 - 1].style.opacity = 1; bBtn = true; }); }; function toShow() { for (var i = 1; i < aA.length - 1; i++) { aA[i].className = 'index'; } for (var i = 0; i < aLi.length; i++) { startMove(aLi[i], { opacity: 0 }); } aA[iNow].className = 'active'; startMove(aLi[iNow - 1], { opacity: 100 }, function () { aLi[iNow - 1].style.zIndex = num++; }); } timer = setInterval(autoPlay, 3000); function autoPlay() { if (iNow == aLi.length) { iNow = 1; iNow2 = 1; } else { iNow++; iNow2++; } toShow(); } }; </script> </head> <body> <div id="main"> <ul> <li style="z-index:2; filter:alpha(opacity=100); opacity:1;"> <a> <img src="images/0.jpg" /> </a> </li> <li> <a> <img src="images/1.jpg" /> </a> </li> <li> <a> <img src="images/2.jpg" /> </a> </li> <li> <a> <img src="images/3.jpg" /> </a> </li> </ul> </div> <div id="btn"> <a class="prev" href="javascript:;"> <a class="active" href="javascript:;"> </a> <a class="index" href="javascript:;"></a> <a class="index" href="javascript:;"></a> <a class="index" href="javascript:;"></a> <a class="next" href="javascript:;">></a> </div> </body> </html> The following is the code of the most important movement function move.js introduced in the above code: function startMove(obj, json, fnEnd) { clearInterval(obj.timer); obj.timer = setInterval(function () { doMove(obj, json, fnEnd); }, 30); } function doMove(obj, json, fnEnd) { var iCur = 0; var attr = null; var bStop = true; for (attr in json) { if (attr == 'opacity') { if (parseInt(100 * getStyle(obj, attr)) == 0) { iCur = parseInt(100 * getStyle(obj, attr)); } else { iCur = parseInt(100 * getStyle(obj, attr)) || 100; } } else { iCur = parseInt(getStyle(obj, attr)) || 0; } var iSpeed = (json[attr] - iCur) / 5; iSpeed = (iSpeed > 0) ? Math.ceil(iSpeed) : Math.floor(iSpeed); if (json[attr] != iCur) { bStop = false; } if (attr == 'opacity') { obj.style.filter = 'alpha(opacity=' + (iCur + iSpeed) + ')'; obj.style.opacity = (iCur + iSpeed) / 100; } else { obj.style[attr] = iCur + iSpeed + 'px'; } } if (bStop) { clearInterval(obj.timer); if (fnEnd) { fnEnd.call(obj); } } } function stopMove(obj) { clearInterval(obj.timer); } function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj)[attr]; } } The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: HTML table markup tutorial (22): row border color attribute BORDERCOLORLIGHT
>>: How to use Docker plugin to remotely deploy projects to cloud servers in IDEA
Table of contents Problem Description The general...
MYSQL is case sensitive Seeing the words is belie...
This article shares the specific code of Vue usin...
This article example shares the specific code of ...
Correct answer Using useRouter : // router path: ...
The database enables slow query logs Modify the c...
Here's the thing: Everyone knows about "...
ElasticSearch cluster supports動態請求的方式and靜態配置文件to ...
Preface scp is the abbreviation of secure copy. s...
Table of contents Linux--File descriptor, file po...
I've seen people asking before, how to add sty...
Table of contents Demo1 create_fragment SvelteCom...
Mysql commonly used display commands 1. Display t...
React Lifecycle Two pictures to help you understa...