CSS 实现七彩圆环loading动画

简介: CSS 实现七彩圆环loading动画

前言


👏CSS 实现七彩圆环loading动画,速速来Get吧~

1.实现效果


2.实现步骤


  • 定义父容器宽度为–w,每个圆环之间的gap间距为–gap,圆环的border边框宽为–border;
:root {
 --border: 5px;
 --gap: 30px;
 --w: 200px;
}
  • 如何绘制一个半圆环?
  • 定义一个div元素,假设宽为200px,高为200px/2(即为宽度的一半),圆角,设置border边框



div{
  width: 200px;
  height: 100px;
  border: 5px solid #e94545;
  border-radius: 50%;
}


  • 修改border-radius为50% 50% 0 0/100% 100% 0 0



+ border-radius: 50% 50% 0 0/100% 100% 0 0;
 + border-radius: 50%;


  • 去掉底部边框,就可以得到一个半圆环了
+ border-bottom: none;


  • 在父容器内定义七个半圆环,为每个圆环添加自定义变量,–c表示当前圆环的边框颜色,–i表示当前圆环的索引位置(从0开始,依次+1)
<section>
  <div class="loader-item" style="--c: #e94545; --i: 0"></div>
  <div class="loader-item" style="--c: #eb8f34; --i: 1"></div>
  <div class="loader-item" style="--c: #eecf69; --i: 2"></div>
  <div class="loader-item" style="--c: #215221; --i: 3"></div>
  <div class="loader-item" style="--c: #87bb80; --i: 4"></div>
  <div class="loader-item" style="--c: #87ceeb; --i: 5"></div>
  <div class="loader-item" style="--c: #c393eb; --i: 6"></div>
</section>


section {
  width: var(--w);
  height: var(--w);
  position: relative;
}
  • 为每个半圆环添加样式,基于父容器absolute定位,水平居中,left为50% - 宽度的一半
  • 第一个圆环的宽度为–w,每个圆环的高度都为宽度的一半


  • 每个圆环间的gap为–gap,所以第二个圆环的宽度为w-gap*2


  • 第三个半圆环的宽度为w-gap22


  • 可以得到,每个圆环的宽度为calc(var(–w) - var(–gap) * 2 * var(–i)),i为当前圆环的索引位置(从0开始,依次+1)


.loader-item {
    --width: calc(var(--w) - var(--gap) * 2 * var(--i));
    width: var(--width);
    height: calc(var(--width) / 2);
    border: var(--border) solid var(--c);
    border-radius: 50% 50% 0 0/100% 100% 0 0;
    border-bottom: none;
    position: absolute;
    left: calc(50% - var(--width) / 2);
 }


  • 为每个半圆环设置top,第一个圆环为0,第二个为gap,第三个为gap*2,可得到top为 calc(var(–gap) * var(–i))


.loader-item{
 + top: calc(var(--gap) * var(--i));
}


  • 为每个圆环添加旋转动画,哎嘛呀,这转的也太不和谐了


.loader-item{
 + animation: rotate 2s cubic-bezier(0.11, 0.85, 0.22, 1.3) infinite;
}
@keyframes rotate {
  0%,
  25% {
   transform: rotate(0deg);
  }
  100% {
   transform: rotate(360deg);
  }
}


  • 添加transform-origin,设置为 50% 100%,这才对了,和谐多了


.loader-item{
 + transform-origin: 50% 100%;
}


  • 设置动画延迟,第一个圆环延迟-0ms,第二个延迟-60ms,第三个延迟-120ms,即calc(-60ms * var(–i)),i为当前圆环的索引位置(从0开始,依次+1)


.loader-item{
 + animation-delay: calc(-60ms * var(--i));
}


  • 父容器添加hover事件,当hover时候,将每个圆环的亮度提示,并暂停动画,就完成了啦~


section:hover .loader-item {
  filter: brightness(1.5);
  animation-play-state: paused;
 }


  • 每个半圆环,添加0.5的transition过渡效果


.loader-item{
 + transition: all 0.5s;
}


