如何用JS写一个轮播样式

首先我们捋一下逻辑,一个基本的淘宝轮播图,下方会有一个数字按钮控制轮播,其次是当鼠标划入图片时,左右会出现箭头来控制图片的滑动。鼠标移出过后,轮播会自动划走。根据这个逻辑我们可以开始码代码了。

       1: 首先我们在vscode上面先把基本的代码写上,然后开始用js代码操作css样式,运行一下会出现如下的原始效果。

 

      2:  轮播是的多个图片集合,在一定区域只选择显示一张图片,其余图片则被隐藏,我们要做的就是用js代码改变集合的位置显示其他的图片。如下图是隐藏的图片

 3:现在开始操作js代码

        3-1 首先我们需要获取图片集合的节点以及显示区域的节点

 

        3-2然后就是在图片下方创建一个序列节点来控制图片

3-2-1 把创造的节点加入到集合中,并且选中一张

 

 

 

 3-2-2现在则需要创建一个点击事件来控制图片(里面调用了move函数,我放在了最后)

 3-2-3现在需要鼠标移入然后出现箭头控制图片,当我们点击到最后i一张图片的时候,我们再点击会使得图片回到第一张,但是直接回到第一张会变成反方向,所以我们克隆一张第一张,然后点最后一张先按顺序到克隆的那一张,然后瞬间回到第一张,这样看起来就很流畅的从最后i一张到第一张

 

3-2-4  点击右箭头 

 

3-2-5 点击左箭头

 

  函数定时器

 

move函数

 

 getPos函数

 

 

 最后就可以得到样式啦

 我把全部代码放在下面可以看整体结构,但是图片得自己放嗷

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        * {
            padding: 0;
            margin: 0;
            list-style: none;
            border: 0;
        }

        .all {
            width: 500px;
            height: 300px;
            padding: 7px;
            border: 1px solid #ccc;
            margin: 100px auto;
            position: relative;
        }

        .screen {
            width: 500px;
            height: 300px;
            overflow: hidden;
            position: relative;
        }

        .screen li {
            width: 500px;
            height: 300px;
            overflow: hidden;
            float: left;
        }

        .screen ul {
            position: absolute;
            left: 0px;
            top: 0px;
            width: 3000px;
        }

        .all ol {
            position: absolute;
            right: 10px;
            bottom: 10px;
            line-height: 20px;
            text-align: center;
        }

        .all ol li {
            float: left;
            width: 20px;
            height: 20px;
            background: #fff;
            border: 1px solid #ccc;
            margin-left: 10px;
            cursor: pointer;
        }

        .all ol li.current {
            background: yellow;
        }

        #arr {
            display: none;
            z-index: 1000;

        }

        #arr span {
            width: 40px;
            height: 40px;
            position: absolute;
            left: 5px;
            top: 50%;
            margin-top: -20px;
            background: #000;
            cursor: pointer;
            line-height: 40px;
            text-align: center;
            font-weight: bold;
            font-family: '黑体';
            font-size: 30px;
            color: #fff;
            opacity: 0.3;
            border: 1px solid #fff;
        }

        #arr #right {
            right: 5px;
            left: auto;
        }
    </style>
</head>

