原生js实现轮播图的两种方式

引言

element-ui组件库中,有一个Carousel走马灯组件,也就是我们平时说的轮播图,为了搞清它的实现原理,接下来我们使用原生js实现一个轮播图效果。

1.基础轮播图实现过程

1.1 基础样式配置

分析实现轮播的基本要素,固定容器,图片,切换circle, 以及当前的活跃样式.active, 最终得到以下基础样式:
在这里插入图片描述


代码部分:

<div class="containter">
    <div class="imageBox">
        <img class="imageItem" src="./image/ftai-bg.png" alt="">
        <img class="imageItem" src="./image/ftai-home2.png" alt="" >
        <img class="imageItem" src="./image/bg.png" alt="">
        <img class="imageItem" src="./image/ftai-home.png" alt="">
    </div>
    <div class="circleBox">
        <span class="circleItem active" ></span>
        <span class="circleItem"></span>
        <span class="circleItem"></span>
        <span class="circleItem"></span>
    </div>
</div>
.containter {
    position: relative;
    width: 600px;
    height: 400px;
    overflow: hidden;
}
.imageBox {
    width: 600px;
    display: flex;
    transition: all .5s;
}
.imageItem {
    width: 600px;
    height: 400px;
    flex-shrink: 0; /* 防止图片缩小 */
}

.circleBox {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    bottom: 30px;
    width: 200px;
    height: 40px;
    /* outline: 1px solid #ccc; */
    display: flex;
    justify-content: space-around;
    align-items: center;
}
.circleItem {
    display: inline-block;
    width: 20px;
    height: 20px;
    border-radius: 50%;;
    border: 2px solid #EA7C13;
    z-index: 10;
}
.circleItem:hover { 
    cursor: pointer;
}
.active {
    background-color: #EA7C13;
}

1.2 js逻辑

思路:通过当前图片的索引实现图片容器不同位置的切换。容器位置切换方式有很多种,此处我们使用tranlateX(xx)来实现。
示意:
在这里插入图片描述

    // 获取图片容器
    const imageBoxDom = document.querySelector('.imageBox')
    // 获取所有circle的dom类数组
    const circleItemArr = document.querySelectorAll('.circleItem')
    // circle点击事件
    circleItemArr.forEach((item, index) => {
        item.addEventListener('click',() => {
            // 图片容器偏移到当前图片位置
            imageBoxDom.style.transform =  `translateX(-${index}00%)`
            // 改变当前活跃状态的circle
            let activeDom = document.querySelector('.active')
            activeDom.classList.remove('active')
            item.classList.add('active')
        })
    })

1.3 实现效果

至此,一个简单的轮播图就实现了
在这里插入图片描述

2.卡片化轮播图实现过程

此外,elementUI还提供了一种卡片化的轮播图,这种轮播图的样式采用了堆叠式的设计,只需要稍作调整就可以实现这种效果

2.1 基础样式配置

<body>
    <div class="box">
        <img class="imageItem" src="./image/ftai-bg.png" alt="PIC">
        <img class="imageItem" src="./image/ftai-home2.png" alt="PIC">
        <img class="imageItem" src="./image/bg.png" alt="PIC">
        <img class="imageItem" src="./image/ftai-home.png" alt="PIC">
        <img class="imageItem" src="./image/ftai-bg.png" alt="PIC">
        <div class="btns">
            <span class="prebtn btn">&lt;</span>
            <span class="nextbtn btn">&gt;</span>
        </div>
    </div>
</body>
body {
    display: flex;
    justify-content: center;
    background-color: #534F50;
    padding-top: 200px;
}
.box {
    width: 1200px;
    height: 300px;
    margin: 50px auto;
    position: relative;
    display: flex;
}
.imageItem {
    position: absolute;
    left: 200px;
    width: 800px;
    height: 400px;
    transition: all .3s linear;
    flex-shrink: 0; /* 防止图片缩小 */

}
.box:hover .btn {
    opacity: 1;
}
.prebtn {
    left: 0px;
}
.back {
    left: 600px;
}
.active {
    left: 300px;
    transform: scale(1.5);
    z-index: 10;
}
.btn {
    width: 60px;
    height: 60px;
    display: block;
    position: absolute;
    background-color: rgba(0, 0, 0, .5);
    font-size: 50px;
    font-family: "微软雅黑";
    color: rgba(255, 255, 255, .5);
    line-height: 55px;
    text-align: center;
    cursor: pointer;
    z-index: 100;
    opacity: 0;
    transition: opacity .3s linear;
}
.btns .btn:first-child {
    top: 200px
}
.btns .btn:last-child {
    top: 200px;
    right: 0px;
}

