css3的animation制作围绕椭圆轨道旋转,近大远小的动画

css3的animation制作围绕椭圆轨道旋转,近大远小的动画

在这里插入图片描述

布局

<div className={`${style["animate-icon"]} `}  >
       {/* <!-- 外侧圆环div --> */}
      <div className={`${style.flat} ${style['circle-outer']}`}>
         <div className={style.content}></div>
      </div>
     {/* <!-- 内侧圆环div --> */}
       <div className={`${style['flat']} ${style['circle-inner']}`}>
          <div className={style.content}></div>
        </div>
        <div className={`${style['work']}`}>
           <div className={style.content}>{titles}</div>
         </div>
        <div className={chooseStyle}>
           {
            arr && arr.map((v, i) => {
              return <div key={i} className={`${style[`circle-ball${i + 1}`]} ${style[extralClass]}`}>
              <div className={style.rotateText} onClick={() => this.openSecondPage(v.name)}>
               <p>{arr[i].name}</p>
               <p>{arr[i].value}</p>
             </div>
            </div>
         })
     }
  </div>

中间旋转的两个轨道

.animate-icon {
  display: flex;
  justify-content: center;
  align-items: center; 
}

/* 压缩div高度,将正圆变为椭圆 */
.flat {
  transform: scaleY(0.45);
}

.work {
  position: absolute; 
  color: #f4fefc;
  font-size: 22px;
}

.circle-outer {
  position: relative; 
  bottom: 0;
}

.circle-outer .content {
  width: 200px;
  height: 200px;
  border-radius: 100px;
  /* 圆锥渐变 */
  // background: conic-gradient(fuchsia, pink, orange, gold, snow);
  background: conic-gradient(#89b8e4, #23d7e2, #5aa3e7, #00f9f6, #0edee7);
  /* 将圆中心“掏空”变成圆环 */
  --mask: radial-gradient(closest-side, transparent 90%, black 90%);
  -webkit-mask-image: var(--mask);
  mask-image: var(--mask);
  animation: spin 4s linear infinite;
}

.circle-inner {
  position: absolute; 
}

.circle-inner .content {
  width: 150px;
  height: 150px;
  border-radius: 75px;
  background: conic-gradient(#e1e1ea 40%, #d5e0e0 72%, #7f8888 88%, #9d9db6);
  // background: conic-gradient(blue 40%, teal 72%, cyan 88%, blue);
  --mask: radial-gradient(closest-side, transparent 94%, black 94%);
  -webkit-mask-image: var(--mask);
  mask-image: var(--mask);
  animation: spin-r 4s linear infinite;
}

.circleInfo {
  position: absolute;
 

}

四个方形旋转

.circle-ball1 {
    .circleInfo();
    animation:
      animX 6s cubic-bezier(0.7, 0, 0.3, 1) -3s infinite alternate,
      animY 6s cubic-bezier(0.36, 0, 0.64, 1) 0s infinite alternate,
      spin-ball 12s cubic-bezier(0.36, 0, 0.64, 1) 0s infinite alternate;

  }

  .circle-ball2 {
    .circleInfo();
    animation:
      animX 6s cubic-bezier(0.7, 0, 0.3, 1) -6s infinite alternate,
      animY 6s cubic-bezier(0.36, 0, 0.64, 1) -3s infinite alternate,
      spin-ball 12s cubic-bezier(0.36, 0, 0.64, 1) -3s infinite alternate;
  }

  .circle-ball3 {
    .circleInfo();
    animation:
      animX 6s cubic-bezier(0.7, 0, 0.3, 1) -9s infinite alternate,
      animY 6s cubic-bezier(0.36, 0, 0.64, 1) -6s infinite alternate,
      spin-ball 12s cubic-bezier(0.36, 0, 0.64, 1) -6s infinite alternate;
  }

  .circle-ball4 {
    .circleInfo();
    animation:
      animX 6s cubic-bezier(0.7, 0, 0.3, 1) -12s infinite alternate,
      animY 6s cubic-bezier(0.36, 0, 0.64, 1) -9s infinite alternate,
      spin-ball 12s cubic-bezier(0.36, 0, 0.64, 1) -9s infinite alternate;
  }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现雨粒子近大远小的效果,可以使用three.js中的粒子系统和相机远近裁剪平面的概念。具体步骤如下: 1. 创建雨粒子系统,并设置粒子的初始位置和速度。 2. 创建一个透视相机,并设置它的远近裁剪平面(near和far属性),以控制场景中物体的远近关系。 3. 在每一帧的渲染循环中,计算每个粒子距离相机的距离,并根据距离的大小调整粒子的大小或者透明度,实现近大远小的效果。 下面是一个实现雨粒子近大远小效果的示例代码: ```javascript // 创建雨粒子系统 var particleCount = 1000; var particles = new THREE.Geometry(); for (var i = 0; i < particleCount; i++) { var x = Math.random() * 200 - 100; var y = Math.random() * 200 - 100; var z = Math.random() * 200 - 100; var particle = new THREE.Vector3(x, y, z); particles.vertices.push(particle); } var particleMaterial = new THREE.PointsMaterial({ color: 0xFFFFFF, size: 1.5, transparent: true, blending: THREE.AdditiveBlending }); var particleSystem = new THREE.Points(particles, particleMaterial); scene.add(particleSystem); // 创建透视相机,并设置远近裁剪平面 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1000); camera.position.z = 400; // 渲染循环中,计算每个粒子距离相机的距离,并根据距离的大小调整粒子的大小或者透明度 function render() { requestAnimationFrame(render); for (var i = 0; i < particleCount; i++) { var particle = particles.vertices[i]; var distance = camera.position.distanceTo(particle); particleMaterial.size = distance / 100; particleMaterial.opacity = 1 - distance / 500; } particleSystem.geometry.verticesNeedUpdate = true; renderer.render(scene, camera); } render(); ``` 在上述示例代码中,我们创建了一个包含1000个粒子的雨粒子系统,并使用透视相机来控制粒子的远近关系。在渲染循环中,我们计算每个粒子距离相机的距离,并根据距离的大小调整粒子的大小或者透明度,实现近大远小的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值