3.实现代码


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <link rel="stylesheet" href="../common.css" />
  <style>
    :root {
      --border: 5px;
      --gap: 15px;
      --w: 200px;
    }
    section {
      width: var(--w);
      height: var(--w);
      position: relative;
    }
    .loader-item {
      --width: calc(var(--w) - var(--gap) * 2 * var(--i));
      width: var(--width);
      height: calc(var(--width) / 2);
      border: var(--border) solid var(--c);
      border-radius: 50% 50% 0 0/100% 100% 0 0;
      border-bottom: none;
      position: absolute;
      left: calc(50% - var(--width) / 2);
      top: calc(var(--gap) * var(--i));
      transform-origin: 50% 100%;
      animation: rotate 2s cubic-bezier(0.11, 0.85, 0.22, 1.3) infinite;
      animation-delay: calc(-60ms * var(--i));
      transition: all 0.5s;
    }
    section:hover .loader-item {
      filter: brightness(1.5);
      animation-play-state: paused;
    }
    @keyframes rotate {
      0%,
      25% {
        transform: rotate(0deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }
  </style>
  <body>
    <section>
      <div class="loader-item" style="--c: #e94545; --i: 0"></div>
      <div class="loader-item" style="--c: #eb8f34; --i: 1"></div>
      <div class="loader-item" style="--c: #eecf69; --i: 2"></div>
      <div class="loader-item" style="--c: #215221; --i: 3"></div>
      <div class="loader-item" style="--c: #87bb80; --i: 4"></div>
      <div class="loader-item" style="--c: #87ceeb; --i: 5"></div>
      <div class="loader-item" style="--c: #c393eb; --i: 6"></div>
    </section>
  </body>
</html>
相关文章
|
1月前
|
机器学习/深度学习 前端开发 JavaScript
|
2月前
|
前端开发
CSS:Loading效果
CSS:Loading效果
27 0
|
28天前
|
前端开发 搜索推荐 UED
实现 CSS 动画效果的兼容性
【10月更文挑战第16天】实现 CSS 动画效果的兼容性需要对不同浏览器的特性有深入的了解,并采取适当的策略和方法。通过不断的实践和优化,你可以在各种浏览器上创造出流畅、美观且兼容的动画效果,为用户带来更好的体验。在实际开发中,要密切关注浏览器的发展动态,及时掌握最新的兼容性技巧和解决方案,以确保你的动画设计能够在广泛的用户群体中得到良好的呈现。
103 58
|
6天前
|
Web App开发 前端开发 JavaScript
如何在不牺牲动画效果的前提下,优化 CSS3 动画的性能?
如何在不牺牲动画效果的前提下,优化 CSS3 动画的性能?
20 1
|
1月前
|
前端开发 JavaScript API
探索 CSS Houdini:轻松构建酷炫的 3D 卡片翻转动画
本文通过构建一个 3D 翻卡动画深入探讨了 CSS Houdini 的强大功能,展示了如何通过 Worklets、自定义属性、Paint API 等扩展 CSS 的能力,实现高度灵活的动画效果。文章首先介绍了 Houdini 的核心概念与 API,并通过构建一个动态星空背景、圆形进度条以及交互式 3D 翻卡动画的实际示例,展示了如何利用 CSS Houdini 赋予网页设计更多创造力。最后,还演示了如何将这种 3D 翻卡效果集成到公司网站中,提升用户体验。CSS Houdini 的创新能力为网页设计带来了前所未有的灵活性,推动了前端开发迈向新的高度。
27 0
探索 CSS Houdini:轻松构建酷炫的 3D 卡片翻转动画
|
1月前
|
前端开发
【CSS】纯css3螺旋状loading加载特效
【CSS】纯css3螺旋状loading加载特效
29 4
|
2月前
|
JavaScript 前端开发
JS配合CSS3实现动画和拖动小星星小Demo
本文通过代码示例展示了如何使用JavaScript和CSS3实现动画效果和拖动小星星的交互效果,包括文字掉落动画和鼠标拖动产生小星星动画的实现方法。
46 0
JS配合CSS3实现动画和拖动小星星小Demo
|
1月前
|
前端开发
CSS 动画介绍及语法
CSS 动画介绍及语法
28 0
|
3月前
|
前端开发 UED 开发者
有趣的CSS - 文字加载动画效果
这个文本加载动画简单而有趣,可以在网站标题、广告标语或者关键信息的展示上吸引用户的注意力。开发者可以根据需要调整动画的持续时间、步骤数,或者光标颜色等,来适应特定的设计需求。使用这种动态元素,增强网站的互动性和用户体验,同时也为网站增添了一抹活泼的风格。
80 5
|
3月前
|
前端开发 JavaScript
HTML+CSS如何打造撒花动画效果?3分钟学会,炫酷到爆!
HTML+CSS如何打造撒花动画效果?3分钟学会,炫酷到爆!