使用css结合vue3css变量绘制仪表盘指针动画效果

自适应仪表盘指针动画实现与动态更新
本文档详细介绍了如何使用CSS和Vue3实现一个自适应宽高的仪表盘,保持指针的宽高比和旋转动画效果。通过伪元素绘制仪表盘背景和指针,利用vw单位调整大小和位置。同时,通过动态计算指针角度并应用过渡动画,实现了指针角度的平滑变化。在每次更改指针角度后,通过`makeAnimate`方法添加和移除动画效果,确保动画的连贯性。

1.功能描述

  • 仪表盘与指针自适应宽度,保持宽高比,保持指针位置
  • 保留指针旋转动画效果
  • 根据返回结果计算指针角度

2 效果展示

指针仪表盘

3 实现

3.1 实现仪表盘
  • 使用padding撑开高度,保持宽高比
  • 使用before伪元素绘制仪表盘,锥形渐变实现颜色由浅到深
  • 使用after伪元素覆盖中心位置
  • 指针我使用的字体图标,使用 vw 单位设置大小和位置
<div class="conic-wrap">
  <div class="conic">
     <span class="pointer icon icon-Pointer"></span>
   </div>
 </div>
 <div>
   <el-button @click="testSpeed">Run Speed Test</el-button>
 </div>
/* 添加边距,可忽略 */
.conic-wrap {
  padding: 0 12%;
}
/* 撑开高度 */
.conic {
  padding-bottom: 100%;
  position: relative;
  overflow: hidden;
}
/* 绘制仪表盘 */
.conic::before {
  content:"";
  position: absolute;
  display: block;
  top: 0;
  left: 0;
  right:0;
  bottom:0;
  border-radius: 50%;
  transform: rotate(-180deg);
  background: 
        conic-gradient(
          #fff 70deg,
          #e7edf6 70deg,
          #215db6 290deg,
          #fff 290deg,
          #fff 360deg
        );

}
/* 掏空中间 */
.conic::after {
  content:"";
  position: absolute;
  display: block;
  width: 60%;
  height: 60%;
  border-radius: 50%;
  background-color: #fff;
  top: 50%;
  left:50%;
  transform: translate(-50%,-50%);
}
/* 指针样式 */
.conic span.pointer {
  position: absolute;
  color: #215db6;
  transform-origin: center 70%;
  z-index: 1;
  left: calc(50% - 2.6vw);
  top: calc(50% - 3.2vw);
  z-index: 1;
  font-size: 5.4vw;
  cursor: auto;
  transform:rotate(v-bind(pointerDeg));/* vue3新增,在css中使用变量 */
  transition: all .5s cubic-bezier(.14,1.24,.96,.77);
}
/* 动画效果 */
.in-animation{
  animation: pointerMove 1.5s ease-in-out;
}
/* -102 到 +102 */
@keyframes pointerMove {
  from{
    transform:rotate(-102deg);
  }
  10% {
    transform:rotate(-104deg);
  }
  to {
    transform:rotate(v-bind(pointerDeg));
  }
}
3.2 保持动画效果
  • 每次更改指针角度后,调用 makeAnimate 方法,为指针重新添加动画效果,当执行结束后再移除
  makeAnimate() {
  // 监听指针是否结束动画,当结束动画后将动画效果移除
   document.querySelector('span.pointer').addEventListener('animationend', function () {
      this.classList.remove('in-animation')
    })
    // 添加动画效果
    document.querySelector('span.pointer').classList.add('in-animation')
  },
3.3 动态更改指针角度
  • vue3 支持在 css 中使用 data 属性
  • 示例 v-bind(data属性名称)
/* 直接在style标签中使用即可 */
.conic span.pointer {
  transform:rotate(v-bind(pointerDeg));
}

C++中的伪指针域(Fake Pointer)是指一个类中的成员变量,它的类型是一个自定义的结构体,结构体中包含了一个指向当前类对象的指针。通过这种方式,可以在一个类中实现类似于指针的功能,而不需要使用实际的指针类型,从而避免了指针可能带来的安全问题和内存管理问题。 伪指针域通常用于实现一些数据结构,如链表、树等。在这些数据结构中,每个节点都需要保存一个指向其父节点或子节点的指针,而使用指针域可以简化指针的管理,并且可以避免一些指针操作的错误。 下面是一个使用指针域实现二叉树节点的代码示例: ```c++ class TreeNode { public: int val; TreeNode* left; TreeNode* right; struct FakePointer { TreeNode* ptr; FakePointer(TreeNode* p = nullptr) : ptr(p) {} operator TreeNode*() const { return ptr; } TreeNode* operator->() const { return ptr; } } parent; TreeNode(int val = 0, TreeNode* left = nullptr, TreeNode* right = nullptr) : val(val), left(left), right(right), parent(nullptr) {} }; ``` 在该实现中,`TreeNode`类中包含了一个名为`parent`的伪指针域,它的类型为一个自定义的结构体`FakePointer`,结构体中包含了一个指向当前节点父节点的指针`ptr`。在`FakePointer`结构体中,重载了类型转换操作符和箭头操作符,使得可以在访问`parent`成员变量时,像访问指针一样的方式进行操作。 使用指针域可以使得代码更加简洁、安全、易于维护,但是也可能会带来一些性能损失,因为每个节点都需要额外的空间来保存一个指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值