css实现可控进度条动效

AE自动化进阶:构建UI模型构建器,实现动效设计工程化 在UI动效设计领域,提升效率的关键在于工作流的自动化与组件化。其核心原理是借助脚本语言(如ExtendScript)和表达式,对设计软件(如After Effects)进行深度控制,实现图层属性的参数化绑定与批量操作。这项技术的核心价值在于将重复的手动劳动转化为可复用、可迭代的工程化流程,从而显著提升设计一致性与团队协作效率。其典型应用场景包括构建可复用的UI动效组件库、实现设计稿变更的全局同步,以及为复杂交互原型提供快速搭建能力。本文聚焦的【UI模型构建器】正是这一理念的系统化实践,它通过整合【CEP扩展 阅读详情

css实现可控进度条动效

实现效果

在这里插入图片描述

实现思路

整体思路就是通过监听宽度的过渡效果,因为需要一步一步去增加,进度条变化的同时控制数字和节点的变化,所以我们监听了过渡结束事件,并增加执行队列,保证了进度条动画结束后在执行下一次的动画执行

(1)增加旗帜 addFlag方法,传入一个需要增加的数量,然后需要分条件去判断剩余的位置是否足够放下增加的数量?如果够,直接调用改变进度条宽度的方法
如果不够,需要判断剩余的位置是否大于0,如果是,那么就先占满,把剩下的放进队列里,等占满后在继续执行;如果剩余位置为0,需要先改变宽度为0,然后在执行宽度的变化函数

(2)监听的回调函数中,需要判断在达到目的节点后队列是否有值,有的话,执行队列的尾值

实现重点:递归,队列、过渡结束监听

实现代码

import React,{FC, useEffect, useRef, useState} from "react";
import styles from './index.less'