<body>
    <div class="all" id='box'>
        <div class="screen" id="screen">
            <ul>
                <li>
                    <img src="images/1.jpg" width="500" />
                </li>
                <li>
                    <img src="images/2.jpg" width="500" />
                </li>
                <li>
                    <img src="images/3.jpg" width="500" />
                </li>
                <li>
                    <img src="images/1.jpg" width="500" />
                </li>
                <li>
                    <img src="images/2.jpg" width="500" />
                </li>
            </ul>
            <ol>

            </ol>
        </div>
        <div id="arr">
            <span id="left">&lt;</span>
            <span id="right">&gt;</span>
        </div>
    </div>
    <script>
        // 1 获取节点
        let scObj = document.querySelector('#screen');
        let ulObj = document.querySelector('ul');
        let liObj = ulObj.children;
        // 左右箭头获取
        let arrObj = document.querySelector('#arr');
        let leftObj = document.querySelector('#left');
        let rightObj = document.querySelector('#right');

        // console.log(liObj);
        let imgW = liObj[0].offsetWidth;
        // console.log(imgW);
        let olObj = document.querySelector('ol');
        let index = 0;
        let timess = '';
        for (let i = 0; i < liObj.length; i++) {
            let newLiObj = document.createElement('li');
            // console.log(newLiObj);
            newLiObj.innerHTML = i + 1;
            olObj.appendChild(newLiObj);
            //  设置第一个下标选中
            i == 0 && newLiObj.classList.add('current');
            // 创建一个点击事件
            newLiObj.onclick = clickFn;
        }

        // 获取ol所有的子节点
        let olLisObj = olObj.children;

        function sel() {
            // 1 当前选中的取消
            document.querySelector('.current').classList.remove('current');
            // 2 选中刚刚点击的
            olLisObj[index].classList.add('current');
            // console.log(olLisObj[index]);

        }
        // 2:序列号回调函数
        function clickFn() {
            // this指向点击的图篇
            // console.log(this);
            // 2-1 获取当前图片的序列号
            index = this.innerHTML - 1;
            // 2-2计算li的left值 调用move函数进行移动
            let tmpVal = imgW * index;
            move(ulObj, {
                left: -tmpVal
            })
            sel();
        }
        // 3  设置移入箭头显示效果
        scObj.parentNode.onmouseover = function () {
            arrObj.style.display = 'block';
            // 清除定时器
            clearInterval(timess)
        }
        scObj.parentNode.onmouseout = function () {
            arrObj.style.display = 'none';
            auto(); //自动播放,函数在后面
        }
        // 克隆第一张图片,放到最后面
        let cloneImg = liObj[0].cloneNode(true)
        // console.log(cloneImg);
        cloneImg.style.borderTop = '1px solid red';

        // 追加到ul最后
        ulObj.appendChild(cloneImg)

        /******右箭头,下一张****/
        rightObj.onclick = function () {
            // 1-1 判断index值是否为最大索引
            let target = '';
            let status = false;
            // index ,克隆的不能算
            if (index == olLisObj.length - 1) {
                index++; // 让克隆的一张显示出来
                target = imgW * index;
                index = 0; // 计算目标之后,归零
                status = true; //  将ul的left设置为0的,状态值

                // console.log(index, status);
            } else {
                // 1 index值增加
                index++;
                target = imgW * index;
            }
            // 2 计算left值

            move(ulObj, {
                left: -target
            }, function () {
                status && (ulObj.style.left = '0px');
            })
            // 选中序列号
            sel();
        }
        /******上一张 left*****/
        leftObj.onclick = function () {
            index--;
            if (index == -1) {
                // 设置克隆的第一张显示出来
                ulObj.style.left = -olLisObj.length * imgW + 'px';
                // 给index最大索引值
                index = olLisObj.length - 1;
            }
            let target = imgW * index;
            move(ulObj, {
                left: -target
            }, function () {
                status && (ulObj.style.left = '0px');
            });
            sel();
        }
        /*****定时器,自动轮播******/
        function auto() {
            timess = setInterval(() => {
                rightObj.onclick();
            }, 3000)
        }
        auto();
        var times = '';
        function move(ele, target, cb) {
            clearInterval(times);
            times = setInterval(function () {
                var onOff = true;
                // 遍历运动的方向和目标
                for (let attr in target) {
                    // attr 表示运动的属性
                    // 获取元素属性的实时值
                    let tmpVal = parseInt(getPos(ele, attr))
                    // console.log(getPos(ele, attr));
                    // 计算speed-
                    // console.log(tmpVal, attr);
                    let speed = (target[attr] - tmpVal) / 10;
                    // 取整
                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                    // 停止计时器,当一个属性运动到位置,设置开关状态
                    if (tmpVal == target[attr]) onOff = true;
                    // 让元素动起来
                    ele.style[attr] = tmpVal + speed + 'px';
                }
                // 判断开关状态,清除定时器
                for (var moveAttr in target) {
                    // 如果不相等,就说明有属性没有运动到位置,定时器不能停止
                    if (target[moveAttr] !== parseInt(getPos(ele, moveAttr))) {
                        onOff = false;
                        break;
                    }
                }
                if (onOff) {
                    clearInterval(times);
                    cb && cb();
                }
                // console.log(1111);
            }, 30)
        }
        // 获取元素的实时位置的函数
        function getPos(obj, attr) {
            if (obj.currentStyle) { // 获取css的样式
                return obj.currentStyle[attr];
            } else {
                return getComputedStyle(obj)[attr]
            }
        }
    </script>
