CSS @property 颜色过渡动画实例

news2024/12/26 1:03:14

CSS @property 颜色过渡动画实例

基础知识

@property 语法回顾

@property --custom-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #ff0000;
}

颜色表示方式

在使用 @property 进行颜色动画时,我们可以使用以下颜色格式:

  • HEX: #RRGGBB
  • RGB: rgb(r, g, b)
  • RGBA: rgba(r, g, b, a)
  • HSL: hsl(h, s%, l%)
  • HSLA: hsla(h, s%, l%, a)

基本颜色过渡

1. 简单颜色过渡

@property --main-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #ff0000;
}

.color-box {
  width: 100px;
  height: 100px;
  background: var(--main-color);
  transition: --main-color 0.5s ease;
}

.color-box:hover {
  --main-color: #0000ff;
}

2. 多状态颜色切换

@property --status-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #grey;
}

.status-indicator {
  background: var(--status-color);
  transition: --status-color 0.3s;
}

.status-indicator.success { --status-color: #4caf50; }
.status-indicator.warning { --status-color: #ff9800; }
.status-indicator.error { --status-color: #f44336; }

高级动画技巧

1. 渐变色过渡

@property --gradient-start {
  syntax: '<color>';
  inherits: false;
  initial-value: #ff0000;
}

@property --gradient-end {
  syntax: '<color>';
  inherits: false;
  initial-value: #00ff00;
}

.gradient-box {
  background: linear-gradient(
    45deg,
    var(--gradient-start),
    var(--gradient-end)
  );
  transition: --gradient-start 0.5s, --gradient-end 0.5s;
}

.gradient-box:hover {
  --gradient-start: #0000ff;
  --gradient-end: #ffff00;
}

2. HSL 色相动画

@property --hue {
  syntax: '<number>';
  inherits: false;
  initial-value: 0;
}

.rainbow-box {
  background: hsl(calc(var(--hue) * 1deg), 70%, 60%);
  animation: hue-rotate 3s linear infinite;
}

@keyframes hue-rotate {
  to {
    --hue: 360;
  }
}

3. 脉冲效果

@property --pulse-color {
  syntax: '<color>';
  inherits: false;
  initial-value: rgba(255, 0, 0, 0.2);
}

.pulse {
  background: var(--pulse-color);
  animation: pulse 2s infinite;
}

@keyframes pulse {
  0% { --pulse-color: rgba(255, 0, 0, 0.2); }
  50% { --pulse-color: rgba(255, 0, 0, 0.8); }
  100% { --pulse-color: rgba(255, 0, 0, 0.2); }
}

实战示例

1. 主题切换按钮

@property --button-bg {
  syntax: '<color>';
  inherits: false;
  initial-value: #2196f3;
}

@property --button-text {
  syntax: '<color>';
  inherits: false;
  initial-value: #ffffff;
}

.theme-button {
  background: var(--button-bg);
  color: var(--button-text);
  transition: --button-bg 0.3s, --button-text 0.3s;
}

[data-theme="dark"] .theme-button {
  --button-bg: #333333;
  --button-text: #ffffff;
}

[data-theme="light"] .theme-button {
  --button-bg: #ffffff;
  --button-text: #333333;
}

2. 加载进度指示器

@property --progress-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #e0e0e0;
}

@property --progress {
  syntax: '<percentage>';
  inherits: false;
  initial-value: 0%;
}

.progress-bar {
  width: var(--progress);
  background: var(--progress-color);
  transition: --progress 0.3s, --progress-color 0.3s;
}

.progress-bar[data-progress="100"] {
  --progress: 100%;
  --progress-color: #4caf50;
}

性能优化

1. 使用硬件加速

.animated-element {
  transform: translateZ(0);
  will-change: background;
}

2. 减少同时动画的属性数量

/* 好的实践 */
@property --combined-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #ff0000;
}

/* 避免同时动画多个颜色属性 */
.element {
  background: var(--combined-color);
  transition: --combined-color 0.3s;
}

3. 使用 RequestAnimationFrame

// 当需要通过 JavaScript 控制颜色动画时
function updateColor(element, startColor, endColor, duration) {
  const start = performance.now();
  
  function update(currentTime) {
    const elapsed = currentTime - start;
    const progress = Math.min(elapsed / duration, 1);
    
    element.style.setProperty('--dynamic-color', 
      interpolateColor(startColor, endColor, progress));
    
    if (progress < 1) {
      requestAnimationFrame(update);
    }
  }
  
  requestAnimationFrame(update);
}

兼容性处理

1. 特性检测

@supports (animation-timeline: works) {
  @property --custom-color {
    syntax: '<color>';
    inherits: false;
    initial-value: #ff0000;
  }
  
  .animated-element {
    /* 现代浏览器样式 */
  }
}

/* 后备样式 */
.animated-element {
  transition: background-color 0.3s;
}

2. JavaScript 回退方案

if (!CSS.registerProperty) {
  // 提供传统的 CSS transition 实现
  element.style.backgroundColor = newColor;
}

最佳实践建议

  1. 动画性能

    • 优先使用 opacity 和 transform 属性
    • 避免同时动画过多元素
    • 使用 will-change 提示浏览器优化
  2. 可访问性

    • 考虑减少动画(prefers-reduced-motion)
    • 确保颜色对比度符合 WCAG 标准
    • 避免闪烁效果
  3. 代码组织

    • 将动画相关的 CSS 分组
    • 使用有意义的变量名
    • 添加适当的注释说明
  4. 调试技巧

    • 使用浏览器开发工具检查动画
    • 测试不同的动画时长和缓动函数
    • 验证在不同设备上的性能

通过合理使用 @property 实现颜色动画,可以创建流畅、高效的视觉效果。记住要在实现炫酷效果的同时,始终考虑性能和可访问性。

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

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

相关文章

RabbitMQ中的Topic模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;支持多种消息传递模式&#xff0c;其中 Topic 模式 是一种灵活且强大的模式&#xff0c;允许生产者…

OpenEuler 22.03 安装 flink-1.17.2 集群

零&#xff1a;规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器&#xff0c;用于搭建 flink 集群。这里使用flink1.17.2 的原因&#xff0c;是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…

国标GB28181公网直播EasyGBS与国标GB28181协议融合,助力应急救援指挥无线视频监控系统建设

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一转变过程中&#xff0c;国标GB28181协议以其强大的功能和广泛的应用场景&#xff0c;成为了公共安全视频监控联网系统的核心标准。 应急救援指挥系统要求能够迅速响应各…

VisionPro开发使用交互反馈系统(Affordance System)

XR Interaction Toolkit 提供了一个affordance system 可供性系统&#xff0c;使用户能够创建对交互状态的视觉和听觉反馈。一般的信息流从向Affordance State Provider场景中添加一个&#xff08;通常是可交互的&#xff09;并将其指向我们要监视其交互状态的可交互对象开始。…

SpringCloud 入门(4)—— 网关

上一篇&#xff1a;SpringCloud 入门&#xff08;3&#xff09;—— Nacos配置中心-CSDN博客 Spring Cloud Gateway 作为 Spring Cloud 生态系统的一部分&#xff0c;主要在微服务架构中充当 API 网关的角色。它提供了统一的入口点来处理所有的 HTTP 请求&#xff0c;并将这些请…

在linux系统的docker中安装GitLab

一、安装GitLab&#xff1a; 在安装了docker之后就是下载安装GitLab了&#xff0c;在linux系统中输入命令&#xff1a;docker search gitlab就可以看到很多项目&#xff0c;一般安装第一个&#xff0c;它是英文版的&#xff0c;如果英文不好可以安装twang2218/gitlab-ce-zh。 …

vscode打开下一个文件的时候上一个文件会关闭

解决方法&#xff1a; 你可以通过设置 workbench.editor.enablePreview 来控制在 VS Code 中打开文件时是否会关闭上一个文件。将其设置为 false 可以防止这种行为。 {"workbench.editor.enablePreview": false } 在设置编辑器中显示 "workbench.editor.enab…

PostgreSQL编译安装教程

下载安装 1.在家目录创建一个文件夹放下载安装包 mkdir softwarecd software 2.下载文件压缩包 wget https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz 3.解压 tar -xzvf postgresql-16.0.tar.gz 4.编译 在software/postgresql-16.0下 cd software…

访谈积鼎科技总经理:国产CFD软件发展与未来趋势展望

傅彦国&#xff0c;上海积鼎信息科技有限公司创始人 记者&#xff1a;请傅总介绍下我国流体仿真行业的发展现状是怎样的&#xff1f; 傅彦国&#xff1a;自2018年政府加大了对核心技术自主研发的支持力度&#xff0c;国产CFD软件逐渐步入发展正轨。 首先&#xff0c;从市场规…

重温设计模式--代理模式

文章目录 定义UML图代理模式主要有以下几种常见类型&#xff1a;代理模式涉及的主要角色有&#xff1a;C 代码示例 定义 代理模式&#xff08;Proxy Pattern&#xff09;属于结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…

R语言数据分析案例46-不同区域教育情况回归分析和探索

一、研究背景 教育是社会发展的基石&#xff0c;对国家和地区的经济、文化以及社会进步起着至关重要的作用。在全球一体化进程加速的今天&#xff0c;不同区域的教育发展水平呈现出多样化的态势。这种差异不仅体现在教育资源的分配上&#xff0c;还表现在教育成果、教育投入与…

uni-app使用组件button遇到的问题

在HBuilder X工具中新建一个空白项目&#xff0c; 1、新建一个about页 然后在pages.json文件里加上路由 2、然后看下导航的方法&#xff0c;发现找不到navigateTo方法 参考&#xff1a;button | uni-app官网 第3行和第4行的代码倒是没问题的&#xff0c;第5行的代码有问题执行…

git自己模拟多人协作

目录 一、项目克隆 二、多人协作 1.创建林冲仓库 2.协作处理 3.冲突处理 三、分支推送协作 1.创建develop分支 2.发现git push无法把develop推送到远程 ​编辑 3.本地的分支推送到远程分支 四、分支拉取协作 五、远程分支的删除 远程仓库用的gitee 一、项目克隆 …

基于springboot+vue实现的卷烟营销统计分析系统 (源码+L文+ppt)4-129

摘 要 卷烟行业的快速发展使得卷烟营销统计分析系统成为了一个必不可少的工具。基于Java的卷烟营销统计分析系统旨在提供高效、准确和便捷的适用卷烟营销服务。本文讲述了基于java语言开发&#xff0c;后台数据库选择MySQL进行数据的存储。该软件的主要功能是进行卷烟营销统计…

解析CGI(通用网关接口)技术

在互联网技术飞速发展的今天&#xff0c;CGI&#xff08;Common Gateway Interface&#xff0c;通用网关接口&#xff09;作为一种常见的服务器端脚本技术&#xff0c;依然在许多老旧网站和小型网站中广泛使用。尽管如今有许多更现代的技术替代了CGI&#xff0c;但它仍然是理解…

OPPO C++面试题及参考答案

五层协议每层包含的协议 在计算机网络的五层协议体系结构&#xff08;自下而上为物理层、数据链路层、网络层、传输层和应用层&#xff09;中&#xff0c;各层包含多种协议。 物理层主要负责在物理介质上传输原始的比特流&#xff0c;包括像 RJ - 45 接口标准等物理接口规范&am…

OpenAI 普及 ChatGPT,开通热线电话,近屿智能深耕AI培训

12月19日&#xff0c;在OpenAI直播活动的第10天&#xff0c;宣布允许用户通过电话或WhatsApp与ChatGPT进行交互。并在美国推出 ChatGPT 热线电话&#xff0c;用户拨打后可与 ChatGPT 进行语音对话。 这项服务的一个亮点在于它兼容各种类型的通信设备——不论是现代智能手机如iP…

四种电子杂志制作软件

​大家好&#xff0c;今天给大家种草四种超级实用的电子杂志制作软件。无论你是专业出版人士&#xff0c;还是业余爱好者&#xff0c;这四款软件都能帮助你轻松制作出精美的电子杂志。让我们一起来看看吧&#xff01; 1.FLBOOK FLBOOK是一款在线仿真翻页制作H5电子画册&#x…

idea配置

2024.3 idea 重装idea启动失败样式常用插件 重装idea启动失败 1、检查环境变量&#xff0c;是否已设置 2、检查安装目录下&#xff0c;或对应的环境变量对应的路径文件下 是否有javaagent&#xff0c;可先移除或者检查配置是否正确 样式 1、展示上方工具栏 2、展示内存使用…

微信小程序的轮播图学习报告

微信小程序轮播图学习报告 好久都没分享新内容了&#xff0c;实在惭愧惭愧。今天给大家做一个小程序轮播图的学习报告。 先给大家看一下我的项目状态&#xff1a; 很空昂&#xff01;像一个正在修行的老道&#xff0c;空的什么也没有。 但是我写了 4 个 view 容器&#xff0c;…