原生js封装无缝轮播功能

下面我将为您介绍如何使用原生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日

相关文章

  • JQuery标签页效果实例详解

    下面我来详细讲解一下“JQuery标签页效果实例详解”的完整攻略。 1. 功能介绍 这个JQuery标签页效果实例主要实现的功能是:通过点击标签页来切换不同的内容区域。实现的效果比较简单,但常用于网站制作中,对于了解和应用JQuery有很大的帮助作用。 2. 实现过程 2.1 简单的HTML结构 为了实现标签页的效果,我们需要定义一个HTML结构。这个结构比…

    css 2023年6月9日
    00
  • CSS属性中Display与Visibility区别分析

    以下是关于“CSS属性中Display与Visibility区别分析”的详细攻略: Display 与 Visibility 的区别 Display 与 Visibility 都是 CSS 属性用于控制元素的显示和隐藏,但它们的实现方式有所不同,主要体现在以下两方面: 1. 元素的完全不展示 Display 属性可以完全隐藏元素,不占据文档流,且不保留元素的…

    css 2023年6月10日
    00
  • 如何在 Illustrator 中存储图稿?AI图稿存储五大基本格式

    在 Illustrator 中,我们可以使用不同的格式来存储图稿,并根据不同的需求选择合适的格式。下面是五种基本的存储格式: AI 格式 AI 格式是 Adobe Illustrator 的原生格式。当我们需要在 Illustrator 中对图稿进行修改或编辑时,应该使用 AI 格式进行存储。AI 格式不仅可以保存所有的图层信息、样式、效果和笔刷,还可以保存…

    css 2023年6月10日
    00
  • 纯CSS实现网页内部锚点跳转时上下偏移的示例代码

    下面是“纯CSS实现网页内部锚点跳转时上下偏移的示例代码”的完整攻略: 一、需求分析 在网页内部进行跳转时,我们经常希望能够有一个辅助定位的功能,比如锚点跳转。但是,如果锚点存在于页面的中央,我们希望跳转后能够有一个上下位移的效果,来使页面的焦点更加精准,这就需要我们实现“网页内部锚点跳转时上下偏移”的功能。 二、解决方案 1. 使用margin负值 我们可…

    css 2023年6月10日
    00
  • 用js实现的自定义的对话框的实现代码

    此处提供实现自定义对话框的基本思路和代码示例。请注意,这只是一个示例,具体的实现过程可能因具体需求而异。 基本思路 要实现自定义对话框,需要用HTML、CSS和JavaScript实现一个弹出框,并将其放置在网页中需要的位置。以下是其基本思路: HTML中,先定义一个包含弹出框内容的div; CSS中,为这个div添加样式,使其从默认隐藏状态变为弹出框; J…

    css 2023年6月11日
    00
  • ThinkPHP Mobile使用方法简明教程

    ThinkPHP Mobile使用方法简明教程 什么是ThinkPHP Mobile ThinkPHP Mobile是ThinkPHP团队开发的一款基于移动Web开发框架,支持响应式设计,适配不同屏幕尺寸的手机、平板和PC端设备,同时支持多种常用的JS框架,如jQuery、MUI等。 如何安装ThinkPHP Mobile 安装ThinkPHP Mobile…

    css 2023年6月10日
    00
  • css reset样式重置介绍 重置css样式工具分享

    CSS Reset样式重置介绍 在编写前端界面时,由于浏览器的差异化,每个浏览器会对相同的HTML元素样式进行不同的默认渲染。这就会影响到页面的布局和美观程度。为了解决这个问题,CSS重置样式表应运而生,其目的是清除浏览器的默认样式,使不同浏览器渲染出相同的效果。 1. CSS Reset样式重置的原理 CSS Reset样式重置的原理是使用通配符( * )…

    css 2023年6月10日
    00
  • jQuery页面滚动浮动层智能定位实例代码

    先简单介绍一下jQuery页面滚动浮动层智能定位实例代码的作用。这段代码可以实现网页中的浮动层,在页面滚动时自动智能定位,不会随着页面滚动而跑偏。接下来,我们将详细讲解如何实现这个功能,示例代码也会在过程中展示。 第一步:HTML结构 首先,需要在HTML结构中设置一个浮动层的容器,例如: <div class="float-layer&qu…

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