css实现圈+箭头,箭头贴着圆的切线

文章讲述了作者如何在Vue项目中创建可灵活调整角度的组件,通过CSS实现箭头跟随圆心旋转,并处理了transform-origin的限制,最终通过定位和动画达到需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
公司需要实现类似的一个页面,我就想着把每一个球都封装成一个组件
问题来了,实现一个静态的组件比较容易,但为了让组件更灵活,我希望能给组件传一个角度,箭头就会根据相应的角度显示
在这里插入图片描述
一开始我的思路是这样,让箭头贴着圆外线,将旋转中心设置到圆心上,但无论如何,transform-origin似乎只能设置在红色方块内,于是换了思路
在这里插入图片描述
我直接将红色的方块网上定位,旋转点就可以设置在圆心上,在红色方块外部在包一层div将红色部分往下移。需求基本实现

<template>
  <div class="ball">
    <div class="title">沼液</div>
    <div class="circle flex justify-cen align-cen">
      <div class="scale">环比:<span>10%</span></div>
      <div class="num">50000ml</div>
    </div>
    <div class="indicate" :style="`transform: rotate(${rotateNnum}deg);`">
      <div class="line">
        <div class="arrow"></div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from "vue";

const props = defineProps({
  rotateNnum : {
    type: Number,
    default: 0,
  }
})
const overallData = ref([]);
onMounted(() => {});
</script>

<style scoped lang="less">
@keyframes pan {
  0% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(2rem);
  }
  to {
    transform: translateY(0rem);
  }
}
.ball {
  width: 5rem;
  height: 6rem;
  position: relative;
  > .title {
    line-height: 1rem;
    text-align: center;
    color: #7fc6ec;
    font-size: 0.75rem;
  }
  > .circle {
    height: 5rem;
    width: 5rem;
    border-radius: 50%;
    border: 2px solid #0febec;
    flex-direction: column;
    .scale {
      color: #218abe;
      font-size: 0.7rem;
      > span {
        color: red;
      }
    }
    .num {
      font-size: 0.8rem;
      color: #fff;
      margin-top: 0.4rem;
    }
  }
  > .indicate {
    position: absolute;
    width: 1rem;
    height: 10rem;
    bottom: -7.5rem;
    left: calc(50% - 0.5rem);
    transform-origin: 50% top;
    transform: rotate(0deg);
    .line {
      position: absolute;
      width: 100%;
      height: 10rem;
      background-color: red;
      top: 2.5rem;
      .arrow {
        width: 1rem;
        height: 2rem;
        position: absolute;
        top: 2rem;
        background-color: green;
        animation: pan 1s infinite ease;
      }
    }
  }
}
</style>

我说的可能不是很清楚,可以直接将代码拿去看,有问题可以私信交流

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coder__Song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值