改变数组排序实现轮播图原理

news/2024/7/15 20:30:09 标签: javascript, 前端, react.js

原理示意图

原理图
具体思路就是将数组最后一项的位置移到第一项的位置,其余项的位置也向后移。

数组改变代码

javascript">//装图片的盒子数组
    const carouselItems = document.getElementsByClassName("carousel-item");
    //盒子数组长度
    let length = carouselItems.length;
    //carousel.currentIndex初始为0
    let index = carousel.currentIndex = ++carousel.currentIndex % length;

    let newArr = Array.from(carouselItems);
    // console.log(`${newArr = [...newArr.slice(0)]}`);
    let lens = newArr.length;
    // 返回元素矩形范围,屏幕坐标,若成功获取返回RECT类型,否则返回None
//改变数组排序
index != 0 && (newArr = [...newArr.slice(-index, lens), ...newArr.slice(0, length - index)]);
newArr.forEach((item, i) => {
        // if (i == 0) {
        //     item.style.opacity = 0;
        // //     item.style.tranform = `translateX(${-width * (length - 1)}px)`;
        // //     // item.style.opacity = 0;
        // }
        item.style.transform = `translateX(${width * (i - 1)}px)`;
        item.style.opacity = 1;
    })

slice方法

如果slice第一个参数为负数,代表从结尾开始,例如

javascript">const arr = [1,2,3,4];
arr.slice(-1,arr.length);//[4]
arr.slice(-2,arr.length);//[3,4]
arr.slice(-3,arr.length);//[2,3,4]

将数组元素描述为[1,2,3,4]

javascript">newArr = [...newArr.slice(-index, lens), ...newArr.slice(0, length - index)]);

数组改变依次为

javascript">//index = 0 初始状态
[1,2,3,4]
//index = 1
[[4][1,2,3]]
//index = 2
[[3,4][1,2]]
//index = 3
[[2,3,4][1]]
//index = 4
[[1,2,3,4][]]

index数值与显示的关系为
请添加图片描述
以初始状态 2所在位置为0,假设每个元素宽为w

则初始的位置关系为
在这里插入图片描述

当index++,变为1后,数组变化为

javascript">[1,2,3,4] -> [[4][1,2,3]]

根据位置变化代码

javascript">newArr.forEach((item, i) => {
        // if (i == 0) {
        // //     item.style.tranform = `translateX(${-width * (length - 1)}px)`;
        // //     // item.style.opacity = 0;
        // }
        item.style.transform = `translateX(${width * (i - 1)}px)`;
        item.style.opacity = 1;
    })

变化后元素4的下标为0,位置由 初始的2w 变为 -w
则元素1的位置由 初始-w 变为 0(此时元素1展示)
元素2,3同理
请添加图片描述
下一次重新获取数组

javascript">const carouselItems = document.getElementsByClassName("carousel-item");

得到的依然是

javascript">[1,2,3,4]

但是这些元素对象的位置却是变化过的
当index变为2,数组变化为

javascript">[1,2,3,4] -> [[3,4][1,2]]

再根据下标位置改变元素位置。
最终从视觉角度看就是index变化一次,最后一项元素的位置就会变为 -w,相当于变为第一项,其余元素在其本来的位置上向右移动w,相当于向后移动。但是数组的元素其实是没有变化,只是改变了元素在视觉上看到的其所在的位置。


http://www.niftyadmin.cn/n/1154760.html

相关文章

Android ScrollView 使用注意事项

2019独角兽企业重金招聘Python工程师标准>>> 要想达到这样的效果 <ScrollView xmlns:android"http://schemas.android.com/apk/res/android" android:id"id/scroller" android:layout_width"fill_parent" android:layout_height&…

基于geotools的(两个)SHP要素变化提取方法预研

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/ 1. 背景 我们用遥感的手段进行卫星特征提取、多幅影像间的特征变化提取的案例越来越多&#xff0c;尤其在深度学习算法越发成熟以及诸如阿里天池大赛这些…

音乐播放器轮播图看见图片向前移动的解决

carousel.js getNext()方法 newArr.forEach((item, i) > {if (i 0) {// console.log("item",item.style)item.style.tranform translateX(${-width * (length - 1)}px);//移动到第一项的元素透明度为0item.style.opacity 0;// item.styleconsole.log("it…

UVA 1424 \ uvalive 4256 Salesmen 简单DP

题意&#xff1a; 给一个无向连通图&#xff0c;和一个长度为L的序列。任务是修改序列上的某些数使得每相邻两个数相等或在图上是两个相邻的点。最少需要修改几个数&#xff1f; 用dp[n][fa]表示当第n1个数是fa时前n个数最少要修改几次 用邻接矩阵存图&#xff0c;补上g[i][i]1…

[八分之一的男人]POJ - 1743 后缀数组 height分组 带详解

题意:求最长不可重叠的相同差值子串的长度 这道题算是拖了好几个月,现在花了点时间应该搞懂了不少,尝试分析一下 我们首先来解决一个退化的版本,求最长不可重叠的相同子串(差值为0) 比如\(aabaabaa\), 那么所求的子串有\(aab,aba,baa\)三个 如何求?不妨枚举.枚举是否有长度为\…

轮播图一次移动双倍距离的问题

有可能是轮播图渲染函数执行了两次&#xff0c;比如我的 component()动态渲染轮播图&#xff0c;调用一次后&#xff0c;在输出中又调用了一次&#xff0c;太憨了

完善一个简单的集成压力测试工具

为什么80%的码农都做不了架构师&#xff1f;>>> 为了满足自己平常编写一些东西的性能测试,于是实现了一个简单集成压力测试工具.可以同时对多个测试用例进行压力测试,工具可以记录测试用例的并发走势图,相关请求分布和延时分布比例等. 转载于:https://my.oschina.…

【转】JAVA异常报错大全

算术异常类&#xff1a;ArithmeticExecption 空指针异常类&#xff1a;NullPointerException 类型强制转换异常&#xff1a;ClassCastException 数组负下标异常&#xff1a;NegativeArrayException 数组下标越界异常&#xff1a;ArrayIndexOutOfBoundsException 违背安全原则异…