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

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

<!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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科大讯飞永久免费GPT入口来了!!!

讯飞GPT永久免费使用入口注册链接&#xff1a;讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞。 登录讯飞账号后&#xff0c;点击进入体验。 进入体验页面后&#xff0c;选择景点推荐。 笔者让其写一篇关于讯飞GPT介绍的文案。 讯飞GPT是一款由讯飞公司推出的人工智能语…

胡歌深夜发文:我对不起好多人

胡歌的微博又上了热搜。 8月29日01:18分&#xff0c;胡歌微博发文称&#xff1a;“我尽量保持冷静&#xff0c;我对不起好多人&#xff0c;我希望对得起这短暂的一生”&#xff0c;并配了一张自己胡子拉碴的图&#xff0c;右眼的伤疤清晰可见。 不少网友留言称“哥你又喝多了吗…

R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列...

全文下载链接&#xff1a;http://tecdat.cn/?p25880 本文描述了一个模型&#xff0c;该模型解释了交易的聚集到达&#xff0c;并展示了如何将其应用于比特币交易数据。这是很有趣的&#xff0c;原因很多。例如&#xff0c;对于交易来说&#xff0c;能够预测在短期内是否有更多…

WordPress导航主题源码

源码说明&#xff1a; V2.0406 添加搜索自动索引百度热搜关键词 添加首页tab标签模式加载方式切换(ajax加载和普通加载)(首页设置) 修复tab标签ajax加载模式会显示未审核的网址的bug 小屏幕热搜采用水平滚动 优化子主题支持 添加文章分页 添加解决WordPress 429的服务(…

unordered-------Hash

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——哈希表☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;哈希是一种映射的思想&#xff0c;哈希表即使利用这种思想&#xff0c;…

十四、pikachu之XSS

文章目录 1、XSS概述2、实战2.1 反射型XSS&#xff08;get&#xff09;2.2 反射型XSS&#xff08;POST型&#xff09;2.3 存储型XSS2.4 DOM型XSS2.5 DOM型XSS-X2.6 XSS之盲打2.7 XSS之过滤2.8 XSS之htmlspecialchars2.9 XSS之href输出2.10 XSS之JS输出 1、XSS概述 Cross-Site S…

基于Axios完成前后端分离项目数据交互

一、安装Axios npm i axios -S 封装一个请求工具&#xff1a;request.js import axios from axios// 创建可一个新的axios对象 const request axios.create({baseURL: http://localhost:9090, // 后端的接口地址 ip:porttimeout: 30000 })// request 拦截器 // 可以自请求…

Ansys Zemax | 手机镜头设计 - 第 2 部分:使用 OpticsBuilder 实现光机械封装

本文是3篇系列文章的一部分&#xff0c;该系列文章将讨论智能手机镜头模块设计的挑战&#xff0c;从概念、设计到制造和结构变形的分析。本文是三部分系列的第二部分。概括介绍了如何在 CAD 中编辑光学系统的光学元件以及如何在添加机械元件后使用 Zemax OpticsBuilder 分析系统…

Qt下载安装及配置教程

进入qt中文网站&#xff1a;https://www.qt.io/zh-cn/ 下载开源版 往下滑&#xff0c;下载Qt在线安装程序 它已经检测出我的是windows系统&#xff0c;直接点击download就好。如果是其它的系统&#xff0c;需要找到对应自己系统的安装包。 然后跟网速有关&#xff0c;等…

[Mac软件]Adobe After Effects 2023 v23.5 中文苹果电脑版(支持M1)

After Effects是动画图形和视觉效果的行业标准。由运动设计师、平面设计师和视频编辑用于创建复杂的动画图形和视觉上吸引人的视频。 创建动画图形 使用预设样式为文本和图形添加动画效果&#xff0c;或逐帧调整它们。编辑、添加深度、制作动画或转换为可编辑的路径&#xff…

Spring Boot整合RabbitMQ之路由模式(Direct)

RabbitMQ中的路由模式&#xff08;Direct模式&#xff09;应该是在实际工作中运用的比较多的一种模式了&#xff0c;这个模式和发布与订阅模式的区别在于路由模式需要有一个routingKey&#xff0c;在配置上&#xff0c;交换机类型需要注入DirectExchange类型的交换机bean对象。…

avalonia、WPF使用ScottPlot动态显示ECG心电图

文章目录 avalonia、WPF使用ScottPlot动态显示ECG心电图实现效果&#xff0c;动态效果懒得录视频了安装代码部分UpdateData方法就是用来更新心电图表的方法&#xff0c; 根据消息队列数据去更新是视图中的ScottPlot 图表 avalonia、WPF使用ScottPlot动态显示ECG心电图 avalonia…

【随笔】如何使用阿里云的OSS保存基础的服务器环境

使用阿里云OSS创建一个存储仓库&#xff1a;bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行&#xff0c;是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中&#xff0c;需要使用解压工具…

Next.js基础语法

Next.js 目录结构 入口App组件&#xff08;_app.tsx&#xff09; _app.tsx是项目的入口组件&#xff0c;主要作用&#xff1a; 可以扩展自定义的布局&#xff08;Layout&#xff09;引入全局的样式文件引入Redux状态管理引入主题组件等等全局监听客户端路由的切换 ts.config…

什么是光流传感器

传感器 文章目录 传感器前言一、光流传感器二、px4FLOW 前言 光流利用的是图像的变化处理&#xff0c;用于检测地面的状态&#xff0c;从而监测飞机的移动&#xff1b;主要用于保持飞机的水平位置&#xff0c;以及在室内实现定高和定点飞行。 其实光流是数字图像处理理论的一部…

【MySQL】MySQL里的用户账户和角色是什么?如何管理?

用户&#xff08;user&#xff09;验证和授权创建用户账户连接服务器查看用户账户设置 角色&#xff08;role&#xff09;创建角色 操作用户帐户和角色重命名删除 感谢 &#x1f496; 用户&#xff08;user&#xff09; 在MySQL中&#xff0c;用户是数据库访问的主要实体。每个…

vscode vue3自定义自动补全

敲代码多了&#xff0c;发现重发动作很多&#xff0c;于是还是定义自动补全代码吧——懒是第一生产力&#xff01; 1&#xff0c;Ctrl Shift P打开快捷命令行&#xff1a;找到下面这个 2&#xff0c;然后找到ts&#xff1a; 里面给了demo照着写就行 // "Print to conso…

可拖动表格

支持行拖动&#xff0c;列拖动 插件&#xff1a;sortablejs UI: elementUI <template><div><hr style"margin: 30px 0;"><div><!-- 数据里面要有主键id&#xff0c; 否则拖拽异常 --><h2 style"margin-bottom: 30px&qu…

uniapp 项目实践总结(二)从零开始搭建一个项目

导语:本篇文章主要是项目方面的技术开发总结,新建一个项目可以选择使用可视化界面,也可以使用命令行搭建。 目录 可视化界面命令行搭建安卓开发环境苹果开发环境可视化界面 安装软件 使用官方推荐的 HbuilderX 软件,开发方式比较简单,内置相关环境以及终端,无需配置 no…

CSS按钮-跑马灯边框

思路很简单&#xff0c;实现方法有很多很多。但是大体思路与实现方法都类似&#xff1a;渐变色 动画&#xff0c;主要区别在动画的具体实现 0、HTML 结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…