原生js封装无缝轮播功能

yizhihongxing

下面我将为您介绍如何使用原生js封装无缝轮播功能。

1. 分析需求

在开发轮播图时,我们需要分析出以下需求:

  • 定时轮播:设置一个定时器来实现自动进行图片轮播。
  • 点击切换:在页面上添加左右箭头按钮,点击按钮可以切换到相应的图片。
  • 无缝轮播:在最后一张图和第一张图之间添加一个过渡效果,实现无缝轮播。

2. 实现思路

  • 通过CSS样式来实现页面布局及显示效果。
  • 通过JavaScript来实现轮播功能,包括点击切换、定时轮播和无缝轮播。

3. 简单示例

以下是一个简单的HTML结构:

<div id="slider">
    <ul class="slider-wrapper">
        <li class="slider-item"><a href="#"><img src="images/1.jpg" alt=""></a></li>
        <li class="slider-item"><a href="#"><img src="images/2.jpg" alt=""></a></li>
        <li class="slider-item"><a href="#"><img src="images/3.jpg" alt=""></a></li>
        <li class="slider-item"><a href="#"><img src="images/4.jpg" alt=""></a></li>
        <li class="slider-item"><a href="#"><img src="images/5.jpg" alt=""></a></li>
    </ul>
</div>

接下来,我们通过JavaScript来实现轮播功能。以下是主要步骤:

3.1 初始化页面

在页面加载时,将轮播图的第一张图复制一份并添加到轮播图的最后一项。这样可以实现无缝轮播。同时设置轮播图的总长度和每一个图片项的长度。

var sliderWrapper = document.querySelector('.slider-wrapper');
var sliderItems = document.querySelectorAll('.slider-item');
var slider = document.querySelector('#slider');

// 初始化页面
function init() {
    // 将第一张图片复制一份添加到最后
    sliderWrapper.appendChild(sliderItems[0].cloneNode(true));
    // 获取每个图片项的长度
    sliderLen = sliderItems.length;
    sliderWidth = slider.clientWidth;  // 轮播图总长度
    itemWidth = sliderWidth / sliderLen;  // 图片项的长度
    sliderWrapper.style.width = sliderWidth * (sliderLen + 1) + 'px';  // 设置轮播图总长度
    sliderWrapper.style.left = '-'+ itemWidth +'px';  // 设置初始偏移量
}

init();

3.2 实现自动轮播

使用定时器不断进行偏移量的移动,达到自动轮播的效果。

var offset = itemWidth;
var index = 0;
var isAnimating = false;

// 自动轮播
function startAuto() {
    timer = setInterval(function() {
        index++;
        animate(offset*index);
        if (index == sliderLen) {
            setTimeout(function() {
                sliderWrapper.style.left = '-'+ itemWidth +'px';
            }, 500);
            index = 0;
            isAnimating = false;
        }
    }, 3000);
}

startAuto();

3.3 实现点击切换

在左右两侧添加箭头按钮,点击即可实现图片的切换。

var prevBtn = document.querySelector('.prev');
var nextBtn = document.querySelector('.next');

// 点击按钮进行切换
prevBtn.onclick = function() {
    if (isAnimating) {
        return;
    }
    isAnimating = true;
    index--;
    animate(offset*index);
    if (index == -1) {
        setTimeout(function() {
            sliderWrapper.style.left = '-'+ itemWidth * (sliderLen-1) +'px';
        }, 500);
        index = sliderLen - 2;
    }
    isAnimating = false;
}
nextBtn.onclick = function() {
    if (isAnimating) {
        return;
    }
    isAnimating = true;
    index++;
    animate(offset*index);
    if (index == sliderLen) {
        setTimeout(function() {
            sliderWrapper.style.left = '-'+ itemWidth +'px';
        }, 500);
        index = 0;
    }
    isAnimating = false;
}

3.4 实现动画效果

通过改变轮播图的偏移量来实现动画效果。

// 动画效果
function animate(offset) {
    var newLeft = parseInt(sliderWrapper.style.left)+offset;
    var time = 500;  // 动画时间500ms
    var interval = 10;  // 每10ms执行一次偏移
    var speed = offset/(time/interval);  // 每次偏移的量
    function go() {
        if ((speed > 0 && parseInt(sliderWrapper.style.left) < newLeft) || (speed < 0 && parseInt(sliderWrapper.style.left) > newLeft)) {
            sliderWrapper.style.left = parseInt(sliderWrapper.style.left) + speed + 'px';
            setTimeout(go, interval);
        } else {
            sliderWrapper.style.left = newLeft + 'px';
        }
    }
    go();
}