const Progressbar:FC<any> = ()=>{


  //初始化最开始的旗帜数
  const initFlag = (num:number)=>{
    const myflagNum = num
    if(myflagNum==0) return
    const mychangeflagNum = (myflagNum%5)===0?(Math.floor(myflagNum/5)-1)*5:Math.floor(myflagNum/5)*5
    setchangeflagNum(mychangeflagNum);
    addFlag(myflagNum)
  }


  useEffect(()=>{
    document.documentElement.style.fontSize=(document.documentElement.clientWidth/750)*100+'px';
    barRef.current.addEventListener("transitionend",widthchangend)
    initFlag(4);
  },[])

  const [barWidth,setbarWidth] =useState<number>(0)
    // 当前到达的节点
    const [nownode,setnowNode] =useState<number>(0)

    // 当前旗帜数
    const [flagNum,setflagNum] =useState<number>(0)

    //变化的旗帜数
    const [changeflagNum,setchangeflagNum] =useState<number>(0)

    const changeflagNumRef = useRef<any>(0);
    const flagNumRef = useRef<any>(0);
    const nownodeRef = useRef<any>(0);

    changeflagNumRef.current = changeflagNum
    flagNumRef.current = flagNum
    nownodeRef.current = nownode
    
    const barRef = useRef<any>(null);

    const queueRef = useRef<any>([]);//执行队列
    const addingRef = useRef<any>(false);//监听状态

    const widthObj:any = {
      "node1":20,
      "node2":40,
      "node3":60,
      "node4":80,
      "node5":100,
  }

  // 宽度变化结束 数字改变增加 节点增加
  const widthchangend  =()=>{
      setchangeflagNum( changeflagNumRef.current+1)
      setnowNode((  nownodeRef.current+1))
       // 增加到指定的数字了
      if(changeflagNumRef.current>= flagNumRef.current ){
        addingRef.current = false
        const num = queueRef.current.pop()
        if(num&&num>0){
          addFlag(num)
        }
        return
      }
      const nowFlag = changeflagNumRef.current%5+1;
      setbarWidth(widthObj["node"+nowFlag])
  }

  /**
   * 
   * @param flagNum // 需要更新的旗帜总数
   * @returns 
   */
    const changeWidth = (flagNum:number)=>{
        addingRef.current = true
        flagNumRef.current = flagNum
        setflagNum(flagNum)
    
        if(flagNum===0) return;

        //先增加一步 在这一步结束后 继续增加到指定数字
        const nowFlag = changeflagNumRef.current%5+1;
        setbarWidth(widthObj["node"+nowFlag])
    }


    // 增加旗帜的方法
    /**
     * 
     * @param num //需要增加的旗帜数
     * @returns 
     */
    const addFlag = (num:number)=>{
      if(num<=0){
        return 
      }

      // 如果目前正在执行动画中 那么把下次添加的加到队列里执行
      if(addingRef.current){
        console.log("加入队列",num)
        queueRef.current.push(num)
        return
      }
      
      // 变化的旗帜数===获得的旗帜总数
      // 不等于的时候就说明是进度条未加载完毕
      if(changeflagNum!==flagNumRef.current){
        setchangeflagNum(flagNumRef.current);
      }
     
  
      let k = 5; //k表示进度条上剩余的位置
      if(flagNumRef.current%5==0&&flagNumRef.current!==0){
          k=0
      }
      else{
         k  = 5-(flagNumRef.current%5)
      }
      console.log("剩余的位置",k,"需要增加的数量",num)
  
      // 剩余位置够放置需要增加的数量
      if(num<=k){
        const newflagNum = flagNumRef.current+num;
        changeWidth(newflagNum)
        return 
      }
      // 剩余的位置不够放置需要增加的数量
      else{
        // 没有剩余位置了
        if(k===0){
          // 需要换一页
          setbarWidth(0)
          setnowNode(0)
            // 加延时是为了移除过渡属性之后再去改变宽度,避免宽度过渡变为0的过渡被监听到
            setTimeout(()=>{
              // 需要判断增加的num是否大于5
              if(num>=5){
                changeWidth( flagNumRef.current +5)
                // 剩下的放进执行队列里 下次添加
                queueRef.current.push(num-5)
              }else{
                changeWidth( flagNumRef.current +num)
                
              }
            },500)
          return 
        }
        // 剩余位置k 把剩余的位置k占满 再次递归的时候就会回到上面的情况
        else{
          changeWidth( flagNumRef.current+k)
          queueRef.current.push(num-k)
        }
      }
    }


  return(
    <div className={styles.progress}>
       <div className={styles.num}>
          <span className={styles.text}>我的旗帜数量:{changeflagNum>flagNum?flagNum:changeflagNum}/332<span className={styles.tipIcon} /></span>
        </div>

      {/* 底 */}
      <div className={styles.bar}>
        {/* 需要宽度变化的那层 */}
        {/* 进度条 */}
        <div className={styles.bar2} 
          ref = {barRef}
          style={{width:`${barWidth}%`,
          transition:barWidth===0?"":`width 1s linear`
        }}
          >

            {/* 蒙层 主要是为了颜色的渐变 */}
            <div className={styles.masker} />
        </div>

         {/* 节点 旗帜 数字 */}
        <div className={styles.warpper}>
          {
              [0,1,2,3,4,5].map((item)=>{
              return(<div className={styles.nodeWrapper} key={item}>
                    
                  <div style={{position:"relative", left:"-0.3rem",width:"0.7rem",display:"flex",justifyContent:"flex-end",alignItems:"flex-start"}}>
                    <span className={styles.number}>
                      {
                        flagNum%5==0&&flagNum!=0?item+(Math.floor(flagNum/5)-1)*5:
                        item+Math.floor(flagNum/5)*5
                      }
                    </span>
                    <span className={styles.flag}/>
                  </div>
                  {/* 节点得判断 */}
                  {
                    item==5?<div className={styles.nodeEnd} >
                      <span className={styles.giftIcon}
                      style={{ animation:barWidth==100?`${styles.twinkle} 0.8s infinite 1s`:""}}
                      />
                    </div>:
                    <div className={styles.node1}>
                      <span className={styles.node2} style={{
                        opacity:item%5<=nownode?1:0,
                        transition:nownode===0?"":`opacity 1.5s`
                      }}/>
                    </div>
                  }
                  
                </div>)
              })
          }
        </div>

        <div onClick={()=>{addFlag(3)}} className={styles.btn}>增加旗帜</div>
      </div>
      
    </div>
  )
}

