HTML+CSS+JS 全景轮播

admin 2024-08-11 149 阅读 0评论

实现了一个全景轮播的效果,包括多张图片在容器中的轮播展示,以及左右按钮的控制。其中,CSS实现了图片的布局和样式,JavaScript实现了左右按钮的点击事件,以及图片的切换。

Code

HTML
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>全景轮播</title>
    <link rel="stylesheet" href="./56-全景轮播.css">
</head>

<body>
    <div class="container">
        <div id="slide">
            <div class="item" style="background-image:url('./images/01.jpg')"></div>
            <div class="item" style="background-image:url('./images/02.jpg')"></div>
            <div class="item" style="background-image:url('./images/03.jpg')"></div>
            <div class="item" style="background-image:url('./images/04.jpg')"></div>
            <div class="item" style="background-image:url('./images/05.jpg')"></div>
            <div class="item" style="background-image:url('./images/06.jpg')"></div>
        </div>
        <div class="buttons">
            <div class="left">
                Prev</div>
                    <div class="center">下载壁纸</div>
                    <div class="right">Next ></div>
            </div>
        </div>
        <script src="./56-全景轮播.js"></script>
</body>

</html>
CSS
* {
    margin0;
    padding0;
    box-sizing: border-box;
}

.container {
    width100vw;
    height100vh;
    position: relative;
    overflow: hidden;
}

.item {
    width240px;
    height160px;
    position: absolute;
    top50%;
    left0;
    transformtranslateY(-50%);
    border-radius10px;
    box-shadow0 30px 50px #505050;
    background-size: cover;
    background-position: center;
    transition1s;
}

.item:nth-child(1),
.item:nth-child(2) {
    left0;
    top0;
    width100%;
    height100%;
    transformtranslateY(0);
    box-shadow: none;
    border-radius0;
}

.item:nth-child(3) {
    left70%;
}

.item:nth-child(4) {
    leftcalc(70% + 250px);
}

.item:nth-child(5) {
    leftcalc(70% + 500px);
}

.item:nth-child(n+6) {
    leftcalc(70% + 750px);
    opacity0;
}

.buttons {
    width100%;
    position: absolute;
    bottom50px;
    margin-left: -50px;
    text-align: center;
    display: flex;
    justify-content: center;
}

.buttons div {
    width120px;
    height50px;
    line-height50px;
    text-align: center;
    border-radius5px;
    margin0 25px;
    transition: .5s;
    cursor: pointer;
    user-select: none;
    font-size20px;
    color#fff;
    background-colorrgba(0000.4);
    box-shadow2px 2px 2px rgba(0000.2);
}
JavaScript
const leftBtn = document.querySelector(".buttons .left")
const rightBtn = document.querySelector(".buttons .right")
const slide = document.querySelector("#slide")
let openClick = true // 节流处理 (保证动画执行过程,按钮不被重复点击)

leftBtn.addEventListener("click", () => {
    if (openClick) {
        openClick = false // 触发点击后,禁用按钮
        const items = document.querySelectorAll(".item")
        slide.prepend(items[items.length - 1])

        setTimeout(() => openClick = true1000// 1s 再开放按钮的点击
    }
})
rightBtn.addEventListener("click", () => {
    if (openClick) {
        openClick = false
        const items = document.querySelectorAll(".item")
        slide.appendChild(items[0])

        setTimeout(() => openClick = true1000)
    }
})

实现思路拆分

CSS 部分
* {
    margin0;
    padding0;
    box-sizing: border-box;
}

重置默认样式。

.container {
    width100vw;
    height100vh;
    position: relative;
    overflow: hidden;
}

设置容器占据全部视窗宽高,相对定位,且隐藏溢出内容。

.item {
    width240px;
    height160px;
    position: absolute;
    top50%;
    left0;
    transformtranslateY(-50%);
    border-radius10px;
    box-shadow0 30px 50px #505050;
    background-size: cover;
    background-position: center;
    transition1s;
}

设置轮播图项的样式,包括尺寸、位置、阴影、圆角、背景覆盖等。

.item:nth-child(1),
.item:nth-child(2) {
    left0;
    top0;
    width100%;
    height100%;
    transformtranslateY(0);
    box-shadow: none;
    border-radius0;
}

为前两个轮播图项设置特殊样式,使其全屏显示。

.item:nth-child(3) {
    /* ... */
}

设置第三个轮播图项的位置。

.item:nth-child(3) {
    left70%;
}

设置第六个及以后轮播图项的透明度为0,表示它们在视觉上不可见。

.buttons {
    width100%;
    position: absolute;
    bottom50px;
    margin-left: -50px;
    text-align: center;
    display: flex;
    justify-content: center;
}

设置按钮容器的样式,包括宽度、位置、布局等。

.buttons div {
    width120px;
    height50px;
    line-height50px;
    text-align: center;
    border-radius5px;
    margin0 25px;
    transition: .5s;
    cursor: pointer;
    user-select: none;
    font-size20px;
    color#fff;
    background-colorrgba(0000.4);
    box-shadow2px 2px 2px rgba(0000.2);
}

为按钮设置样式,包括尺寸、文本对齐、圆角、过渡效果等。

JavaScript 部分
const leftBtn = document.querySelector(".buttons .left");
const rightBtn = document.querySelector(".buttons .right");
const slide = document.querySelector("#slide");
let openClick = true;

获取左右按钮和轮播容器元素,设置openClick变量用于控制点击事件。

leftBtn.addEventListener("click", () => {
    if (openClick) {
        openClick = false // 触发点击后,禁用按钮
        const items = document.querySelectorAll(".item")
        slide.prepend(items[items.length - 1])

        setTimeout(() => openClick = true1000// 1s 再开放按钮的点击
    }
})

为左按钮添加点击事件,实现轮播图的左切换。

rightBtn.addEventListener("click", () => {
    if (openClick) {
        openClick = false
        const items = document.querySelectorAll(".item")
        slide.appendChild(items[0])

        setTimeout(() => openClick = true1000)
    }
})

为右按钮添加点击事件,实现轮播图的右切换。

发表评论

快捷回复: 表情:
Addoil Applause Badlaugh Bomb Coffee Fabulous Facepalm Feces Frown Heyha Insidious KeepFighting NoProb PigHead Shocked Sinistersmile Slap Social Sweat Tolaugh Watermelon Witty Wow Yeah Yellowdog
提交
评论列表 (有 0 条评论, 149人围观)