4. 完整示例

完整的HTML、CSS、JavaScript代码如下示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>无缝轮播</title>
    <style>
        #slider {
            width: 800px;
            height: 300px;
            overflow: hidden;
            position: relative;
        }
        #slider .slider-wrapper {
            width: 100%;
            height: 300px;
            position: absolute;
            top: 0;
            left: 0;
        }
        #slider .slider-item {
            width: 800px;
            height: 300px;
            float: left;
        }
        #slider .slider-item img {
            width: 100%;
            height: 100%;
            display: block;
        }
        #slider .arrow {
            position: absolute;
            top: 50%;
            margin-top: -16px;
            width: 30px;
            height: 30px;
            background-color: #fff;
            border-radius: 50%;
            text-align: center;
            line-height: 30px;
            cursor: pointer;
        }
        #slider .prev {
            left: 20px;
        }
        #slider .next {
            right: 20px;
        }
    </style>
</head>
<body>
    <div id="slider">
        <ul class="slider-wrapper">
            <li class="slider-item"><a href="#"><img src="images/1.jpg" alt=""></a></li>
            <li class="slider-item"><a href="#"><img src="images/2.jpg" alt=""></a></li>
            <li class="slider-item"><a href="#"><img src="images/3.jpg" alt=""></a></li>
            <li class="slider-item"><a href="#"><img src="images/4.jpg" alt=""></a></li>
            <li class="slider-item"><a href="#"><img src="images/5.jpg" alt=""></a></li>
        </ul>
        <div class="arrow prev">左</div>
        <div class="arrow next">右</div>
    </div>

    <script>
        var sliderWrapper = document.querySelector('.slider-wrapper');
        var sliderItems = document.querySelectorAll('.slider-item');
        var slider = document.querySelector('#slider');
        var prevBtn = document.querySelector('.prev');
        var nextBtn = document.querySelector('.next');
        var itemWidth = slider.clientWidth / sliderItems.length;
        var offset = itemWidth;
        var index = 0;
        var isAnimating = false;

        function init() {
            // 将第一张图片复制一份添加到最后
            sliderWrapper.appendChild(sliderItems[0].cloneNode(true));
            // 轮播图总长度
            sliderWrapper.style.width = slider.clientWidth * (sliderItems.length + 1) + 'px';
            // 图片项的长度
            for (var i = 0; i < sliderItems.length; i++) {
                sliderItems[i].style.width = itemWidth + 'px';
            }
            // 设置初始偏移量
            sliderWrapper.style.left = '-' + itemWidth + 'px';
        }

        // 动画效果
        function animate(offset) {
            var newLeft = parseInt(sliderWrapper.style.left)+offset;
            var time = 500;  // 动画时间500ms
            var interval = 10;  // 每10ms执行一次偏移
            var speed = offset/(time/interval);
            function go() {
                if ((speed > 0 && parseInt(sliderWrapper.style.left) < newLeft) || (speed < 0 && parseInt(sliderWrapper.style.left) > newLeft)) {
                    sliderWrapper.style.left = parseInt(sliderWrapper.style.left) + speed + 'px';
                    setTimeout(go, interval);
                } else {
                    sliderWrapper.style.left = newLeft + 'px';
                }
            }
            go();
        }

        // 点击按钮进行切换
        prevBtn.onclick = function() {
            if (isAnimating) {
                return;
            }
            isAnimating = true;
            index--;
            animate(offset*index);
            if (index == -1) {
                setTimeout(function() {
                    sliderWrapper.style.left = '-' + itemWidth * (sliderItems.length-1) + 'px';
                }, 500);
                index = sliderItems.length - 2;
            }
            isAnimating = false;
        }
        nextBtn.onclick = function() {
            if (isAnimating) {
                return;
            }
            isAnimating = true;
            index++;
            animate(offset*index);
            if (index == sliderItems.length) {
                setTimeout(function() {
                    sliderWrapper.style.left = '-' + itemWidth + 'px';
                }, 500);
                index = 0;
            }
            isAnimating = false;
        }

        // 自动轮播
        function startAuto() {
            timer = setInterval(function() {
                index++;
                animate(offset*index);
                if (index == sliderItems.length) {
                    setTimeout(function() {
                        sliderWrapper.style.left = '-' + itemWidth + 'px';
                    }, 500);
                    index = 0;
                }
            }, 3000);
        }

        init();
        startAuto();
    </script>
