剑侠盟·网游特攻队

  • 首页
  • 门派特辑
  • 情缘系统
  • 帮派战报
  • HOME> 门派特辑> 手把手教你实现自定义轮播图:使用HTML、CSS和JavaScript构建
    手把手教你实现自定义轮播图:使用HTML、CSS和JavaScript构建
    门派特辑

    大家都在许多网站上见过轮播图。你可能也在自己的Web项目中使用过一些框架如Bootstrap来实现它。

    但是今天我们将使用HTML、CSS和JavaScript自己来实现它。而且在一些机器编码面试环节中,这个问题也可能会被问到。

    在我们深入编码之前,让我们先了解一下轮播图的结构。

    我们有一个主要的div,我们可以称之为容器(div#container),它具有一定的宽度和高度。

    我们在主要的div内有4个div,每个div包含我们的图像(div.image__container)。

    每个内部div包含一张图像,图像的宽度和高度都占满父元素,并且使用object-fit: cover属性,这样我们的每张图像就可以覆盖整个div。

    现在,主要的div应该具有display: flex属性,这样我们的内部div就是一行排列的,但我们需要一次只显示一张图像,所以我们需要应用overflow: hidden属性。

    我们需要两个按钮,一个用来切换到下一张图像,另一个用来返回到上一张图像。

    经过这5步,我们的输出会是这样的。

    这里有一件事要注意, 默认情况下flex属性的flex-shrink: 1设置给子元素,这就是为什么我们的图像会被缩小,但是对于我们的用例,我们希望div占据主容器的整个宽度。为了实现这一点,我们需要给内部div设置flex-shrink: 0。

    经过这一步后,我们的输出会是这样的。

    现在让我们来深入了解一下编码吧!!

    HTML代码语言:html复制

    carousel-img

    carousel-img

    carousel-img

    carousel-img

    CSS代码语言:css复制#carousel__container {

    position: relative;

    display: flex;

    width: 600px;

    height: 300px;

    overflow: hidden;

    border: 1px solid red;

    }

    .img__container {

    width: 100%;

    height: 100%;

    flex-shrink: 0;

    }

    .img__container > img {

    width: 100%;

    height: 100%;

    object-fit: cover;

    }

    .btn {

    position: absolute;

    top: 50%;

    border-radius: 50%;

    color: black;

    background-color: white;

    border: none;

    outline: none;

    padding: 5px 7px;

    cursor: pointer;

    }

    #prev-btn {

    left: 10px;

    }

    #next-btn {

    right: 10px;

    }JavaScript:这是所有魔法发生的地方。这段代码块很容易理解,我们正在为我们的按钮添加事件监听器,以调用相应的函数。

    我们从DOM中获取我们的图像并将它们存储在一个数组中。

    代码语言:javascript复制const nextBtn = document.getElementById("next-btn");

    const prevBtn = document.getElementById("prev-btn");

    nextBtn.addEventListener("click", showNextImage);

    prevBtn.addEventListener("click", showPrevImage);

    //document.getElementsByClassName返回HTML collection,所以我们使用 "Array.from" 方法来获取一个可迭代的对象

    const images = Array.from(document.getElementsByClassName("carousel__img"));

    const totalImages = images.length;

    let currentImageIndex = 0; //正在屏幕上显示的图像的索引您一定见过,在轮播图中,图像会通过平滑的滑动效果滑动,因此为了添加相同的效果,我们创建了一个函数,为每个图像添加CSS样式。

    代码语言:javascript复制function addTransitionEffectToImages() {

    images.forEach((img) => {

    img.style.transition = "transform 0.8s ease";

    });

    }现在让我们了解当用户单击下一个按钮时会发生什么。

    首先,我们为我们的图像添加过渡效果,以便它们平滑滑动,产生滑动效果。

    在CSS中,我们有transform属性,通过它我们可以以各种方式对HTML元素进行动画处理。但是对于我们的用例,我们希望以X(水平)方向移动我们的内部div,移动的像素或百分比是固定的。为此,我们有translateX函数。如果我们想要元素向右移动,传递的值将是正的,反之亦然。

    代码语言:css复制transform : translateX(50px); // 向右移动元素50px

    transform : translateX(-30px); // 向左移动元素30px

    transform : translateX(100%); // 向右移动元素,移动距离为它

    的长度

    transform : translateX(-100%); // 向左移动元素,移动距离为它的长度现在,每次单击下一个按钮时,每个图像都会根据它们当前的位置向左移动,并更新索引加1。

    代码语言:javascript复制function showNextImage() {

    //如果我们在最后一张图像上重置轮播图

    if (currentImageIndex == totalImages - 1) {

    resetCarousel();

    return;

    }

    if (currentImageIndex === 0) addTransitionEffectToImages();

    //每次移动到下一张图像时将所有图像都向左移动-100%

    images.forEach((img) => {

    img.style.transform = `translate(${(currentImageIndex + 1) * -100}%)`;

    });

    currentImageIndex++;

    }在resetCarousel()函数中,我们删除了过渡属性,因为每个图像都将返回到其正常位置,但是会出现像火车一样的滑动效果,我们不想要这样。移除这个属性将直接显示第一张图像,没有任何效果。您可以尝试在您的代码中删除它,看看会发生什么。

    我们还剩下最后一件事,那就是如何使上一个按钮工作。

    如果我们在第1张图像上,我们只是返回。

    这部分的逻辑与下一个按钮功能相反。我们简单地通过-100%将图像translateX,并将索引减1。

    代码语言:javascript复制function showPrevImage() {

    if (currentImageIndex === 0) return; //如果我们在第一张图像上,那么直接返回

    //在showNextImage中所做的逻辑相反

    images.forEach((img) => {

    img.style.transform = `translateX(${(currentImageIndex - 1) * -100}%)`;

    });

    currentImageIndex--;

    }我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

    最新身体素质自测,你的身体年龄是几岁?体能达标了吗?
    ⚔️ 大六壬《勾陈不临酉戌亥子》歌诀 完整深度解读

    友情链接:


    Copyright © 2022 剑侠盟·网游特攻队 All Rights Reserved.