轮播图实现(手动+自动)

冷不防 2022-12-11 13:33 369阅读 0赞

html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>最简单的轮播效果</title>
  6. <link rel="stylesheet" type="text/css" href="css/pic.css">
  7. </head>
  8. <body>
  9. <div class="box" id="box">
  10. <div class="inner">
  11. <!--轮播图-->
  12. <ul>
  13. <li><a href="Bootstrap.html"><img src="images/boke/p2.jpg"></a></li>
  14. <li><a href=""><img src="images/boke/p4.png"></a></li>
  15. <li><a href=""><img src="images/boke/black.jpg"></a></li>
  16. <li><a href=""><img src="images/boke/wave.png"></a></li>
  17. <li><a href=""><img src="images/boke/Dandyweng.jpg"></a></li>
  18. </ul>
  19. <ol class="bar">
  20. </ol>
  21. <!--左右焦点-->
  22. <div id="arr">
  23. <span id="left">
  24. <
  25. </span>
  26. <span id="right">
  27. >
  28. </span>
  29. </div>
  30. </div>
  31. </div>
  32. <script type="text/javascript" src="js/pic.js"></script>
  33. </body>
  34. </html>

css代码

  1. * {
  2. margin: 0;
  3. padding: 0
  4. }
  5. .box {
  6. width: 500px;
  7. height: 300px;
  8. border: 1px solid #ccc;
  9. margin: 100px auto;
  10. padding: 5px;
  11. }
  12. .inner{
  13. width: 500px;
  14. height: 300px;
  15. position: relative;
  16. overflow: hidden;
  17. }
  18. .inner img{
  19. width: 500px;
  20. height: 300px;
  21. vertical-align: top
  22. }
  23. ul {
  24. width: 1000%;
  25. position: absolute;
  26. list-style: none;
  27. left:0;
  28. top: 0;
  29. }
  30. .inner li{
  31. float: left;
  32. }
  33. ol {
  34. position: absolute;
  35. height: 20px;
  36. right: 20px;
  37. bottom: 20px;
  38. text-align: center;
  39. padding: 5px;
  40. }
  41. ol li{
  42. display: inline-block;
  43. width: 20px;
  44. height: 20px;
  45. line-height: 20px;
  46. background-color: #fff;
  47. margin: 5px;
  48. cursor: pointer;
  49. }
  50. ol .current{
  51. background-color: red;
  52. }
  53. #arr{
  54. display: none;
  55. }
  56. #arr span{
  57. width: 40px;
  58. height: 40px;
  59. position: absolute;
  60. left: 5px;
  61. top: 50%;
  62. margin-top: -20px;
  63. background: #fff;
  64. cursor: pointer;
  65. line-height: 40px;
  66. text-align: center;
  67. font-weight: bold;
  68. font-family: '黑体';
  69. font-size: 30px;
  70. color: #000;
  71. opacity: 0.5;
  72. border: 1px solid #fff;
  73. }
  74. #arr #right {
  75. right: 5px;
  76. left: auto;
  77. }