</body>
</html>

5. 结语

通过上述示例代码,您可以在网页中实现一个无缝的轮播图,并且可以添加相应的操作按钮,非常方便实用。但具体实现过程中,需要根据具体网页的需求进行调整,才能得到最佳的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js封装无缝轮播功能 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • 关于vue.js弹窗组件的知识点总结

    下面是关于vue.js弹窗组件的知识点总结,主要包括组件创建、使用、传值等方面的内容。 1. 组件创建 1.1 创建基础组件 在Vue.js中,我们可以通过Vue.component方法来创建组件,如下所示: Vue.component(‘my-dialog’, { template: ` <div class="my-dialog&quot…

    css 2023年6月10日
    00
  • JS实现的RGB网页颜色在线取色器完整实例

    下面是“JS实现的RGB网页颜色在线取色器完整实例”的详细攻略。 1. 实现思路 此取色器实现的主要流程如下: 生成一个颜色面板 当用户点击面板中的某个颜色区域,该区域的颜色会被选中 预览区域实时展示当前选中的颜色 点击确认按钮将选中的颜色返回 2. HTML 结构 首先在 HTML 文件中定义以下结构: <div class="color-…

    css 2023年6月9日
    00
  • IE6下伪类hover失效问题及解决办法

    IE6下伪类hover失效问题及解决办法的完整攻略如下: 1. 问题描述 在IE6浏览器中,当使用伪类:hover控制元素状态时,会出现失效的问题,即鼠标悬停在元素上时,元素状态未发生改变。 2. 原因分析 IE6浏览器不支持:hover伪类的渲染,即鼠标悬停在元素上时无法触发:hover状态的渲染效果。因此,我们需要使用其他的方法来实现元素状态的控制。 3…

    css 2023年6月9日
    00
  • JS弹出层的显示与隐藏示例代码

    JS弹出层是Web开发中非常常见的一个功能。下面,我们来详细讲解如何实现JS弹出层的显示与隐藏。 1. HTML结构 首先,我们需要进行HTML结构的搭建。以下是一个最基础的HTML结构: <!–触发弹出层的按钮–> <button id="showBtn">显示弹出层</button> <!…

    css 2023年6月11日
    00
  • jQuery过滤选择器用法示例

    jQuery过滤选择器是一种非常有用的工具,它可以帮助我们筛选出特定的DOM元素,让我们可以更加方便地对它们进行操作。在本篇文章中,我们将对jQuery过滤选择器的用法进行详细讲解,并提供两个示例来进一步说明。 一、基本语法 在jQuery中,过滤选择器的语法非常简单,只需要在jQuery对象后面加上一个选择器即可。例如,我们可以通过以下方式选择所有的段落元…

    css 2023年6月9日
    00
  • CSS:清除浮动的最优方法

    确保元素内部及外部不留空白的情况下清除浮动是CSS中非常重要的一项技能。下面是“CSS:清除浮动的最优方法”的完整攻略: 什么是浮动 “浮动”是一种CSS布局技术,可将元素沿着页面的水平方向左或右移动,直到它们遇到其它元素或页面边缘为止。在CSS中,用float属性来实现元素浮动。 清除浮动的原因 浮动元素会脱离文档流并浮在页面周围。这可能导致父元素高度缩小…

    css 2023年6月10日
    00
  • CSS3通过var()和calc()函数实现动画特效

    CSS3通过var()和calc()函数实现动画特效是一种灵活而有趣的方式,可以让网页设计师和开发者轻松地添加各种交互式动画效果。下面是一个详细的攻略,包含两个示例说明: 1. var()函数 1.1 基本概念 var()函数是CSS3的一个新特性,可以用来声明和引用自定义的CSS变量。通过定义变量并使用var()函数,网页设计师和开发者可以轻松地更新、调整…

    css 2023年6月10日
    00
  • javascript高仿热血传奇游戏实现代码

    下面是“javascript高仿热血传奇游戏实现代码”的完整攻略。 简介 热血传奇是一个经典的网游,我们可以通过使用 JavaScript 和 HTML5 技术来实现一个类似的网页游戏。在这个游戏中,我们可以实现玩家角色的创建、地图的绘制、怪物的生成和战斗系统等。下面将分几个步骤来实现这个游戏。 步骤 第一步:创建地图和角色 我们可以使用 canvas 元素…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部