前端css/less绕椭圆轨道旋转动画 带遮挡效果 3D

在这里插入图片描述

效果如图,多个物体在轨道上绕中心物体旋转,当旋转到物体后面时将被遮挡。主要使用css实现,为了简化代码,引入less进行处理。

html结构

// 中心物体
<div class="center">center</div>
// 轨道
<div class="orbit">
	// 轨道上的物体
	<div class="item item1">1</div>
	<div class="item item2">2</div>
	<div class="item item3">3</div>
	<div class="item item4">4</div>
  <div class="item item5">5</div>
  <div class="item item6">6</div>
</div> 

less代码

本质上是使用动画控制轨道带动内部的物体进行旋转,计算出每个物体在椭圆轨道上的位置,使用绝对定位放置物体。由于轨道上物体有多个,代码做了椭圆位置等分计算处理,使用less根据轨道大小和物体个数动态计算各个物体的位置,要添加或减少物体个数只需要在html上添加相应类名的物体并修改less代码中的@num变量即可。
遮挡效果是通过z-index制造视觉差来实现的。

// 轨道旋转动画b
@keyframes spin {
  0% {
    transform: scaleY(0.5) rotate(0deg);
  }
  100% {
    transform: scaleY(0.5) rotate(360deg);
  }
}
@keyframes anti-spin {
  0% {
    transform: rotate(0deg) scaleY(2) scale(1);
  }
  100% {
    transform: rotate(-360deg) scaleY(2) scale(1);
  }
}
// 轨道宽高
@w1: 200px;
@h1: 200px;
@r: @w1 / 2;
// 元素宽高
@w2: 20px;
@h2: 20px;
// 动画时间
@time: 30s;
// 元素个数
@num: 6;
.locateItem(@n, @i: 1) when (@i =< @n) {
  .item@{i} {
    @m: pi() / 180 * round(360 / @n) * @i;
    left: @r + @r * sin(@m) - @w2 / 2;
    bottom: @r + @r * cos(@m) - @h2 / 2;
  }
  .locateItem(@n, (@i + 1));
}
// 旋转中心
.center {
  z-index: 999;
  position: absolute;
  top: 40px;
  left: 120px;
  width: 80px;
  height: 80px;
  background: yellow;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
}
// 轨道及元素
.orbit {
  z-index: 900;
  position: absolute;
  top: 10px;
  left: 50px;
  width: @w1;
  height: @h1;
  border-radius: 50%;
  border: 2px solid black;
  z-index: 900;
  animation: spin @time infinite linear;
  .item {
    display: flex;
    justify-content: center;
    align-items: center;
    background: red;
    border-radius: 50%;
    width: @w2;
    height: @h2;
    animation: anti-spin @time infinite linear;
    color: #fff;
    position: absolute;
    text-align: center;
  }
  //   对每个元素进行定位
  .locateItem(@num);
}
// 鼠标悬停 动画暂停
.orbit:hover,
.orbit:hover .item,
.orbit .item:hover {
  animation-play-state: paused;
}

可将代码复制到codepen中进行预览:
https://codepen.io/pen/

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现一个 CSS3 3D 椭圆旋转菜单,可以按照以下步骤进行: 1. 创建菜单的 HTML 结构,可以使用 ul 和 li 标签来实现,每个 li 标签内包含一个链接或者按钮等。 2. 使用 CSS3 的 transform 属性实现 3D 效果。我们可以使用 rotateX 和 rotateY 属性来实现 X 轴和 Y 轴的旋转效果,使用 translateZ 属性来实现 Z 轴的平移效果。 3. 使用 CSS3 的 transition 属性来实现菜单的过渡效果,例如鼠标悬停时菜单的旋转效果。 下面是一个简单的例子: HTML 代码: ```html <ul class="menu"> <li><a href="#">菜单项1</a></li> <li><a href="#">菜单项2</a></li> <li><a href="#">菜单项3</a></li> <li><a href="#">菜单项4</a></li> <li><a href="#">菜单项5</a></li> </ul> ``` CSS 代码: ```css .menu { position: relative; width: 400px; height: 200px; margin: 100px auto; transform-style: preserve-3d; } .menu li { position: absolute; width: 100px; height: 50px; background-color: #ccc; border-radius: 50%; text-align: center; line-height: 50px; font-size: 16px; color: #fff; transform-origin: 50% 50%; transition: transform 0.5s ease-in-out; } .menu li:nth-child(1) { transform: rotateY(0deg) translateZ(200px); } .menu li:nth-child(2) { transform: rotateY(72deg) translateZ(200px); } .menu li:nth-child(3) { transform: rotateY(144deg) translateZ(200px); } .menu li:nth-child(4) { transform: rotateY(216deg) translateZ(200px); } .menu li:nth-child(5) { transform: rotateY(288deg) translateZ(200px); } .menu li:hover { transform: rotateX(90deg) translateZ(50px); } ``` 在这个例子中,我们使用了一个 ul 标签来创建菜单,并且设置了它的宽度、高度和位置。每个 li 标签表示一个菜单项,我们设置了它的宽度、高度、背景颜色、圆角和对齐方式等。我们使用了 transform-origin 属性来设置旋转的基准点,使用 translateZ 属性来设置菜单项在 Z 轴上的位置。 在菜单项的样式中,我们使用了 transform 属性来实现旋转和平移的效果。我们使用了 transition 属性来实现菜单项的过渡效果。在鼠标悬停时,我们通过设置 transform 属性来实现菜单项的旋转效果。 最后,我们可以通过调整 transform 属性的值来实现不同的旋转效果和菜单项的位置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值