js 实现淘宝轮无缝播图效果,带完整解析版源码(陆续更新中.....)

前言:

????????本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽。

????????本篇文章为您分析一下原生JS写淘宝无缝轮播图效果

需求分析:

HTML需求
 1. 首先要有一个可视区域(banner)

 2. 在可视区域(banner)下有一个存放图片的区域(imgs)

 3. 在可视区域(banner)下还要有一个存放小圆点的区域(dots)

 4. 在可视区域(banner)下还要有一个存放按钮的区域 (arrow)
CSS需求
 1. 可视区域(banner)设置定宽,超出区域需要隐藏

 2. 在可视区域(imgs)下的所有图片需要在一行内显示[imgs宽度会在JS中动态生成]

 3. 小圆点的区域(dots)下的所有子元素设置为小圆点样式

 4. 按钮的区域 (arrow)下的两个图标设置定位。[本文采用的是 ≶ <请自行替换为图标]
JS需求
 1. 可以根据用户的配置信息更改轮播图等信息

 2. 要求能够无缝轮播

 3. ----小圆点的区域(dots)下的所有子元素设置为小圆点样式

 4. ----按钮的区域 (arrow)下的两个图标设置定位。[本文采用的是 ≶ <请自行替换为图标]

HTML结构:


    <div class="banner">
        <div class="imgs" style="width:2600px">
            <!-- 下面的结构需要JS动态传入 -->
            <a href=""><img src="img/1.jpg" alt=""></a>
            <a href=""><img src="img/2.webp" alt=""></a>
            <a href=""><img src="img/3.jpg" alt=""></a>
            <a href=""><img src="img/4.jpg" alt=""></a>
            <a href=""><img src="img/5.webp" alt=""></a>
        </div>
        <div class="dots" style="width:60px">
            <!-- 下面的结构需要JS动态传入 -->
            <span></span>
            <span></span>
            <span></span>
            <span></span>
            <span></span>
        </div>
        <div class="arrow">
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </div>

看看效果

??

CSS样式:

* {
    margin: 0;
    padding: 0;
}

.banner {
    position: relative;
    width: 520px;
    height: 280px;
    border: 2px solid #000000;
    margin: 100px auto;
    /* overflow: hidden; */
}

.banner .imgs img {
    display: block;
    width: 520px;
    height: 280px;
}

.banner .imgs a {
    float: left;
}

.banner .dots {
    position: absolute;
    bottom: 12px;
    left: 0;
    right: 0;
    margin: 0 auto;
    background-color: rgba(255, 255, 255, .3);
    border-radius: 10px;
    padding: 2px 4px;
}

.banner .dots span {
    float: left;
    width: 8px;
    height: 8px;
    margin: 2px;
    background-color: seashell;
    border-radius: 50%;
    cursor: pointer;
}

.banner .dots span.active {
    background-color: skyblue;
}
.banner .arrow {
    /* display: none; */
}

.banner:hover .arrow {
    display: block;
}

.banner .arrow .item {
    cursor: pointer;
    width: 20px;
    height: 30px;
    line-height: 30px;
    position: absolute;
    top: 125px;
    background-color: rgba(0, 0, 0, .3);
    padding-left: 3px;
    box-sizing: border-box;
}

.banner .arrow .item.left {
    border-radius: 0 17px 17px 0;
}

.banner .arrow .item.right {
    right: 0;
    border-radius: 17px 0 0 17px;
}

看看效果

??

效果显然不是我们想要的
因为imgs的宽度和dots的宽度都是需要JS动态计算的。所有我们为了查看效果先给他加上
因此我们暂时在HTML结构中添加如下代码

1. <div class="imgs" style="width: 2600px;">
2. <div class="dots" style="width: 60px;">

效果图如下

??

JS行为:

大致思路
 1. 设置配置参数(图片宽度,小圆点的宽度,要渲染的doms元素,要添加的图片地址等)

 2. 获取到图片的数量

 3. 初始化图片,因为imgs下的img都是需要JS动态生成的

 4. 根据图片的数量初始化元素尺寸(imgs、dots)

 5. 根据图片的数量创建相应的小圆点数量(span)

 6. ----按钮的区域 (arrow)下的两个图标设置定位。[本文采用的是 &lg; &lt;请自行替换为图标]

(头和尾都要增加一张图片)能够形成 5-1-2-3-4-5-1 的布局


// 第一步: 配置    配置是需要用户传入,调用时只需要改配置的参数即可。
var config = {
    imgWidth: 520,   // 图片的宽度
    dotWidth: 12,    // 小圆点的宽度
    doms: {          // 涉及的dom对象
        divBanner: document.querySelector(".banner"),
        divImgs: document.querySelector(".banner .imgs"),
        divDots: document.querySelector(".banner .dots"),
        divArrow: document.querySelector(".banner .arrow")
    },
    // 每张图片的地址
    imgs: ["img/1.jpg", "img/2.webp", "img/3.jpg", "img/4.jpg", "img/5.webp"],
    // 图片链接的地址
    href: ["#","#","#","#","#"]
}

// 第二步: 图片数量  动态获取  不要直接在config对象中写死,因为我们希望他是可以根据页面计算出来的,所以等config赋值完成再计算
config.imgNumber = config.imgs.length;

console.log(config);  // 可以在页面上打印看看这个对象

页面上打印结果如下

??

