轮播图片效果实现

news/2024/7/5 4:03:24

页面布局

<section aria-label="图片列表">
  <div class="carousel" data-carousel>
    <button class="carousel-button prev" data-carousel-button="prev">
      上一张
    </button>
    <button class="carousel-button next" data-carousel-button="next">
      下一张
    </button>
    <ul data-slides>
      <li class="slide" data-active>
        <img src="./images/demo1.jpg" alt="示例图片1" />
      </li>
      <li class="slide">
        <img src="./images/demo2.jpg" alt="示例图片2" />
      </li>
      <li class="slide">
        <img src="./images/demo3.jpg" alt="示例图片3" />
      </li>
      <li class="slide">
        <img src="./images/demo4.jpg" alt="示例图片4" />
      </li>
      <li class="slide">
        <img src="./images/demo5.jpg" alt="示例图片5" />
      </li>
    </ul>
  </div>
</section>

交互代码

const buttons = document.querySelectorAll("[data-carousel-button]");

buttons.forEach((button) => {
  button.addEventListener("click", () => {
    const offset = button.dataset.carouselButton === "next" ? 1 : -1;
    const slides = button
      .closest("[data-carousel]")
      .querySelector("[data-slides]");

    const activeSlide = slides.querySelector("[data-active]");
    let newIndex = [...slides.children].indexOf(activeSlide) + offset;

    if (newIndex < 0) newIndex = slides.children.length - 1;
    if (newIndex >= slides.children.length) newIndex = 0;

    slides.children[newIndex].dataset.active = true;
    delete activeSlide.dataset.active;
  });
});

样式

*,
*::before,
*::after {
  box-sizing: border-box;
}

body,
ul,
li {
  margin: 0;
  padding: 0;
}

.carousel {
  width: 100vw;
  height: 100vh;
  position: relative;
}

ul {
  list-style: none;
}

.slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: 200ms opacity ease-in-out;
  transition-delay: 200ms;
}

.slide > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

.slide[data-active] {
  opacity: 1;
  z-index: 1;
  transition-delay: 0ms;
}

.carousel-button {
  position: absolute;
  background: none;
  border: none;
  font-size: 12px;
  top: 50%;
  transform: translateY(-50%);
  cursor: pointer;
  border-radius: 0.25rem;
  padding: 0.5rem;
  background-color: rgba(0, 0, 0, 0.1);
  z-index: 2;
}

.carousel-button:hover,
.carousel-button:focus {
  color: #fff;
  background-color: rgba(0, 0, 0, 0.2);
}

.carousel-button:focus {
  outline: 1px solid black;
}

.prev {
  left: 1rem;
}

.next {
  right: 1rem;
}

完整代码

完整代码示例下载


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

相关文章

面试题目--MPEG4与H.264的区别

一、音频压缩编码标准。 1、 MPEG1标准 MPEG1音频压缩算法特点&#xff1a; 1) 编码器的输入信号为线性PCM信号&#xff0c;采样频率是32KHz&#xff0c;44.1kHz或者48kHz&#xff0c;输出码率为32-384Kbit/s 2) 压缩后的比特流支持单声道和双声道 3) …

如何破解SQL2008的存储过程的存储过程

问题一&#xff1a; DAC连接问题 自己尝试了n次&#xff0c;最后总结一下连接步骤&#xff1a; 1 先用有sysadmin角色的用户登陆SQL Server Management Studio&#xff1b; 2 在工具栏上选数据库引擎查询&#xff1b;服务器名称改为 ADMIN:服务器名称 &#xff1b;选项>连接…

中断触发方式的比较

在前后台系统或者带有OS的系统&#xff0c;中断处理程序是相对比较难的&#xff0c;对系统的性能影响比较大。在带有OS的系统中&#xff0c;中断作为一个异步事件&#xff0c;还可以引发任务调度。在带有OS的系统中我们经常会关闭中断&#xff0c;而在ISR中我们常常也需要关闭一…

【原创】在Android系统下实现抓词

对于TextView显示的内容&#xff0c;通过点击屏幕&#xff0c;就能把当前显示的内容获取出来。以下的例子是通过判断空格来区分每个词&#xff0c;对于英文单词是适用的&#xff0c;如果想抓中文就得自己想办法了&#xff0c;当然也可以改变判断来抓词。 实现代码主码有 TextPa…

国外人经常上的网站,即全球各个领域最大的互联网网站

由于身处的行业原因&#xff0c;我经常上中国以外的互联网&#xff0c;其实全世界的网民跟国内的网民差不多&#xff0c;他们也经常上网&#xff0c;玩空间、网络视频、分享照片、写博客。由于国内对于互联网的封锁&#xff0c;所以国内大部分的童鞋并不了解外国人的上网都去哪…

MPEG1 Layer3 (MP3)解码算法原理详解

本文介绍了符合ISO/IEC 11172-3(MPEG 1 Audio codec Layer I, Layer II and Layer III audio specifications) 或 ISO/IEC 13818-3(BC Audio Codec)的音频编码原理。通过madlib解码库进行实现。1、程序系统结构其中同步及差错检查包括了头解码模块在主控模块开始运行后&#xf…

音频采样---解释

数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的&#xff0c;实现这个步骤使用的设备是模/数转换器&#xff08;A/D&#xff09;它以每秒上万次的速率对声波进行采样&#xff0c;每一次采样都记录下了原始模拟声波在某一时刻的状态&#xff0c;称之为样…

ffmpeg库音频解码示例

一个英文版的例子&#xff08;有讲解&#xff09;ffmpeg的一些使用例子mpeg and SDL Tutorialffmpeg编译相关ffmpeg工作组(中文) #include <stdio.h>#include <stdlib.h>extern "C"{//#include "avcodec.h"#include "avformat.h"} i…