没有 JavaScript 计时器的自动播放轮播 - CSS 动画

news2024/11/17 17:54:19

先看效果:
在这里插入图片描述
再看代码(查看更多):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计时器</title>
    <style>
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }

        body {
            background: #98ede0;
            transition: background 500ms;
            font-family: ui-rounded, "Hiragino Maru Gothic ProN", Quicksand, Comfortaa, Manjari, "Arial Rounded MT", "Arial Rounded MT Bold", Calibri, source-sans-pro, sans-serif;
        }

        .content {
            margin: 0 auto;
            max-width: 500px;
            height: 100vh;
            height: 100svh;
            min-height: 400px;
            display: flex;
            flex-direction: column;
            padding: 40px 40px 80px;
            justify-content: center;
        }

        a {
            transition: color 200ms;
            color: rgba(0, 0, 0, 0.5);
            border-radius: 5px;
            text-decoration: none;
            margin: 40px auto 0;
        }
        a:hover {
            color: black;
            text-decoration: underline;
        }
        a:focus-visible {
            color: black;
            outline: 3px solid rgba(255, 255, 255, 0.3);
            outline-offset: 5px;
        }

        .pagination {
            display: flex;
            gap: 10px;
            height: 4px;
            min-height: 4px;
        }

        .pagination-item {
            border-radius: 100px;
            height: 100%;
            flex: auto;
            background: rgba(0, 0, 0, 0.08);
            overflow: hidden;
            border: 0;
            cursor: pointer;
        }

        @keyframes progress {
            from {
                width: 0;
            }
            to {
                width: 100%;
            }
        }
        .pagination-progress {
            flex: auto;
            background: #333;
            height: 100%;
            width: 0;
        }
        .pagination-item--running .pagination-progress {
            animation: progress 3s linear forwards;
        }
        .pagination-item--done .pagination-progress {
            width: 100%;
        }
        .pagination--paused .pagination-progress {
            animation-play-state: paused;
        }
        :-moz-window-inactive .pagination-progress {
            animation-play-state: paused;
        }

        .controls {
            display: flex;
            justify-content: center;
            gap: 12px;
        }

        .control {
            display: flex;
            align-items: center;
            justify-content: center;
            border-radius: 100px;
            border: none;
            outline: none;
            height: 40px;
            flex: 40px 0 0;
            max-width: 100px;
            background: rgba(255, 255, 255, 0.3);
            transition: transform 200ms, background-color 200ms;
            will-change: transform, background-color;
            font-size: 20px;
        }
        .control:hover {
            cursor: pointer;
            transform: scale(1.15);
            background: rgba(255, 255, 255, 0.45);
        }
        .control:focus {
            background: rgba(255, 255, 255, 0.6);
        }

        .icon {
            width: 20px;
        }

        .icon--play {
            margin-right: -2px;
        }

        .pagination--paused ~ .controls .icon--pause,
        .pagination:not(.pagination--paused) ~ .controls .icon--play {
            display: none;
        }

        .state {
            font-size: 120px;
            text-align: center;
        }
    </style>
