手撕js轮播,其实不难

  • 学了vue2也实现了一些小demo,但是也不能不巩固下js,就写了个轮播
  • 刚开始学时很难,现在自己实现,就会觉得没有那么难
  • 布局是基本的就不详细说了,主要是要把图片全部放到一个位置层叠起来,因为我用的opacity来实现显示
  • 步骤如下,详细看代码

  • 先把图片的全部li设置opacity为0隐藏,第一张图片opacity为1显示一

  • 定义下一张图片函数             

  1. 全局定义了a初始值为0   
  2. 函数里设置a++,加之前     //图片索引+之前先把之前的图片隐藏相应的圆点颜色也先变成白   
  3. 加之前还要判断是否超过最后一张,是的话让a等于第一张
  4.        加之后     //图片索引+之后先把的图片显示相应的圆点颜色也先变成红
  5. 加上对应的节流操作
  • 间隔一段时间自动出现下一张图片

  1. 用定时器,定时器里放刚才定义的函数调用
  • 点击切换下一张图片  

  1. 点击事件函数里设置a减减,减之前     //图片索引减之前先把之前的图片隐藏相应的圆点颜色也先变成白   
  2. 减之前还要判断是否少于0,是的话让a等于最后一张
  3.        减之后     //图片索引+之后先把的图片显示相应的圆点颜色也先变成红
  • 点击切换上一张图片

  1. 点击事件里放置调用上面定义的下一张函数
  • 移入图片时停止图片自动播放

  1. 移入事件时设置停止定时器操作即可
  • 移出时自动播放

  1. 移出事件里用定时器,定时器里放刚才定义的函数调用
  • 图片有相片对应的圆点数,点第几个出来第几张图片

  1. 定义一个for循环i 长度等于圆点数也图片数
  2. 给圆点元素设置点击事件其索引是i,的点击事件
  3. 事件里改变上面定义的a的值等于i,使点击那个圆点索引对应的就是那张图片的索引
  4. 在设置多一个for循环j 长度也是圆点数量
  5. 里层for循环j里面重置圆点的颜色都为白和图片都隐藏
  6. for循环j外层下一行代码就可以设置圆点元素索引为a的颜色为红色 图片元素索引为a的图片显示
  • 相应的逻辑代码都在下面

<body>

    <div id="di">

        <ul id="uls">

         <li class="frist"><a href=""><img src="./assets/1.jpg" alt=""></a></li>

         <li><a href=""><img src="./assets/2.jpg" alt=""></a></li>

         <li><a href=""><img src="./assets/3.jpg" alt=""></a></li>

         <li><a href=""><img src="./assets/4.jpg" alt=""></a></li>

         <li><a href=""><img src="./assets/5.jpg" alt=""></a></li>

         <li><a href=""><img src="./assets/6.jpg" alt=""></a></li>

       

        </ul>

        <ol>

            <li id="lt"> &lt;</li>

            <li id="gt"> &gt;</li>

        </ol>

        <div id="didi">

            <li></li>

            <li></li>

            <li></li>

            <li></li>

            <li></li>

            <li></li>

        </div>

    <script>

     let uls=document.getElementById('uls')

     let lt=document.getElementById('lt')

     let gt=document.getElementById('gt')

     let di=document.getElementById('di')

     let lis=document.querySelectorAll('ul li')

     let didi=document.querySelectorAll('#didi li')

    //定义节流锁

     let lock=true;

//定义切换图片索引数

     let a=0;

//定义定时开关

     let timer1;

// 定义下一张图片函数和节流

    function mose(){

        if(!lock) return;

        lock=false

//图片索引+之前先把之前的图片隐藏相应的圆点颜色也先变成白

        lis[a].style.opacity=0

        didi[a].style.backgroundColor="#fff"

        a++

        if(a==6){

            a=0

        }

//图片索引+之后先把图片显示相应的圆点颜色也先变成红

        lis[a].style.opacity=1

        didi[a].style.backgroundColor="red"

    setTimeout(()=>{

            lock=true;

        },500)

    }

 自动切换图片

timer1=setInterval(()=>{

            mose()

         },2000) 

     //移入图片时停止播放

    di.addEventListener('mouseenter',()=>{

     clearInterval(timer1)

    })

     //离开图片时播放

     di.addEventListener('mouseleave',()=>{

         setInterval(()=>{

            mose()

         },2000) 

     })

    

    // 点击上一张切换

    lt.addEventListener('click',()=>{

        if(!lock) return;

        lock=false

        lis[a].style.opacity=0

        didi[a].style.backgroundColor="#fff"

        a--

        if(a==-1){

            a=5

        }

        lis[a].style.opacity=1

        didi[a].style.backgroundColor="red"

        setTimeout(()=>{

            lock=true;

        },500)

    })

    // 点击下一张图片切换

    gt.addEventListener('click', mose

    )

    // 点击圆点切换到对应的图片

    for (let i=0; i<didi.length; i++){

        didi[i].addEventListener('click',function(){

        a=i

        for (let j=0; j<didi.length; j++){

            lis[j].style.opacity=0

          didi[j].style.backgroundColor="#fff"

        }

        lis[a].style.opacity=1

        didi[a].style.backgroundColor="red"

       

    })

    }

    

    </script>

</body>

</html>

 

 

 

 

 

 

 

 

 

### JavaScript 题目概述 对于JavaScript题目,在面试或者日常练习中,这些题目旨在考察开发者对语言特性和底层原理的理解程度。下面列举了一些常见的题目及其具体实现方式。 #### 新建对象实例 (New) 新建对象实例的过程可以通过模仿`new`关键字的行为来完成。当使用`new`创建一个函数的实例时,会执行一系列特定的操作[^1]: ```javascript function myNew(constructor, ...args) { const obj = Object.create(constructor.prototype); const result = constructor.apply(obj, args); return typeof result === 'object' ? result : obj; } ``` 此代码片段展示了如何手动实现`new`操作符的功能,通过`Object.create()`方法设置新对象的原型链,并利用`apply()`调用构造器函数。 #### 冻结对象 (Freeze) 冻结对象意味着防止任何修改发生于该对象上,这可以借助`Object.freeze()`方法达成。为了更好地理解其工作机理,也可以尝试自己编写类似的逻辑: ```javascript function customFreeze(target) { // 获取目标对象所有的属性名 let propNames = Object.getOwnPropertyNames(target); // 对每一个属性进行遍历处理 for (let name of propNames) { let desc = Object.getOwnPropertyDescriptor(target, name); if ('value' in desc && typeof desc.value === "object") { customFreeze(desc.value); // 递归冻结嵌套的对象 } // 设置当前属性为不可配置且只读 target[name] = { writable: false, configurable: false }; } // 返回经过处理后的对象 return Object.preventExtensions(target); } ``` 这段代码实现了基本的对象冻结功能,包括阻止新增或删除属性以及改变已有属性特性等行为。 #### 创建继承关系 (Create) 除了上述两个例子外,还有其他重要的概念如`Object.create()`用于建立新的空对象并指定其[[Prototype]]链接指向给定的对象。这里给出了一种可能的工版本[^3]: ```javascript function create(proto, propertiesObject) { function F() {} F.prototype = proto; var instance = new F(); if (propertiesObject !== undefined) { Object.defineProperties(instance, propertiesObject); } return instance; } ``` 以上就是几个典型的JavaScript题目案例,它们有助于加深学习者对核心机制的认识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值