js代码

  1. /** * * @param id 传入元素的id * @returns {HTMLElement | null} 返回标签对象,方便获取元素 */
  2. function my$(id) {
  3. return document.getElementById(id);
  4. }
  5. //获取各元素,方便操作
  6. var box=my$("box");
  7. var inner=box.children[0];
  8. var ulObj=inner.children[0];
  9. var list=ulObj.children;
  10. var olObj=inner.children[1];
  11. var arr=my$("arr");
  12. var imgWidth=inner.offsetWidth;
  13. var right=my$("right");
  14. var pic=0;
  15. //根据li个数,创建小按钮
  16. for(var i=0;i<list.length;i++){
  17. var liObj=document.createElement("li");
  18. olObj.appendChild(liObj);
  19. liObj.innerText=(i+1);
  20. liObj.setAttribute("index",i);
  21. //为按钮注册mouseover事件
  22. liObj.onmouseover=function () {
  23. //先清除所有按钮的样式
  24. for (var j=0;j<olObj.children.length;j++){
  25. olObj.children[j].removeAttribute("class");
  26. }
  27. this.className="current";
  28. pic=this.getAttribute("index");
  29. animate(ulObj,-pic*imgWidth);
  30. }
  31. }
  32. //设置ol中第一个li有背景颜色
  33. olObj.children[0].className = "current";
  34. //克隆一个ul中第一个li,加入到ul中的最后=====克隆
  35. ulObj.appendChild(ulObj.children[0].cloneNode(true));
  36. var timeId=setInterval(onmouseclickHandle,3000);
  37. //左右焦点实现点击切换图片功能
  38. box.onmouseover=function () {
  39. arr.style.display="block";
  40. clearInterval(timeId);
  41. };
  42. box.onmouseout=function () {
  43. arr.style.display="none";
  44. timeId=setInterval(onmouseclickHandle,3000);
  45. };
  46. right.onclick=onmouseclickHandle;
  47. function onmouseclickHandle() {
  48. //如果pic的值是5,恰巧是ul中li的个数-1的值,此时页面显示第六个图片,而用户会认为这是第一个图,
  49. //所以,如果用户再次点击按钮,用户应该看到第二个图片
  50. if (pic == list.length - 1) {
  51. //如何从第6个图,跳转到第一个图
  52. pic = 0;//先设置pic=0
  53. ulObj.style.left = 0 + "px";//把ul的位置还原成开始的默认位置
  54. }
  55. pic++;//立刻设置pic加1,那么此时用户就会看到第二个图片了
  56. animate(ulObj, -pic * imgWidth);//pic从0的值加1之后,pic的值是1,然后ul移动出去一个图片
  57. //如果pic==5说明,此时显示第6个图(内容是第一张图片),第一个小按钮有颜色,
  58. if (pic == list.length - 1) {
  59. //第五个按钮颜色干掉
  60. olObj.children[olObj.children.length - 1].className = "";
  61. //第一个按钮颜色设置上
  62. olObj.children[0].className = "current";
  63. } else {
  64. //干掉所有的小按钮的背景颜色
  65. for (var i = 0; i < olObj.children.length; i++) {
  66. olObj.children[i].removeAttribute("class");
  67. }
  68. olObj.children[pic].className = "current";
  69. }
  70. }
  71. left.onclick=function () {
  72. if (pic==0){
  73. pic=list.length-1;
  74. ulObj.style.left=-pic*imgWidth+"px";
  75. }
  76. pic--;
  77. animate(ulObj,-pic*imgWidth);
  78. for (var i = 0; i < olObj.children.length; i++) {
  79. olObj.children[i].removeAttribute("class");
  80. }
  81. //当前的pic索引对应的按钮设置颜色
  82. olObj.children[pic].className = "current";
  83. };
  84. //设置任意的一个元素,移动到指定的目标位置
  85. function animate(element, target) {
  86. clearInterval(element.timeId);
  87. //定时器的id值存储到对象的一个属性中
  88. element.timeId = setInterval(function () {
  89. //获取元素的当前的位置,数字类型
  90. var current = element.offsetLeft;
  91. //每次移动的距离
  92. var step = 10;
  93. step = current < target ? step : -step;
  94. //当前移动到位置
  95. current += step;
  96. if (Math.abs(current - target) > Math.abs(step)) {
  97. element.style.left = current + "px";
  98. } else {
  99. //清理定时器
  100. clearInterval(element.timeId);
  101. //直接到达目标
  102. element.style.left = target + "px";
  103. }
  104. }, 10);
  105. }

这个轮播图的时间设置的是3s自动切换,想修改切换时间,只需要把js代码中的setInterval(onmouseclickHandle,3000);第二个参数修改就可以了,单位是毫秒。有两个地方大概是45行和53行的位置

效果展示

在这里插入图片描述
ps:更新了一下css文件,上面的css文件大部分都是直接修改所有li ol、、、元素,直接用在别的界面上可能会产生影响,以及*{margin:0; padding:0;}这句就可以删除浏览器这些默认值,所以要改成 div.center * {margin:0; padding:0;},这样就只会修改center这个div里面的东西

  1. div.center * {
  2. margin: 0;
  3. padding: 0
  4. }
  5. .box {
  6. width: 500px;
  7. height: 300px;
  8. border: 1px solid #ccc;
  9. margin: 100px auto;
  10. padding: 5px;
  11. }
  12. .inner{
  13. width: 500px;
  14. height: 300px;
  15. position: relative;
  16. overflow: hidden;
  17. }
  18. .inner img{
  19. width: 500px;
  20. height: 300px;
  21. vertical-align: top
  22. }
  23. .inner ul {
  24. width: 1000%;
  25. position: absolute;
  26. list-style: none;
  27. left:0;
  28. top: 0;
  29. }
  30. .inner li{
  31. float: left;
  32. }
  33. .inner ol {
  34. position: absolute;
  35. height: 20px;
  36. right: 20px;
  37. bottom: 20px;
  38. text-align: center;
  39. padding: 5px;
  40. }
  41. .inner ol li{
  42. display: inline-block;
  43. width: 20px;
  44. height: 20px;
  45. line-height: 20px;
  46. background-color: #fff;
  47. margin: 5px;
  48. cursor: pointer;
  49. }
  50. .inner ol .current{
  51. background-color: red;
  52. }
  53. #arr{
  54. display: none;
  55. }
  56. #arr span{
  57. width: 40px;
  58. height: 40px;
  59. position: absolute;
  60. left: 5px;
  61. top: 50%;
  62. margin-top: -20px;
  63. background: #fff;
  64. cursor: pointer;
  65. line-height: 40px;
  66. text-align: center;
  67. font-weight: bold;
  68. font-family: '黑体';
  69. font-size: 30px;
  70. color: #000;
  71. opacity: 0.5;
  72. border: 1px solid #fff;
  73. }
  74. #arr #right {
  75. right: 5px;
  76. left: auto;
  77. }

发表评论

表情:
评论列表 (有 0 条评论,369人围观)

还没有评论,来说两句吧...

相关阅读