因为dots下的所有img都是动态添加上去的
所以我们要在JS中生成(别忘了删除HTML中的imgs下的代码)


/**
 * 第三步: 初始化所有的IMG图片
 */
function initImgs() {
    var str = "";  // 用来字符串拼接结构
    for (var i = 0; i < config.imgNumber; i++) {  // 有多少张图就循环添加几张
        // 利用es6模板字符串拼接生成HTML结构
        config.doms.divImgs.innerHTML = str += `
        <a href="${config.href[i]}">
        <img src="${config.imgs[i]}"/>
        </a>`;
        // config.href[i]   添加对应的图片链接的地址
        // config.imgs[i]   添加对应的每张图片的地址
    }
}

页面效果图如下

??

因为dots和img的宽度都是动态添加上去的
所以我们要在JS中设置他们的宽度(别忘了删除HTML中的多余的代码)

/**
 * 第四步: 初始化元素尺寸
 */
function initDivSize() {
    // 小圆点的总宽度  =  一个小圆点的宽度 * 图片的数量
    config.doms.divDots.style.width = config.dotWidth * config.imgNumber + "px";
    // 轮播图片总宽度  =  一张图片的宽度 * 图片的数量 + 2 张空白的区域 (头和尾都要增加一张图片能够形成 5-1-2-3-4-5-1 的布局)
    config.doms.divImgs.style.width = config.imgWidth * (config.imgNumber + 2) + "px";
}

页面效果如下
并且滚动条向右拉会有两个空白区域

??

下面创建开始创建小圆点的
别忘了删除HTML中的多余的代码


/**
 * 第五步: 初始化Dots元素
 */
function initDots() {
    // 5.1 创建小圆点
    for (var i = 0; i < config.imgNumber; i++) {    // 有多少张图就循环添加几个小圆点
        var span = document.createElement("span");  // 每循环一次添加一个span元素
        config.doms.divDots.appendChild(span);      // 每循环一次将span元素添加到Dots中
    }
}

页面效果如下

??

原文地址:https://www.cnblogs.com/qq4297751/p/12600734.html

时间: 2024-07-31 13:33:16

js 实现淘宝轮无缝播图效果,带完整解析版源码(陆续更新中.....)的相关文章

使用原生js实现轮播图效果

知乎原文 我的博客 微信公众号这几天在逛网站的时候,发现很多网站都有轮播图这个效果,所以我就仿照小米的官网用原生js写了一个轮播图效果,希望大家喜欢.这是我发布在github上的最后实现的效果:https://heternally.github.io/... 下面我简单跟大家说一下我实现该效果的过程,如果有什么错误的地方,欢迎大家说出来,以方便大家互相学习. 我相信前面简单的html+css大家应该都会,我这里就不说了,简单给大家展示一下代码: HTML部分 <div id="wrap&q

js实现轮播图效果(附源码)--原生js的应用

1.js实现轮播图效果 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="Author" content="奇客艺术"> <meta name="keyword" content="关键字"> <meta name=

JS学习笔记--轮播图效果

希望通过自己的学习收获哪怕收获一点点,进步一点点都是值得的,加油吧!!! 本章知识点:index this for if else 下边我分享下通过老师教的方式写的轮播图,基础知识实现: 1.css代码 <style> ul, ol { padding:0; margin:0; } li { list-style:none; } #box { width:600px; height:350px; border:10px solid #ccc; margin:0 auto; position:r

第一阶段:前端开发_使用JS完成首页轮播图效果

2018-06-04 使用JS完成首页轮播图效果 一.技术分析 获取元素: document.getElementById("id 名称") 事件(onload) :页面加载事件 定时操作:setInterval("changeImg()",3000); 二.步骤分析 第一步:确定事件(onload)并为其绑定一个函数    第二步:书写绑定的这个函数    第三步:书写定时任务(setInterval)    第四步:书写定时任务里面的函数    第五步:通过变量

原生JS实现 ‘Tab栏切换’,‘手风琴’,‘轮播图’效果

1.小天使跟随鼠标效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatib

AngularJS:实现轮播图效果

要实现这个功能,可以https://github.com/sroze/ngInfiniteScroll这个第三方控件实现的.实现步骤如下: 1. 下载ng-infinite-scroll.js程序http://sroze.github.io/ngInfiniteScroll/ 目前版本是1.0.0 2. 如果你是用的jQuery2.0以上版本,还需要修改ng-infinite-scroll.js程序,将所有的将所有的$window.xxx改为$(window).xxx, elem.xxx改为$(

Html5如何快速在页面中写出多个轮播图效果

我们在做项目的过程中,有时候客户需求要求你在同一个页面中,写几个不同样式的轮播图效果,那么如何快速实现呢?(要知道若果你每个轮播图都要用原生javascript写的话,会很麻烦,代码也不够简洁) 这里我们就可以借助插件来实现这一功能,swiper.js就是一个专门处理轮播图效果的js库,下面举例来说明: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"&g

花瓣网轮播图效果

没有加上定时器效果,仅仅能手动进行图片的切换 效果图: index.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>index</title> &

实现比较简单的轮播图效果

实现简单的轮播图效果. 废话不多说,我们开始. HTML和CSS较为简单,不在这里做赘述.简单的给大家一个HTML代码. <div class="carousel"> <div id="goLeft"></div> <ul> <li><img src="" /></li> <li><img src="" /></l