【前端demo】圣诞节灯泡 CSS动画实现轮流闪灯

文章目录

    • 效果
    • 过程
      • 灯泡闪亮实现(animation和box-shadow)
      • 控制灯泡闪亮时间和顺序(animation-delay)
      • 按钮开关
    • 代码
      • html
      • css
      • js
    • 参考
      • 代码1
      • 代码2

前端demo目录

效果

在这里插入图片描述
效果预览:https://codepen.io/karshey/pen/zYyBRWZ

参考:
Pure CSS Christmas Lights (codepen.io)

Christmas Lights (codepen.io)

过程

灯泡闪亮实现(animation和box-shadow)

效果:

在这里插入图片描述

以单个灯泡闪亮为例。灯泡闪亮的实现原理是CSS动画animation和阴影box-shadow

亮的时候其实就是显示与背景色相同的阴影:

box-shadow: h-shadow v-shadow blur spread color inset;
水平阴影的位置|垂直阴影的位置|模糊距离|阴影的尺寸|阴影的颜色|将外部阴影 (outset) 改为内部阴影

这里只需要用到模糊距离|阴影的尺寸|阴影的颜色

只需要在动画开头和结尾有阴影,中间的时候阴影消失,就会有灯泡闪亮与熄灭的效果

@keyframes glow-red {/* 开头和结尾都亮 */0%,100% {/* 放大阴影相当于亮了 */box-shadow: 0 0 20px 5px #fbc2eb;}50% {box-shadow: none;}
}

这里我们命名粉色灯泡的动画效果为glow-red,我们就要在animation中使用到它。

animation的子属性:

  • animation-name: 指定一个 @keyframes 的名称,动画将要使用这个@keyframes定义。
  • animation-duration: 整个动画需要的时长。
  • animation-timing-function: 动画进行中的时速控制,比如 easelinear.
  • animation-delay: 动画延迟时间。
  • animation-direction: 动画重复执行时运动的方向。
  • animation-iteration-count: 动画循环执行的次数。
  • animation-fill-mode: 设置动画执行完成后/开始执行前的状态,比如,你可以让动画执行完成后停留在最后一幕,或恢复到初始状态。
  • animation-play-state: 暂停/启动动画。

在这里,我们只需要令动画时间为1s(animation-duration),执行无限次(animation-iteration-count)即可。

animation: glow-red 1s infinite;

综上,单个粉色灯泡相关代码:

.red {background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%);animation: glow-red 1s infinite;
}@keyframes glow-red {/* 开头和结尾都亮 */0%,100% {/* 放大阴影相当于亮了 */box-shadow: 0 0 20px 5px #fbc2eb;}50% {box-shadow: none;}
}

控制灯泡闪亮时间和顺序(animation-delay)

此时灯泡是同时闪亮的。

在这里插入图片描述
我们希望灯泡闪亮是按顺序的:粉色先,蓝色其次,最后绿色。

实现方法:为灯泡设置动画开始的时间,即延迟时间animation-delay

如,令粉色没有延迟时间,蓝色延迟0.3s,绿色延迟0.6s。

.red {background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%);animation: glow-red 1s infinite;
}.blue {background-image: linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%);animation: glow-blue 1s infinite;animation-delay: 0.3s;
}.green {background-image: linear-gradient(120deg, #d4fc79 0%, #96e6a1 100%);animation: glow-green 1s infinite;animation-delay: 0.6s;
}

效果:

在这里插入图片描述

按钮开关

想要有按钮ON和OFF,点击ON就开灯,点击OFF就关灯。

添加按钮和对应点击事件:

OFF按钮的事件:获取节点,并设置关灯。

const item = document.getElementsByClassName('item')
const len = item.lengthfunction offLight() {for (let i = 0; i < len; i++) {item[i].style.animation = 'none'item[i].style.background = '#9e9e9e'}
}

ON按钮的事件:移除原先的syle并令animationPlayState 开始。

这里不写item[i].style.animationPlayState = 'running’也可以。

function onLight() {for (let i = 0; i < len; i++) {item[i].removeAttribute('style')//可以不写item[i].style.animationPlayState = 'running'}
}

点击OFF时:相当于添加了停止动画和灰色背景色的样式,覆盖了原先的样式。

在这里插入图片描述

因此,点击ON时:需要把OFF添加的style去除掉。这里不添加item[i].style.animationPlayState = 'running'也可以亮灯,因为没有style后就显示原先CSS的亮灯效果了。

在这里插入图片描述

代码

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="style.css">
</head><body><!-- 九个灯泡 --><div class="main"><div class="items"><div class="red item" id="red"></div><div class="blue item" id="blue"></div><div class="green item" id="green"></div><div class="red item" id="red"></div><div class="blue item" id="blue"></div><div class="green item" id="green"></div><div class="red item" id="red"></div><div class="blue item" id="blue"></div><div class="green item" id="green"></div></div><div class="title">Christmas Lights</div><div class="btn"><div onclick="onLight()">ON</div><div onclick="offLight()">OFF</div></div></div></body></html><script src="index.js"></script>

css

body {margin: 0;padding: 0;background-image: linear-gradient(to right, #6a11cb 0%, #2575fc 100%);
}.red {background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%);animation: glow-red 1s infinite;
}.blue {background-image: linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%);animation: glow-blue 1s infinite;animation-delay: 0.3s;
}.green {background-image: linear-gradient(120deg, #d4fc79 0%, #96e6a1 100%);animation: glow-green 1s infinite;animation-delay: 0.6s;
}.main {display: flex;flex-direction: column;margin-top: 100px;justify-content: center;align-items: center;
}.items {display: flex;
}.title {font-size: 38px;font-weight: 700;color: #fff;text-shadow: 0 0 30px #fff;
}.btn {margin-top: 20px;display: flex;
}.btn div {width: 50px;height: 50px;border-radius: 50%;line-height: 50px;text-align: center;background-color: #9e9e9e;color: #fff;margin: 10px;cursor: pointer;
}.item {height: 50px;width: 50px;border-radius: 50%;display: inline-block;margin: 20px;
}@keyframes glow-red {/* 开头和结尾都亮 */0%,100% {/* 放大阴影相当于亮了 */box-shadow: 0 0 20px 5px #fbc2eb;}50% {box-shadow: none;}
}@keyframes glow-blue {/* 开头和结尾都亮 */0%,100% {/* 放大阴影相当于亮了 */box-shadow: 0 0 20px 5px #89f7fe;}50% {box-shadow: none;}
}@keyframes glow-green {/* 开头和结尾都亮 */0%,100% {/* 放大阴影相当于亮了 */box-shadow: 0 0 20px 5px #96e6a1;}50% {box-shadow: none;}
}

js

const item = document.getElementsByClassName('item')
const len = item.lengthfunction onLight() {for (let i = 0; i < len; i++) {item[i].removeAttribute('style')// item[i].style.animationPlayState = 'running'}
}function offLight() {for (let i = 0; i < len; i++) {item[i].style.animation = 'none'item[i].style.background = '#9e9e9e'}
}

参考

Pure CSS Christmas Lights (codepen.io)

Christmas Lights (codepen.io)

CSS动画技术中animation的使用介绍 – WEB骇客 (webhek.com)

在线SCSS转CSS工具 - UU在线工具 (uutool.cn)

免费的渐变背景CSS3样式 | oulu.me

代码1

Pure CSS Christmas Lights (codepen.io)

html:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="style.css">
</head>
<ul class="lightrope"><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li>
</ul></html>

css:将链接中的scss转为了css。

body {background: #000;
}.lightrope {text-align: center;white-space: nowrap;overflow: hidden;position: absolute;z-index: 1;margin: -15px 0 0 0;padding: 0;pointer-events: none;width: 100%;
}.lightrope li {position: relative;animation-fill-mode: both;animation-iteration-count: infinite;list-style: none;margin: 0;padding: 0;display: block;width: 12px;height: 28px;border-radius: 50%;margin: 20px;display: inline-block;background: #00f7a5;box-shadow: 0px 4.6666666667px 24px 3px #00f7a5;animation-name: flash-1;animation-duration: 2s;
}.lightrope li:nth-child(2n+1) {background: aqua;box-shadow: 0px 4.6666666667px 24px 3px rgba(0, 255, 255, 0.5);animation-name: flash-2;animation-duration: 0.4s;
}.lightrope li:nth-child(4n+2) {background: #f70094;box-shadow: 0px 4.6666666667px 24px 3px #f70094;animation-name: flash-3;animation-duration: 1.1s;
}.lightrope li:nth-child(odd) {animation-duration: 1.8s;
}.lightrope li:nth-child(3n+1) {animation-duration: 1.4s;
}.lightrope li:before {content: "";position: absolute;background: #222;width: 10px;height: 9.3333333333px;border-radius: 3px;top: -4.6666666667px;left: 1px;
}.lightrope li:after {content: "";top: -14px;left: 9px;position: absolute;width: 52px;height: 18.6666666667px;border-bottom: solid #222 2px;border-radius: 50%;
}.lightrope li:last-child:after {content: none;
}.lightrope li:first-child {margin-left: -40px;
}@keyframes flash-1 {0%,100% {background: #00f7a5;box-shadow: 0px 4.6666666667px 24px 3px #00f7a5;}50% {background: rgba(0, 247, 165, 0.4);box-shadow: 0px 4.6666666667px 24px 3px rgba(0, 247, 165, 0.2);}
}@keyframes flash-2 {0%,100% {background: aqua;box-shadow: 0px 4.6666666667px 24px 3px aqua;}50% {background: rgba(0, 255, 255, 0.4);box-shadow: 0px 4.6666666667px 24px 3px rgba(0, 255, 255, 0.2);}
}@keyframes flash-3 {0%,100% {background: #f70094;box-shadow: 0px 4.6666666667px 24px 3px #f70094;}50% {background: rgba(247, 0, 148, 0.4);box-shadow: 0px 4.6666666667px 24px 3px rgba(247, 0, 148, 0.2);}
}

代码2

Christmas Lights (codepen.io)

链接里有代码。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue + Element UI 前端篇(十二):用户管理模块

Vue Element UI 实现权限管理系统 前端篇&#xff08;十二&#xff09;&#xff1a;用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…

React中消息订阅与发布(PubSubJS)——两个组件之间通信

结合案例&#xff1a;github搜索案例 结果如下图 1.父容器代码 import React, { Component } from react import Search from ./components/Search import List from ./components/List export default class App extends Component {render() {return (<div className&…

【面试题】如何实现数组去重的?有几种方式?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 【国庆头像】- 国庆爱国 程序员头像&#xff01;总有一款适合你&#xff01; 1. 方法一&#xff1a;利用两层循环数组的splice方法 通过两层循环对数组…

zabbix监控平台部署

目录 前言 一、zabbix的基本概述 &#xff08;一&#xff09;、zabbix的工作流程 &#xff08;二&#xff09;、zabbix的构成 &#xff08;三&#xff09;、zabbix的监控对象 &#xff08;四&#xff09;、zabbix的常用术语 &#xff08;五&#xff09;、zabbix进程详解…

MySQL数据库的增删改查(进阶)

目录 数据库约束 约束类型 NULL约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 表的设计 一对一关系 一对多关系 多对多关系 查询 聚合查询 聚合函数 GROUP BY子句 HAVING …

深入协议栈了解TCP的三次握手、四次挥手、CLOSE-WAIT、TIME-WAIT。

TCP网络编程的代码网上很多&#xff0c;这里就不再赘述&#xff0c;简单用一个图展示一下tcp网络编程的流程&#xff1a; 1、深入connect、listen、accept系统调用&#xff0c;进一步理解TCP的三次握手 这三个函数都是系统调用&#xff0c;我们可以分为请求连接方和被…

项目(智慧教室)第四部分,页面交互功能

一。页面构思 1.标题栏 大标题&#xff1a;智慧教室管理系统 小标题&#xff1a;灯光&#xff0c;报警&#xff0c;风扇&#xff0c;温度&#xff0c;湿度&#xff0c;光照 2.样式设计 背景设置。字体设置&#xff08;字体大小&#xff0c;格式&#xff0c;颜色&#xff09; 3.…

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下&#xff0c;代码很简单&#xff0c;有几点要注意&#xff0c; 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时&#xff0c;如果需要插入空格&#xff0c;要使用双引号 cmd_ay(1) 0x33; …

【跟小嘉学 Rust 编程】二十三、Cargo 使用指南

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

【MySQL】CRUD (增删改查) 基础

CRUD&#xff08;增删改查&#xff09;基础 一. CRUD二. 新增 &#xff08;Create&#xff09;1. 单行数据 全列插入2. 多行数据 指定列插入 三. 查询&#xff08;Retrieve&#xff09;1. 全列查询2. 指定列查询3. 查询字段为表达式4. 别名5. 去重&#xff1a;DISTINCT6. 排序…

K210学习笔记——三角函数下的目标追踪

各位正在读文章的朋友们你们好&#xff0c;本人为非专业学生&#xff0c;如有不对的地方&#xff0c;期待您的指正。 目标追踪的意思是&#xff1a;识别到目标物体&#xff0c;通过舵机转动&#xff0c;朝向目标物体. 实验器材&#xff1a;二自由度舵机云台加两个SG90舵机&…

Vue2项目练手——通用后台管理项目第四节

Vue2项目练手——通用后台管理项目 数据的请求mock数据模拟实战文件目录src/api/mock.jssrc/api/mockServeData/home.jsmain.js 首页组件布局可视化图表可视化图表布局Home.vue echarts表Home.vue 数据的请求 mock数据模拟实战 mock官方文档 前端用来模拟后端接口的工具&…

uni-app语音转文字功能demo(同声传译)

目录 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 在文件中开始引用&#xff1a; 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 后续使用的时候可以看详情里面的信息进行使用 在文件中开始引用&#xff1a; 注意&#xff01;&#xff01;在这个…

为XDR扩展威胁检测响应提供响应解决方案

安全层面最本质的问题是检测与响应&#xff0c;而当前的检测与响应&#xff0c;还存在着一些痛点和难点亟需解决&#xff0c;响应运营层面仍存在着一些挑战。 各类安全防护设备每天会产生大量的安全告警&#xff0c;使得安全分析人员绝大部分时间和精力都“消耗”在告警信息中…

Mysql--技术文档--B+树-数据结构的认知

阿丹解读&#xff1a; 之前的文章中写道了有关mysql底层索引&#xff0c;那么在数据量特别大的情况下。mysql采用了B来管理索引。和存储的数据。 Mysql--技术文档--索引-《索引为什么查找数据快&#xff1f;》-超底层详细说明索引_一单成的博客-CSDN博客 B树解读&#xff1a…

flask中的操作数据库的插件Flask-SQLAlchemy

1、ORM 框架 Web 开发中&#xff0c;一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了&#xff0c;也称 SQL 数据库。另外&#xff0c;文档数据库&#xff08;如 mongodb&#xff09;、键值对数据库&#xff08;如 redis&#xff09;近几年也逐渐在 w…

sql:SQL优化知识点记录(十二)

&#xff08;1&#xff09;读锁案例讲解 加读锁和写锁 查看是否上锁&#xff1a;In_use&#xff1a;变成了1 读写锁对我们数据产生哪些影响&#xff1a; 读锁&#xff1a;是共享锁&#xff0c;其他线程可以查看&#xff1a; 加了读锁&#xff1a;session1不能修改自己&#xf…

使用Vue3和Vite升级你的Vue2+Webpack项目

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Opencv图像暗通道调优

基于雾天退化模型的去雾算法&#xff0c;Opencv图像暗通道调优&#xff0c;&#xff08;清华版代码&#xff09;对普通相片也有较好的调优效果&#xff0c;相片更通透。 结合代码实际运行效果、算法理论模型、实际代码。我个人理解&#xff0c;实际效果是对图像的三个颜色通道…

React三属性之:refs

作用 refs是为了获取节点,使用场景主要在需要操作dom的时候,比如echarts,就需要真实的dom节点 使用 import React from "react"; class RefsTest extends React.Component{state {value:输入框的值}refPlan React.createRef()logRef ()>{console.log(this.r…