</head>
<body>
<div class="content">

    <div class="pagination">
    </div>

    <div class="state">
        &nbsp;
    </div>

    <div class="controls">
        <button class="control control--prev" aria-label="Previous">
            <svg class="icon" viewBox="0 0 32 32">
                <path d="M20 28a1 1 0 0 1-.521-.146l-18-11a1.002 1.002 0 0 1 0-1.708l18-11A.999.999 0 0 1 21 5v6.11a1 1 0 0 1-.479.854L13.918 16l6.603 4.035c.297.182.479.506.479.854V27a1 1 0 0 1-1 1zM3.918 16 19 25.217V21.45l-7.521-4.596a1 1 0 0 1 0-1.707L19 10.55V6.783L3.918 16z" />
                <path d="M30 28a1 1 0 0 1-.521-.146l-18-11a1.002 1.002 0 0 1 0-1.708l18-11A.999.999 0 0 1 31 5v22a1 1 0 0 1-1 1zM13.918 16 29 25.217V6.783L13.918 16z" />
            </svg>
        </button>
        <button class="control control--play-pause" aria-label="Play/Pause">
            <svg class="icon icon--play" viewBox="0 0 32 32">
                <path d="M7 28a.999.999 0 0 1-1-1V5a1 1 0 0 1 1.521-.854l18 11a1.001 1.001 0 0 1 0 1.708l-18 11A1 1 0 0 1 7 28zM8 6.783v18.434L23.082 16 8 6.783z" />
            </svg>
            <svg class="icon icon--pause" viewBox="0 0 32 32">
                <path d="M13 28H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v22a1 1 0 0 1-1 1zm-5-2h4V6H8v20zM25 28h-6a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v22a1 1 0 0 1-1 1zm-5-2h4V6h-4v20z" />
            </svg>
        </button>
        <button class="control control--next" aria-label="Next">
            <svg class="icon" viewBox="0 0 32 32">
                <path d="M12 28a1 1 0 0 1-1-1v-6.111c0-.348.182-.672.479-.854L18.082 16l-6.603-4.035A1.001 1.001 0 0 1 11 11.11V5a1 1 0 0 1 1.521-.854l18 11a1.002 1.002 0 0 1 0 1.708l-18 11A1 1 0 0 1 12 28zm1-6.55v3.767L28.082 16 13 6.783v3.767l7.521 4.596a1.001 1.001 0 0 1 0 1.708L13 21.45z" />
                <path d="M2 28a1 1 0 0 1-1-1V5a1 1 0 0 1 1.521-.854l18 11a1.002 1.002 0 0 1 0 1.708l-18 11A1 1 0 0 1 2 28zM3 6.783v18.434L18.082 16 3 6.783z" />
            </svg>
        </button>
    </div>

    <a target="_blank" href="https://blog.csdn.net/qq_35241329?type=blog">博客文章</a>
</div>
</body>
<script>
    "use strict";
    function getItem(index) {
        const item = document.createElement('button');
        item.classList.add('pagination-item');
        item.addEventListener('animationend', next);
        item.addEventListener('click', () => update(index));
        const progress = document.createElement('div');
        progress.classList.add('pagination-progress');
        item.appendChild(progress);
        return item;
    }
    function createItems(itemsCount) {
        const items = [];
        for (let i = 0; i < itemsCount; i++) {
            items.push(getItem(i));
        }
        return items;
    }
    function jumpTo(item) {
        if (isPaused) {
            item.classList.remove(classNames.RUNNING);
            item.classList.add(classNames.DONE);
        }
        else {
            item.classList.add(classNames.RUNNING);
            item.classList.remove(classNames.DONE);
        }
        let sibling = item;
        while ((sibling = sibling.previousSibling)) {
            sibling.classList.remove(classNames.RUNNING);
            sibling.classList.add(classNames.DONE);
        }
        sibling = item;
        while ((sibling = sibling.nextSibling)) {
            sibling.classList.remove(classNames.RUNNING, classNames.DONE);
        }
    }
    function update(index) {
        activeIndex = index;
        jumpTo(items[activeIndex]);
        // 更新幻灯片和背景颜色
        $state.innerHTML = activeIndex + 1;
        document.body.style.backgroundColor = colors[activeIndex];
    }
    function prev() {
        if (activeIndex > 0) {
            update(activeIndex - 1);
        }
    }
    function next() {
        if (activeIndex < ITEMS_COUNT - 1) {
            update(activeIndex + 1);
        }
    }
    function playPause() {
        $pagination.classList.toggle(classNames.PAUSED);
        isPaused = !isPaused;
        ///如果当前幻灯片已完成,跳到下一张
        if (!isPaused && items[activeIndex].classList.contains(classNames.DONE)) {
            next();
        }
    }
    const colors = ['#98ede0', '#74b9ff', '#a29bfe', '#fd79a8', '#ffeaa7'];
    const classNames = {
        RUNNING: 'pagination-item--running',
        DONE: 'pagination-item--done',
        PAUSED: 'pagination--paused',
    };
    let activeIndex = 0;
    let isPaused = false;
    const ITEMS_COUNT = 5;
    const items = createItems(ITEMS_COUNT);
    const $pagination = document.querySelector('.pagination');
    const $state = document.querySelector('.state');
    const $prev = document.querySelector('.control--prev');
    const $next = document.querySelector('.control--next');
    const $playPause = document.querySelector('.control--play-pause');
    $pagination.replaceChildren(...items);
    $prev.addEventListener('click', prev);
    $next.addEventListener('click', next);
    $playPause.addEventListener('click', playPause);
    update(activeIndex);

