js实现3d轮播图效果

javascript实现的3d轮播图功能有左右箭头切换、自动轮播、移入暂停轮播、移出继续轮播、点击图片轮播、防抖、节流。

效果图

在这里插入图片描述

以下为实现代码:
html部分:
    <div class="box">
        <div class="wrapper">
            <img src="./img/01.webp" class="image">
            <img src="./img/02.webp" class="image">
            <img src="./img/03.webp" class="image">
            <img src="./img/04.webp" class="image">
            <img src="./img/05.webp" class="image">
        </div>
        <div class="btn" id="btn">
            <span class="left"><</span>
            <span class="right">></span>
        </div>
        <ul class="point"></ul>
    </div>
css部分:

        * {
            margin: 0;
            padding: 0;
        }
        .box {
            position: relative;
            /* width: 1500px;
            height: 400px; */
            width: 100%;
            height: 100%;
            top: 200px;
            margin: auto;
        }
        .wrapper{
            position: absolute;
            width: 100%;
            height: 100%;
            background-color: #eee;
            perspective: 800px;
            transform-style: preserve-3d;
        }
        .image{
            float: left;
            width: 300px;
            height: 200px;
            position: absolute;
            left: 0;
            top: 0;
            right: 0;
            bottom: 0;
            margin: auto;
            border-radius: 8px;
            transition: transform 1s ease-in-out;
        }
        
        /* 左右按钮 */
        .btn{
            position: relative;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -25px);
            width: 1250px;
            z-index: 999
        }
        .btn .left,
        .btn .right {
            position: absolute;
            width: 50px;
            height: 50px;
            font-size: 30px;
            text-align: center;
            cursor: pointer;
            color: white;
            line-height: 50px;
            border-radius: 50%;
            background-color: rgba(0,0,0,0.4);
        }
        .btn .left {
            left: 0;
        }
        .btn .right {
            right: 0;
        }
        .btn span:hover {
            background-color: rgba(0,0,0,0.7);
        }
        
        /* 小圆圈 */
        .point{
            position: absolute;
            left: 50%;
            bottom: 10px;
            transform: translate(-50%, 200px);
            height: 14px;
            z-index: 999
        
        }
        .point>li {
            list-style: none;
            width: 14px;
            height: 14px;
            border-radius: 50%;
            background-color: white;
            float: left;
            margin: 0 2px;
            border: 2px solid rgb(160, 162, 167);
            box-sizing: border-box;
        }
        .point .current {
            border: 2px solid rgb(70, 71, 71);
            background-color: rgb(119, 116, 116);
        }
        