export default Progressbar
.progress{
  position: relative;
  width: 100%;
  .num{
    background:linear-gradient(#FFF2E8,#FFE2BE);
    border-radius: 0.15rem;
    width: 90%;
    height: 1rem;
    margin: auto;
    margin-top: 0.3rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
    .text{
      color:#7A1C0E;
      font-size: 0.29rem;
      margin-left: 0.15rem;
    }
  }
  .bar{
    background-image: url(../../img/progress/flagProgressBar.png);
    background-repeat: no-repeat;
    background-size: 100% 100%;
    width: 6rem;
    height: 0.2rem;
    margin: 1rem auto;
    position: relative;
    .bar2{
      height: 0.2rem;
      border-radius: 0.2rem;
      background:linear-gradient(to right, #FF9445,#FFE29D); //外层的边框
      display: flex;
      align-items: center;
      transform: translateY(-0.04rem);
      position: absolute;
    
      .masker {
        position: absolute;
        width: calc(100% - 0.05rem);
        height: 0.16rem;
        opacity: 0.6;
        border-radius: 0.2rem;
        background:linear-gradient(to right, #FF8751,#FFE7D0);
        margin-left: 0.025rem;
       
      }
    }
    .bar2::after{
          width: calc(100% - 0.05rem);
          height: 0.16rem;
          border-radius: 0.2rem;

          // 制造倾斜条纹
          background: repeating-linear-gradient(-45deg, #FF8F5B  25%, #FE5404 0, #FE5404  46%, #FF8F5B  0, #FF8F5B  75%, #FE5404 0);
          background-size: 0.2rem 0.2rem;
          content: '';
          border-radius: 0.2rem;
          margin-left: 0.025rem;

          // 条纹移动的动画
          animation: panoramic 30s linear infinite;
          
    }
  }

  .warpper{
      position: absolute;
      width: 100%;
      display: flex;
      top: -0.4rem;
      left: 3%;
      justify-content: space-between;
      align-items: flex-start;
      z-index: 2;
      .num0{
        position: absolute;
        top: -0.1rem;
        left: -18%;
        font-size: 0.24rem;
        color: #E5571D;
        vertical-align: super;
      }
      .nodeWrapper{
        display: flex;
        flex-direction:column;
        align-items: flex-start;
        .number{
          font-size: 0.24rem;
          color: #E5571D;
          vertical-align: super;
          margin:-0.1rem 0.1rem 0 0;
        }
        .flag{
          display: inline-block;
          background-image: url(../../img/progress/flag.png);
          background-repeat: no-repeat;
          background-size: cover;
          width: 0.23rem;
          height: 0.33rem;
          vertical-align: text-top;
        }

        .node1{
          background:url(../../img/progress/node1.png);
          background-repeat: no-repeat;
          background-size: 100% 100%;
          display: block;
          width: 0.23rem;
          height: 0.23rem;
          position: relative;
          display: flex;
          justify-content: center;
          align-items: center;
          .node2{
            background:linear-gradient(45deg, #FE4107, #FF925E);
            border-radius: 50%;
            width: 0.15rem;
            height: 0.15rem;
            display: inline-block;
          }
        }
        .nodeEnd{
          background:url(../../img/progress/node1.png);
          background-repeat: no-repeat;
          background-size: 100% 100%;
          width: 0.23rem;
          height: 0.23rem;
          position: relative;
          z-index: 1;
          border-radius: 50%;
          transform: scale(1.65);
          .giftIcon{
            width: 0.25rem;
            height: 0.29rem;
            background-image: url(../../img/progress/giftIcon.png);
            background-size: cover;
            display: inline-block;
            position: absolute;
            top: 0;
            left: -0.015rem;
          }
          .giftIcon2{
            width: 0.25rem;
            height: 0.29rem;
            background-image: url(../../img/progress/openGift.png);
            background-size: cover;
            display: inline-block;
            position: absolute;
            top: 0;
            left: -0.015rem;
            transform: scale(1.2);
          }
        }
      }
     
  }

  .btn{
    background-color: #E5571D;
    border-radius: 0.5rem;
    width: 2rem;
    margin: auto;
    position: relative;
    top: 0.5rem;
    text-align: center;
    line-height: 0.5rem;
    height: 0.5rem;
    color: wheat;
    font-weight: bold;
    cursor: pointer;
  }
}   

/*进度条动画*/
@keyframes panoramic{
  to {
    background-position: 200% 0;
  }
}
用css写进度条 用css写进度条 我们平时写进度条一般是一个父div包裹一个子div,用js控制子div的宽度 实现进度条,我们现在可以用css简单实现进度条了。 代码如下: 在vue项目里咱们只需要控制数字就行了,非常简单方便 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, 阅读详情

相关推荐

[前端案例]用HTML、JS、CSS实现一个进度条,加上动画效果

进度条最终效果如下,上面是一个进度条进度,进度通过线条颜色来控制:蓝色表示已达到该进度,黑色表示未达到;下方是两个按钮来控制整体进度条的进度:点击Prev按钮减少进度,Next来增加进度;首先创建一个 index.html,补充页面中的标签元素</</</</</</</</</</</</</</</</</

小张Python 2283

CSS进度条动画

CSS动画实现进度条从左到右滚动utm_id=0。

weixin_44481113的博客 2919

纯CSS实现高性能Loading动画:从旋转圆圈到进度条的实战指南

在前端开发中,CSS动画是实现流畅用户界面的核心技术之一,它通过@keyframes和animation属性控制元素的变换状态,从而创建无需JavaScript的动效。其原理是利用浏览器的硬件加速优化transform和opacity属性,实现高性能渲染,这对提升页面加载速度和用户体验至关重要。在工程实践中,纯CSS动画因其极小的代码体积、无外部依赖和高度可控性,成为实现轻量级加载反馈的理想选择,广泛应用于表单提交、数据请求等需要明确进度指示的场景。本文聚焦于**Loading效果**这一常见需求,深入解析

weixin_27676369的博客 240

什么是Redux?它的核心概念有哪些?

引言Redux 核心概念Store(仓库)State(状态)Action(动作)Reducer(规约器)安装与初始化示例代码示例一:定义 Action示例二:编写 Reducer示例三:合并 Reducers示例四:连接 Store 和组件功能使用思路1. 状态管理2. 异步操作3. 模块化和可测试性实际工作中的使用技巧结语return {return {Redux 为复杂的前端应用提供了一套强大而灵活的状态管理方案。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1069

HTML/CSS 实现各类进度条的多种方式

通过灵活运用 CSS 的样式和属性,我们可以创建出各种形式的进度条来满足不同的需求。在前端开发中,进度条是常见的元素之一,用于显示任务、加载、上传等操作的进度。本文将介绍多种使用 HTML 和 CSS 实现各类进度条的方式,并提供相应的源代码。水平进度条是最常见的进度条类型,用于表示任务的完成度或加载进度。类来表示不同的进度段,并通过设置各自的宽度来控制显示的进度。在上面的代码中,我们将宽度设置为固定值,将高度设置为百分比来实现垂直进度条。来包裹圆形进度条,并设置了固定的宽度和高度。属性来控制进度的显示。

ScriptWELL的博客 1873

实现带进度条的文件上传功能

本文还有配套的精品资源,点击获取 简介:在Web开发中,实现文件上传并带有进度条的功能是提升用户体验的关键。通过HTML5的File API和Ajax异步通信,可以实时更新上传进度。本文详细探讨了该功能的实现原理、相关技术及其重要性,并指出了优化兼容性和安全性的关键点。 1. 文件上传进度条的用户体验价值 1.1 用户体验的重要性 在数字时代,用户界面...

weixin_42593130的博客 2020

UI Skills 动效技能横向对比:motion/react、GSAP与WAAPI到底怎么选

[![UI Skills 动效技能项目封面](https://raw.gitcode.com/GitHub_Trending/ui/ui-skills/raw/179e9e990a3ebc18620959e134f2b597819e0d50/public/UI-OG-X.png?utm_source=gitcode_repo_files)](https://link.gitcode.com/i/0

gitblog_00258的博客 912

Web前端实战:基于颜色动态更新的进度条设计与实现

或原生<progress>元素作为主要容器。对于自定义程度较高的进度条,通常采用<div>配合类名的方式进行封装:

weixin_31139479的博客 1324

前端 CSS样式 进度条的实现

** 进度条是一个非常常见的功能,实现起来也不难,一般我们都会用 div 来实现。 作为一个这么常见的需求, whatwg 肯定是不会没有原生组件提供(虽然有我们也不一定会用),那么就让我们来康康有哪些有意思的进度条实现方式。** *常规版 — div 一波流 这是比较常规的实现方式,先看效果:* 源码如下: <style> .progress1 { height: 20px; width: 300px; background-color: #f5f5f5;

weixin_46820017的博客 2496

CTF-Web学习笔记:服务端请求伪造(SSRF)篇

本文系统介绍了CTF比赛中SSRF漏洞的攻防技术。首先解析了SSRF的核心原理,即利用服务器对用户输入URL的未校验缺陷,诱导其访问内网资源。然后详细分析了5类常见CTF题型:文件读取、内网探测、云服务元数据窃取、协议绕过及组合漏洞利用。重点讲解了绕过URL过滤、利用特殊协议(如dict://、gopher://)等实战技巧,并通过一道SSRF+Redis的高阶题目演示完整攻击链。最后给出防御建议:严格校验输入URL、禁用危险协议、实施内网隔离等。

Deng7326的博客 1688

深度学习中的注意力机制

最近两年,注意力模型(Attention Model)被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中,是深度学习技术中最值得关注与深入了解的核心技术之一。本文以机器翻译为例,深入浅出地介绍了深度学习中注意力机制的原理及关键计算机制,同时也抽象出其本质思想,并介绍了注意力模型在图像及语音等领域的典型应用场景。

优快云人工智能 4万+

视觉后效原理与前端模拟:从猫和老鼠幻觉到UI动效避坑指南

运动后效是一种常见的视觉感知现象,其原理源于人眼神经系统的适应性机制。当视觉系统长时间接收高强度定向刺激后,神经元会产生疲劳,导致刺激停止后出现相反运动的错觉。这一现象在神经科学和视觉认知领域具有重要研究价值,能够帮助开发者理解用户视觉疲劳的成因。在工程实践中,运动后效常通过前端技术进行模拟和验证,例如使用Canvas或CSS动画创建定向运动场景,以测试UI动效的舒适性。对于UI/UX设计和游戏开发而言,掌握运动后效原理有助于规避因动效设计不当导致的用户眩晕问题,提升产品的视觉体验。本文结合“猫和老鼠追出幻

weixin_30516243的博客 597

Windows系统的Mamba环境配置详细教程(状态空间模型)

causal_conv1d也是安装mamba的依赖必须库。安装完成后,通过pip list可以查看到安装的库。Triton是安装mamba的依赖,需要先安装。上述工作准备好后,按下面步骤安装。直接根据离线文件安装即可。是自己的虚拟环境名字。

2301_77831163的博客 3674

你不知道的 CSS 进度条

作者:陈大鱼头github:KRISACHAN进度条是一个非常常见的功能,实现起来也不难,一般我们都会用 div 来实现。作为一个这么常见的需求, whatwg 肯定是不会没有原生组件提...

祈澈菇凉 658

学习记录——SIMPACK生成轨道谱文件的方法

生成轨道谱文件的方法,可以用于实测轨道谱导入和自制轨道谱导入仿真

weixin_51965897的博客 7798

科研级YOLOv8 Neck革新:BiFPN双向特征金字塔赋能,让多尺度融合更高效的实战指南

在文件夹下新建BiFPN.py,将上述BiFPNLayer和BiFPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

m0_64661770的博客 153

vue自适应带圆圈的进度条实现#根据数量占比计算进度条长度#颜色可控

可以全局挂载–然后调用,这里的dom用了uuid当作id去渲染样式,不用担心互相影响,里面可配置。一些组件库例如ele的进度条实现只是简单的实现进度条样式,进度条的长度是百分比形式,未做到。去动态计算,这是我在这里要去实现的。

weixin_44524243的博客 1432

LeRobot 入门教程(三)在仿真环境和自定义机器人上部署 LeRobot

本教程详细介绍了基于真实世界机器人和仿真环境的模仿学习实现方法,涵盖数据采集、训练策略和评估全流程。在真实机器人部分,重点讲解了远程操作设置、摄像头配置、数据集记录与管理技巧、策略训练(支持GPU/MPS设备)以及模型评估。仿真环境部分则演示了gym-hil的安装使用、模拟数据采集和策略训练。此外,教程还提供了自定义机器人集成指南,包括电机选择、接口继承、传感器/动作特征定义、连接管理和校准配置等核心步骤。所有方法均支持HuggingFace数据集中心和Weights & Biases工具链,为机器

2506_90492529的博客 2399

Streamlit+GPT-4提示工程流水线:结构化输出与动效协同设计

大模型应用落地的核心挑战在于将不可控的生成过程转化为可测试、可版本化、可度量的工程实践。提示工程不再只是文本编写,而是涵盖模板约束、响应校验与前端反馈的闭环系统;结构化输出控制通过Pydantic模型与正则预清洗实现双重保障,确保JSON格式与业务语义双达标;Streamlit动效设计则突破传统加载态,将进度映射至真实延迟分位数,以状态驱动替代视觉装饰,显著提升用户信任与操作确定性。该模式适用于AI工具快速交付、自动化报告生成及工程面试实战,是面向生产环境的轻量级LLM应用架构范式。

weixin_30383279的博客 399

5G射频到底是啥?方案怎么搭?工作流程、SAW选型、PA选型一口气讲透(工程师秒懂版)

很多人一提 5G 射频,脑子里先冒出来的是几个零件名:👉 PA👉 LNA👉 SAW👉 天线👉 开关但真正做方案时,这些东西不是一堆分立器件,而是一条完整的“信号流水线”。更准确地说,。Qualcomm 对 RFFE 的定义就是“把信息转换成可发送的射频信号,并把接收到的信号转换回有用信息”的那一整套组件。

weixin_43199439的博客 533

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容

m0_61544122的博客 3203

SVG 实现拟物态圆环进度条

SVG 实现拟物态圆环进度条

苏苏就是小苏苏的博客 1482

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Figma智能动画与蒙版实战:零代码实现高级流光边框动效

在UI/UX设计和原型开发领域,动效设计是提升用户体验和界面表现力的关键技术。其核心原理在于通过关键帧和过渡动画,将静态界面转化为富有生命力的交互体验。从技术价值看,优秀的动效不仅能清晰传达状态变化、引导用户焦点,更能显著降低开发与设计之间的沟通成本,实现设计稿的高保真演示。尤其在Figma等主流设计工具中,利用其内置的智能动画(Smart Animate)与蒙版(Mask)功能进行组合,设计师可以在无需编写代码或依赖第三方插件的情况下,模拟出诸如流光边框、能量流动等复杂的动态视觉效果。这种方法将设计到原型

weixin_30482383的博客 352

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

css3在结束时暂停,JS/CSS3 可控进度条动画(可启动/暂停/结束)

CSS语言:CSSSCSS确定html,body {height: 100%;}body {background: #b9b0e3;color: #fff;font-family: Courier;font-size: 16px;font-weight: bold;text-transform: uppercase;-webkit-font-smoothing: antialiased;}.con...

weixin_34365489的博客 367

MusePublic Art StudioUI动效解析:加载动画与进度反馈心理学设计

本文介绍了如何在星图GPU平台上自动化部署🎨 MusePublic Art Studio镜像,实现AI驱动的艺术创作体验。该镜像通过精心设计的UI动效(如神经笔触加载动画与进度反馈),显著提升用户等待过程中的心理舒适度与信任感,典型应用于AI绘画生成场景,助力创作者高效产出高质量视觉内容。

weixin_30923011的博客 339

用position: sticky快速打造阅读进度条

这个阅读进度条的实现展示了position: sticky的实用场景。相比传统fixed方案,sticky定位更加灵活可控。添加章节指示功能实现颜色主题切换集成到CMS系统中增加阅读时间预估通过这个简单项目,我再次体会到现代CSS的强大和便捷。有了像InsCode(快马)平台这样的工具,前端原型的实现和分享变得更加简单高效。

GreyWolf12的博客 898
上一篇: 动态规划之01背包问题
下一篇: 详解图的最短路径算法(BFS、Dijkstra、Floyd)(附上图解步骤)
神说要有光 ye
博客等级 码龄8年 463粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值