</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springcloud-gateway简述

Spring Cloud Gateway 是一个用于构建 API 网关的项目&#xff0c;它是 Spring Cloud 生态系统中的一部分&#xff0c;旨在为微服务架构提供动态路由、负载均衡、安全性和监控等功能。 网关工程对应pom文件 <?xml version"1.0" encoding"UTF-8"?>…

kafka消息系统实战

kafka是什么&#xff1f; 是一种高吞吐量的、分布式、发布、订阅、消息系统 1.导入maven坐标 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.4.1</version></dependency&…

Python文本终端GUI框架详解

今天笔者带大家&#xff0c;梳理几个常见的基于文本终端的 UI 框架&#xff0c;一睹为快&#xff01; Curses 首先出场的是 Curses。 Curses 是一个能提供基于文本终端窗口功能的动态库&#xff0c;它可以: 使用整个屏幕 创建和管理一个窗口 使用 8 种不同的彩色 为程序提供…

web之利用延迟实现复杂动画、animation

文章目录 效果图htmlstyleJavaScript 效果图 html <div class"container"><div class"ball"></div><input type"range" min"0" max"1" step"0.01" /> </div>style body {display…

有机器视觉工程师假装在工作

没有节假日&#xff0c;没有任何业务时间&#xff0c;去充实自己&#xff0c;甚至都没有时间陪女朋友&#xff0c;甚至都没有时间找女朋友。 没有人休息的工作&#xff1a; 每天上班三个地点&#xff0c;住宿&#xff0c;现场&#xff0c;吃饭的地方。搞得和高考似的&#xff…

【算法训练-哈希】两数之和、三数之和

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是两数之和和三数之和&#xff0c;使用哈希这个基本的数据结构来实现 两数之和【EASY】 照例先从简单往难搞 题干 输入&#xff1a; [3,2,4],6返…

【LeetCode-中等题】148. 排序链表

文章目录 题目方法一&#xff1a;集合排序&#xff08;核心是内部的排序&#xff09;方法二&#xff1a; 优先队列&#xff08;核心也是内部的排序&#xff09;方法三&#xff1a;归并排序&#xff08;带递归&#xff09; 从上往下方法四&#xff1a;归并排序&#xff08;省去递…

【juc】读写锁ReentrantReadWriteLock

目录 一、说明二、读读不互斥2.1 代码示例2.2 截图示例 三、读写互斥3.1 代码示例3.2 截图示例 四、写写互斥4.1 代码示例4.2 截图示例 五、注意事项5.2.1 代码示例5.2.2 截图示例 一、说明 1.当读操作远远高于写操作时&#xff0c;使用读写锁让读读可以并发&#xff0c;来提高…

excel功能区(ribbonx)编程笔记--2 button控件与checkbox控件

我们上一章简单先了解了ribbonx的基本内容,以及使用举例实现自己修改ribbox的内容,本章紧接上一章,先讲解一下ribbonx的button控件。 在功能区的按钮中,可以使用内置图像或提供自已的图像,可以指定大按钮或者更小的形式,添加少量的代码甚至可以同时提供标签。此外,可以利…

Nginx到底是什么,他能干什么?

Ngnix是什么&#xff0c;它是用来做什么的呢&#xff1f; 一。Nginx简介 Nginx是enginex的简写&#xff0c;是一款很优秀的开源的高性能HTTP和反向代理服务器,由于它是用C语言写的&#xff0c;所以速度非常快&#xff0c;性能非常优秀&#xff0c;它主要功能就是反向代理&…

使用安全复制命令scp在Windows系统和Linux系统之间相互传输文件

现在已经有很多远程控制服务器的第三方软件平台&#xff0c;比如FinalShell&#xff0c;MobaXterm等&#xff0c;半可视化界面&#xff0c;使用起来非常方便和友好&#xff0c;两个系统之间传输文件直接拖就行&#xff0c;当然也可以使用命令方式在两个系统之间相互传递。 目录…

Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题

Java网络爬虫——jsoup快速上手&#xff0c;爬取京东数据。同时解决‘京东安全’防爬问题 介绍 网络爬虫&#xff0c;就是在浏览器上&#xff0c;代替人类爬取数据&#xff0c;Java网络爬虫就是通过Java编写爬虫代码&#xff0c;代替人类从网络上爬取信息数据。程序员通过设定…

Spring Cloud Gateway的快速使用

环境前置搭建Nacos&#xff1a;点击跳转 Spring Cloud Gateway Docs 新建gateway网关模块 pom.xml导入依赖 <!-- 网关 --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifact…

部署Spring Boot项目

上传jar包 之前在新建Spring Boot项目[1]使用mvn install的方式&#xff0c;已经构建出jar包。 通过scp或rz/sz&#xff0c;将该jar包上传到服务器 执行java -jar hello-0.0.1-SNAPSHOT.jar,发生如下报错&#xff1a; Exception in thread "main" java.lang.Unsuppo…

jsp+servlet+mysql阳光网吧管理系统

项目介绍&#xff1a; 本系统使用jspservletmysql开发的阳光网吧管理系统&#xff0c;纯手工敲打&#xff0c;系统管理员和用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;修改个人信息、修改密码&#xff1b;机房类型管理&#xff1b;机房管理&#xff1b;机位…

如何变更小程序会员卡的上级

在小程序中&#xff0c;手动变更会员的上级是一项常见的操作。无论是为了层级调整还是因个人原因&#xff0c;支持手动变更会员的上级可以有效地管理和优化团队的组织结构。下面就具体介绍如何手动变更会员的上级。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xf…

vue项目静态文件资源下载

业务场景&#xff1a;页面有一个导入功能&#xff0c;需要一个模板文件供下载&#xff0c;文件放在本地。 对于 Vue 3 Vite 项目&#xff0c;使用 require 方法来导入模块是不被支持的。require 是 CommonJS 规范中用于模块导入的方法&#xff0c;在 Webpack 等构建工具中常用…

扩散模型实战(八):微调扩散模型

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xf…

FPGA VR摄像机-拍摄和拼接立体 360 度视频

本文介绍的是 FPGA VR 相机的第二个版本&#xff0c;第一个版本是下面这样&#xff1a; 第一版地址&#xff1a; ❝ https://hackaday.io/project/26974-vr-camera-fpga-stereoscopic-3d-360-camera ❞ 本文主要介绍第二版本&#xff0c;第二版本的 VR 摄像机&#xff0c;能够以…

Python提取JSON文件中的指定数据并保存在CSV或Excel表格文件内

本文介绍基于Python语言&#xff0c;读取JSON格式的数据&#xff0c;提取其中的指定内容&#xff0c;并将提取到的数据保存到.csv格式或.xlsx格式的表格文件中的方法。 JSON格式的数据在数据信息交换过程中经常使用&#xff0c;但是相对而言并不直观&#xff1b;因此&#xff0…