javascript部分:

        var imgs = document.getElementsByTagName("img");
        var btns = document.getElementsByTagName("span");
        var ul = document.getElementsByTagName("ul");
        var lis = document.getElementsByTagName("li");
        var len = imgs.length;
        var current = 0;
        let flag = true;
        var timer;
        
        function wrapper() {
            frount();
            bind();
            getLi();
            btnClick();
            showLis();
            autoplay();
        };
        wrapper();
        
        // 图片移动
        function frount() {
            var mlen = Math.floor(len / 2);
            var limg, rimg;
            for (var i = 0; i < mlen; i++) {
                limg = len + current - i - 1;
                rimg = current + i + 1;
                if (limg >= len) {
                    limg -= len;
                }
                if (rimg >= len) {
                    rimg -= len; 
                }
                imgs[limg].style.transform = `translateX(` + (150) * (i + 1) + `px) translateZ(` + (200 - i * 100) + `px) rotateY(-30deg)`;
                imgs[rimg].style.transform = `translateX(` + (-150) * (i + 1) + `px) translateZ(` + (200 - i * 100) + `px) rotateY(30deg)`;
            }
            imgs[current].style.transform = `translateZ(300px)`;
            
        };
        
        // 点击图片
        function bind() {
            for (var i = 0; i < len; i++) {
                (function (i) {
                    imgs[i].onclick = function () {
                        current = i;
                        frount();
                        autoLi();
                    }
                })(i);
                imgs[i].onmouseenter = function () {
                    clearInterval(timer);
                }
                imgs[i].onmouseout = function () {
                    autoplay();
                }
            }
        };
        
        // 自动更换图片
        function autoplay() {
            timer = setInterval(function () {
                if (current >= len - 1) {
                    current = 0;
                } else {
                    current++;
                }
                frount();
                autoLi();
            }, 2000)
        }
        
        // 点击左右按钮
        function btnClick() {
            for (var i = 0; i < btns.length; i++) {
                (function (i) {
                    btns[i].onclick = function () {
                        if (!flag) { return; }
                        flag = false;
                        // 左按钮
                        if(i==0){
                            if (current <= 0) {
                                current = len - 1;
                            } else {
                                current--;
                            }
                        }
                        // 右按钮
                        if(i==1){
                            if (current >= len - 1) {
                                current = 0;
                            } else {
                                current++;
                            }
                            
                        }
                        setTimeout(() => {
                            flag = true;
                        }, 800);
                        frount();
                        autoLi();
                    }
                })(i);
                btns[i].onmouseenter = function () {
                    clearInterval(timer);
                }
                btns[i].onmouseout = function () {
                    autoplay();
                }
            }
        };
        
        // 点击小圆圈
        function getLi (){
            for(var i = 0; i < len; i++){
                (function (i) {
                    ul[0].innerHTML +="<li></li>"
                    }
                )(i);
            }
            lis[0].classList.add("current")
        }
        
        function showLis() {
            for (var i = 0; i < len; i++) {
                (function (i) {
                    lis[i].onclick = function () {
                        // 排他思想
                        for (var k = 0; k < len; k++) {
                            lis[k].classList.remove("current")
                        }
                        this.classList.add("current")
                        current = i;
                        frount();
                    }
                })(i);
                lis[i].onmouseenter = function () {
                    clearInterval(timer);
                }
                lis[i].onmouseout = function () {
                    autoplay();
                }
            }
        }
        function autoLi() {
            for (var i = 0; i < len; i++) {
                if (i == current) {
                    lis[i].classList.add("current")
                } else {
                    lis[i].className = '';
                }
            }
        }

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用CSS3的transform属性和transition属性来实现3D透视轮播图特效。以下是一个示例代码: HTML代码: ``` <div class="slider"> <div class="slide"> <img src="image1.jpg"> </div> <div class="slide"> <img src="image2.jpg"> </div> <div class="slide"> <img src="image3.jpg"> </div> <div class="slide"> <img src="image4.jpg"> </div> </div> ``` CSS代码: ``` .slider { position: relative; width: 600px; height: 400px; margin: 0 auto; perspective: 1000px; /* 透视距离 */ } .slide { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; transition: all 1s ease-in-out; /* 动画过渡效果 */ transform-origin: center center -200px; /* 透视点 */ } .slide.active { opacity: 1; transform: translateZ(0); /* 3D效果 */ } .slide.next { transform: rotateY(-90deg) translateZ(200px); /* 3D旋转效果 */ } .slide.prev { transform: rotateY(90deg) translateZ(200px); /* 3D旋转效果 */ } .slider:hover .slide.prev { transform: rotateY(60deg) translateZ(200px); /* 鼠标移入时的旋转效果 */ } .slider:hover .slide.next { transform: rotateY(-60deg) translateZ(200px); /* 鼠标移入时的旋转效果 */ } ``` JavaScript代码: ``` var slides = document.querySelectorAll('.slide'); var currentSlide = 0; var slideInterval = setInterval(nextSlide, 5000); /* 自动轮播间隔时间 */ function nextSlide() { slides[currentSlide].className = 'slide prev'; /* 当前slide变为prev */ currentSlide = (currentSlide + 1) % slides.length; slides[currentSlide].className = 'slide next'; /* 下一个slide变为next */ setTimeout(function() { slides[currentSlide].className = 'slide active'; /* 下一个slide变为active */ }, 50); /* 延迟50毫秒,等待prev和next的动画完成 */ } ``` 此代码实现了一个自动轮播的3D透视轮播图特效,当鼠标移入时,当前slide会向左旋转,下一个slide会向右旋转。您可以根据需要调整CSS和JavaScript代码以满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值