2.1 js实现逻辑

const prebtn = document.querySelector('.prebtn')
const nextbtn = document.querySelector('.nextbtn')
const imgArr = document.querySelectorAll('.imageItem')
const imgLength = imgArr.length
const scaleNum = 0.9   // 缩放倍数
const offsetNum = 200  // 偏移基础量
let currentIndex = 0
layout()

prebtn.addEventListener('click', () => {
    preFn()
})
nextbtn.addEventListener('click', () => {
    nextFn()
})
function preFn() {
    console.log(27, 'aa');
    if(currentIndex === 0) {
        return
    }
    currentIndex --
    layout()
}
function nextFn() {
    if(currentIndex === imgArr.length - 1) {
        return
    }
    currentIndex ++
    layout()
}

function layout() {
    imgArr.forEach((item,index) => {
        let transNum = (index - currentIndex) * offsetNum       // 水平位置偏移量
        const scale = scaleNum ** Math.abs(index - currentIndex)  // 缩放量
        const sign = Math.sign(index - currentIndex)              // math函数,此处获取正负数(用于判断图片索引与当前索引的位置关系)
        const rotateNum = index === currentIndex ? 0 : -45 * sign // 旋转晾

        if(index !== currentIndex) {
            transNum = transNum + 100 * sign
        }
        // 根据当前的索引定义不同位置图片的样式
        item.style.transform = `translateX(${transNum}px) scale(${scale}) rotateY(${rotateNum}deg)`     
        item.style.zIndex = imgLength - Math.abs(index - currentIndex) 
        item.style.opacity = 0.8 ** Math.abs(index - currentIndex)

    })
}

2.2 实现效果

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常好的问题!以下是一个基本的原生 JavaScript 轮播图实现: HTML ```html <div class="slider"> <div class="slider-wrapper"> <div class="slider-item"></div> <div class="slider-item"></div> <div class="slider-item"></div> </div> <div class="slider-nav"> <a class="slider-prev" href="#">Prev</a> <a class="slider-next" href="#">Next</a> </div> </div> ``` CSS ```css .slider { position: relative; width: 100%; height: 300px; overflow: hidden; } .slider-wrapper { position: absolute; top: 0; left: 0; height: 100%; width: 300%; display: flex; transition: transform 0.3s ease-in-out; } .slider-item { height: 100%; width: 33.333%; } .slider-nav { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); z-index: 10; display: flex; } .slider-prev, .slider-next { margin: 0 10px; padding: 5px 10px; background-color: #ddd; border-radius: 3px; } .slider-prev:hover, .slider-next:hover { background-color: #bbb; } ``` JavaScript ```js const sliderWrapper = document.querySelector('.slider-wrapper'); const prevBtn = document.querySelector('.slider-prev'); const nextBtn = document.querySelector('.slider-next'); const sliderItems = document.querySelectorAll('.slider-item'); const itemWidth = sliderItems[0].offsetWidth; let position = 0; nextBtn.addEventListener('click', () => { position -= itemWidth; if (position < -itemWidth * (sliderItems.length - 1)) { position = 0; } moveToPosition(); }); prevBtn.addEventListener('click', () => { position += itemWidth; if (position > 0) { position = -itemWidth * (sliderItems.length - 1); } moveToPosition(); }); function moveToPosition() { sliderWrapper.style.transform = `translateX(${position}px)`; } ``` 这个例子通过改变 sliderWrapper 的 transform 属性来移动轮播图的位置。prevBtn 和 nextBtn 的点击事件分别减小或增加 position 值,而 moveToPosition 函数将新的 position 值应用到 sliderWrapper 上,实现轮播图的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值