zoukankan      html  css  js  c++  java
  • web前端学习之轮播图实现(原生js)

      很久前接触过html css js 但自己在工作中用的少,简单的需求直接vue 走起,没有静下心好好写点js css 什么的,现在想要好好学习下 大前端的知识了,第一个小练习,做了个轮播图

     网上有很多轮播图的实现过程,每个人都有自己不一样的思路,自己只要实现了就行。当然有些思路确实比我的要好,后续借鉴学习。

    逻辑:将要展示的图片全部放在盒子里,超出部分隐藏,然后设置定时器,没两秒循环一次 img 标签,如果display 为block 就将 display 设置为none  那么后面的图片就到当前的div 区域内了,大体思路是这样 ,当然后面加入了js 时间 支持前后翻页,和提示功能

    上代码如下:

    <!DOCTYPE html>
    <html>
    
    <head>
    	<title>caroucel</title>
    </head>
    
    <style>
    	*{
    		margin:0;
    		padding:0
    	}
    	.box {
    		 300px;
    		height: 250px;
    		border: 1px solid red;
    		position: relative
    	}
    
    	img {
    		 300px;
    		height: 250px;
    	}
    
    	#prev {
    		position: absolute;
    		top: 50%;
    		margin-top: -12px;
    		height: 35px;
    		 15px;
    		background-color: rgba(255, 0, 0, .6);
    		vertical-align: center;
    		line-height: 35px;
    		cursor:pointer;
    
    	}
    
    	#next {
    		position: absolute;
    		top: 50%;
    		right: 0;
    		margin-top: -12px;
    		height: 35px;
    		 15px;
    		background-color: rgba(255, 0, 0, .6);
    		vertical-align: center;
    		line-height: 35px;
    		cursor:pointer;
    
    
    	}
    </style>
    
    <body>
    	<div class='box' style='overflow: hidden'>
    		<img src="./1" alt="">
    		<img src="./2" alt="">
    		<img src="./3" alt="">
    		<img src="./4" alt="">
    		<img src="./5" alt="">
    		<span id='prev'>
    		< </span> <span id='next'> >
    		</span>
    		
    	</div><div id='dd'></div>
    
    	<script>
    		// 修改样式为块
    		function inintBlock() {
    			const imgObjs = document.getElementsByTagName("img")
    			for (let i = 0; i < imgObjs.length; i++) {
    				imgObjs[i].style.display = 'block'
    			}
    		}
    		inintBlock()
    		function operate() {
    			const imgObjs = document.getElementsByTagName("img")
    			for (let i = 0; i < imgObjs.length; i++) {
    				if (imgObjs[i].style.display === 'block') {
    					imgObjs[i].style.display = 'none'
    					break;
    				}
    			}
    			const state = Array.prototype.slice.call(imgObjs).map(function (item) { return item.style.display })
    			const res = state.filter(function (i) { return i === 'none' })
    			if (res.length === 5) {
    				inintBlock()
    			}
    
    		}
    
    		let interval = window.setInterval(
    			function () {
    				operate()
    			}, 2000
    		)
    
    		const el = document.getElementsByClassName('box')[0]
    
    		el.addEventListener('mouseenter', function (event) {
    			window.clearInterval(interval)
    		})
    
    		el.addEventListener('mouseleave', function (event) {
    			interval = window.setInterval(function () { operate() }, 2000)
    		})
    
    		document.getElementById('prev').addEventListener('click',
    			//获取当前images 的属性进行遍历,找block属性,修改前一个节点样式
    			function () {
    				const imgObjs = document.getElementsByTagName("img")
    				for (let i = 0; i <imgObjs.length;i++){
    					if(imgObjs[i].style.display === 'block'){
    						if(i-1<0){
    							document.getElementsByClassName('box')[0].nextSibling.innerText = '已经是首页了'
    							break;
    						}
    						imgObjs[i-1].style.display = 'block'
    						break;
    					}
    				}
    			})
    
    		document.getElementById('next').addEventListener('click',function(){
    			const imgObjs = document.getElementsByTagName("img")
    				for (let i = 0; i <imgObjs.length;i++){
    					if(imgObjs[i].style.display === 'block'){
    						if(i+1>4){
    							document.getElementsByClassName('box')[0].nextSibling.innerText = '已经是最后一页了'
    							break;
    						}
    						imgObjs[i].style.display = 'none'
    						break;
    					}
    				}
    			
    		})
    
    	</script>
    
    
    </body>
    
    </html>
    

      代码也是很简单的,主要联系下,js 遍历 dom 的操作,孰能生巧,多多练习

    做的过程中有发现个方法,通过定位把几张图片从左往右一次拼接起来,点击的时候向左或者向右触发事件,事件内容是修改各个图片的定位 left right 值 从而产生左右翻滚的效果。(z-index 也是个实现的方法)

    刚开始感觉下手很难,但做着做着方法也就越来越多,根据需求选择最合适的最适合自己的就好。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    下面是一个轮播图左右滑动的实现

    html部分:

    <!DOCTYPE html>

    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Carousel Figure</title>
      <link rel="stylesheet" href="style.css" rel="external nofollow" >
    </head>
    <body>
    <!--从左向右滑动-->
      <nav>
        <ul id="index">
          <li class="on"></li>
          <li></li>
          <li></li>
          <li></li>
          <li></li>
        </ul>
        <ul id="img">
          <li><img src="../images/img1.jpg" alt="img1"></li>
          <li><img src="../images/img2.jpg" alt="img2"></li>
          <li><img src="../images/img3.jpg" alt="img3"></li>
          <li><img src="../images/img4.jpg" alt="img4"></li>
          <li><img src="../images/img5.jpg" alt="img5"></li>
        </ul>
      </nav>
    <script src="script.js"></script>
    </body>
    </html>
     
    css 部分:
    *{
      margin:0;
      padding:0;
    }
    nav{
      width: 720px;
      height: 405px;
      margin:20px auto;
      overflow: hidden;
      position: relative;
    }
    #index{
      position: absolute;
      left:320px;
      bottom: 20px;
     
    }
    #index li{
      width:8px;
      height: 8px;
      border: solid 1px gray;
      border-radius: 100%;
      background-color: #eee;
      display: inline-block;
    }
    #img{
      width: 3600px;/*不给宽高无法移动*/
      height: 405px;
      position: absolute;/*不定义absolute,js无法设置left和top*/
      z-index: -1;
    }
    #img li{
      width: 720px;
      height: 405px;
      float: left;
    }
    #index .on{
      background-color: black;
    }
     
     
    js 部分:
     

    function moveElement(ele,x_final,y_final,interval){//ele为元素对象
      var x_pos=ele.offsetLeft;
      var y_pos=ele.offsetTop;
      var dist=0;
      if(ele.movement){//防止悬停
        clearTimeout(ele.movement);
      }
      if(x_pos==x_final&&y_pos==y_final){//先判断是否需要移动
        return;
      }
      dist=Math.ceil(Math.abs(x_final-x_pos)/10);//分10次移动完成
      x_pos = x_pos<x_final ? x_pos+dist : x_pos-dist;
       
      dist=Math.ceil(Math.abs(y_final-y_pos)/10);//分10次移动完成
      y_pos = y_pos<y_final ? y_pos+dist : y_pos-dist;
       
      ele.style.left=x_pos+'px';
      ele.style.top=y_pos+'px';
       
      ele.movement=setTimeout(function(){//分10次移动,自调用10次
        moveElement(ele,x_final,y_final,interval);
      },interval)
    }

    图片自动轮播:

    var img=document.getElementById('img');

    var list=document.getElementById('index').getElementsByTagName('li');
    var index=0;//这里定义index是变量,不是属性
     
    var nextMove=function(){//一直向右移动,最后一个之后返回
      index+=1;
      if(index>=list.length){
        index=0;
      }
      moveIndex(list,index);
      moveElement(img,-720*index,0,20);
    };
    var play=function(){
      timer=setInterval(function(){
        nextMove();
      },2500);
    };
     
    鼠标覆盖小圆点,实现切换效果:
    for(var i=0;i<list.length;i++){//鼠标覆盖上哪个小圆圈,图片就移动到哪个小圆圈,并停止
      list[i].index=i;//这里是设置index属性,和index变量没有任何联系
      list[i].onmouseover= function () {
        var clickIndex=parseInt(this.index);
        moveElement(img,-720*clickIndex,0,20);
        index=clickIndex;
        moveIndex(list,index);
        clearInterval(timer);
      };
      list[i].onmouseout= function () {//移开后继续轮播
        play();
      };
    }
  • 相关阅读:
    BBS登入和数据库迁移部分
    Auth组件
    【作业】返回一个整形数组中最大子数组地和——当维度达到二维/*待完善*/
    【作业】返回一个整形数组中最大子数组地和——当数量达到10亿
    软件工程课程周学习进度报告——第三周
    软件工程课程周学习进度报告——第二周
    软件工程第一周开课博客
    【作业】返回一个整形数组中最大子数组地和
    《人月神话》读后感其三——第二个系统问题
    《人月神话》读后感其二——从未考虑过的多人协作问题
  • 原文地址:https://www.cnblogs.com/my-python-2019/p/12583853.html
Copyright © 2011-2022 走看看