</body>

</html>

 

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴为您解答!首先,你可以使用JavaScript来创建一个轮播图,你可以使用HTML元素和CSS来定义它的外观,然后使用JavaScript来控制轮播图的行为。具体的实现方法可以参考这些教程:https://www.w3schools.com/js/js_slideshow.asp。 ### 回答2: 要用JavaScript来编一个简单的轮播图,可以按如下步骤进行: 1. 首先,创建一个HTML文件,包含一个包裹轮播图的容器元素。例如: ```html <div id="slideshow"></div> ``` 2. 在JavaScript文件中,获取轮播图容器的引用,并定义一个计数器变量用于跟踪当前显示的图片索引: ```javascript var slideshowContainer = document.getElementById("slideshow"); var currentSlideIndex = 0; ``` 3. 创建一个图片数组,包含要轮播的图片URL: ```javascript var imageUrls = ["image1.jpg", "image2.jpg", "image3.jpg"]; ``` 4. 定义一个函数,用于更新轮播图显示的图片: ```javascript function updateSlide() { // 移除之前的图片 while (slideshowContainer.firstChild) { slideshowContainer.removeChild(slideshowContainer.firstChild); } // 创建新的图片元素 var img = document.createElement("img"); img.src = imageUrls[currentSlideIndex]; // 添加到轮播图容器 slideshowContainer.appendChild(img); } ``` 5. 创建一个函数,用于自动切换到下一张图片: ```javascript function nextSlide() { currentSlideIndex++; if (currentSlideIndex >= imageUrls.length) { currentSlideIndex = 0; } updateSlide(); } ``` 6. 调用`updateSlide`函数来初始化轮播图的第一张图片: ```javascript updateSlide(); ``` 7. 最后,使用`setInterval`函数设置一个定时器,每隔一定的时间自动切换到下一张图片: ```javascript setInterval(nextSlide, 3000); ``` 这样,一个简单的使用JavaScript轮播图就完成了。你可以根据需要自定义样式和添加其他功能。 ### 回答3: 轮播图是网页设计中常用的一种展示多张图片或内容的方式。通过使用JavaScript,可以实现一个简单而流畅的轮播图效果。 首先,我们需要一个 HTML 结构来放置轮播图的容器和图片。例如: ```html <div class="slideshow"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <img src="image3.jpg" alt="Image 3"> </div> ``` 然后,我们可以使用CSS来设置轮播图样式,例如设置容器的宽度和高度,并隐藏超出容器范围的图片。 ```css .slideshow { width: 800px; height: 400px; overflow: hidden; } ``` 接下来,我们可以编JavaScript代码来实现轮播图的功能。首先,我们定义一个变量来保存当前显示的图片索引。 ```javascript var currentSlide = 0; ``` 然后,我们可以编一个函数来切换图片。传入一个参数,表示要切换到的图片索引。在函数内部,我们可以通过修改容器内部图片的`margin-left`属性,来实现图片切换的效果。 ```javascript function showSlide(index) { var slideshow = document.querySelector('.slideshow'); slideshow.style.marginLeft = '-' + (index * 800) + 'px'; currentSlide = index; } ``` 接下来,我们可以使用定时器来自动播放轮播图。在每隔一定的时间间隔后,调用`showSlide`函数来切换到下一张图片。 ```javascript setInterval(function() { var nextSlide = (currentSlide + 1) % 3; // 假设有3张图片 showSlide(nextSlide); }, 3000); // 每隔3秒切换一次图片 ``` 最后,我们只需在页面加载完毕后调用`showSlide`函数,让轮播图默认显示第一张图片即可。 ```javascript window.addEventListener('load', function() { showSlide(0); // 默认显示第一张图片 }); ``` 以上就是使用JavaScript一个简单的轮播图效果的方法。实际应用中,还可以通过添加一些触摸和点击事件来实现更多的交互效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值