教你用vue实现一个有趣的围绕圆弧动画效果

 更新时间:2022年04月24日 11:17:01   作者:海龟先生plus  
最近做的两个项目都是关于vue的,做完整理一下,这篇文章主要给大家介绍了关于如何用vue实现一个有趣的围绕圆弧动画效果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前几天在好朋友楼上小黑的介绍下,看到了某个平台的官网,里面有一个人物介绍的模块,里面的动画感觉不错,于是就自己动手写了一个。

1.0 原官网示例

当然这里去掉了具体信息,原网站是里面圆圈中是人物的头像,旁边是介绍信息,每个人物就沿着圆弧移动到指定位置

2.0 我们实现的结果

当点击中间开始时,几个小球一次转动到固定角度

3.0 简单分析下

要让小圆在圆弧上动,我们只需要知道圆心在圆弧上的坐标(x,y)就行了

所以当我们知道外圆的半径,小圆的半径,以及角度再利用三角函数就可以计算出 小圆在圆弧上定位的位置 top right

4.0 代码实现

这里是将 移动的小圆封装成一个组件 moveRound,只需要将 大圆半径小圆半径转动的角度,剩下的就可以按自己需要添加

<template>
  <div>
      <h3>围绕圆弧移动动画</h3>
      <div class="arc_bo" >
         <move-round :minR="25" :bigR="150" :angle="30" ref="mRound1" >	     </move-round>
          <span class="start" @click="toMove" >开始</span>
      </div>
  </div>
</template>

<script>
    import moveRound from './components/moveRound.vue'
    export default {
        name: 'arcMoveAni',
        components: {
            moveRound
        },
        methods: {
            toMove() {
                this.$refs.mRound1.toMove()
            }
        }
    }
</script>

<style scoped>
    .arc_bo{
        margin: 0 auto;
        width: 6rem;
        height: 6rem;
        border-radius: 50%;
        border: 1px solid #ccc;
        position: relative;
        margin-top: 2rem;
    }
    .start{
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%,-50%);
        color: #f40;
        width: 1rem;
        height: 1rem;
        border-radius: 50%;
        border: 1px solid #ccc;
        text-align: center;
        line-height: 1rem;
    }
</style>

moveRound组件, 角度的动态改变计算 top,right的值,其中 raf,cafrequestAnimationFrame的兼容处理,不明白的可以看往期文章或者百度。

<template>
  <div>
      <div class="round" :style="setPosition" ></div>
  </div>
</template>

<script>
    let timer = 0
    import { raf,caf } from '../../utils/raf'
    export default {
        name: 'moveRound',
        props: {
            angle: { // 需要转动的角度
                type: Number,
                default: 0
            },
            bigR: { // 外层大圆半径
                type: Number,
                default: 0
            },
            minR: { //移动小圆半径
                type: Number,
                default: 0
            },
            backgroundColor: {
                type: String,
                default: '#7fffd4'
            }
        },
        data() {
            return {
                top: '',
                right: '',
                setAngle: 0
            }
        },
        mounted() {

        },
        computed: {
            /**
             * sin 对应 y 的值,转换为定位中距离顶部top等于 圆的半径 - y - 小圆半径(让圆心在圆弧上)
             * cos 对应 x 的值,转换为定位中距离右边right等于 圆的半径 - x - 小圆半径
             * **/ 
            setPosition( { top, right ,setAngle, bigR, minR, backgroundColor} ) {
                let size = minR*2 + 'px'

                let x = bigR * ( 1 - Math.cos(setAngle * Math.PI/180)) - minR
                let y = bigR * ( 1 - Math.sin(setAngle * Math.PI/180))  - minR

                right = x + 'px'
                top = y + 'px'
                return {
                    top,
                    right,
                    width: size,
                    height: size,
                    backgroundColor
                }
            }
        },
        methods: {
            toMove() {
            	// 调整 累加值,改变速度
                this.setAngle += 1
                timer = raf(this.toMove)
                // 结束动画
                if(this.setAngle > this.angle) {
                    caf(timer)
                    // 也可以根据需要重复执行
                    // this.setAngle = 0
                }
            }
        }
    }
</script>

<style>
 .round{
    position: absolute;
    will-change: top,right;
    border-radius: 50%;
 }
</style>

5.0 总结

主要的点就是根据角度计算位置,只要思路正确,应该可以少走弯路。

到此这篇关于用vue实现一个有趣的围绕圆弧动画效果的文章就介绍到这了,更多相关vue实现圆弧动画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Vue页面固定滚动位置的处理办法

    解决Vue页面固定滚动位置的处理办法

    本篇文章主要介绍了解决Vue固定滚动位置的处理办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 基于Vue el-autocomplete 实现类似百度搜索框功能

    基于Vue el-autocomplete 实现类似百度搜索框功能

    本文通过代码给大家介绍了Vue el-autocomplete 实现类似百度搜索框功能,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Vue 理解之白话 getter/setter详解

    Vue 理解之白话 getter/setter详解

    这篇文章主要介绍了Vue getter setter,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue2老项目中node-sass更换dart-sass的操作方法

    vue2老项目中node-sass更换dart-sass的操作方法

    这篇文章主要介绍了vue2老项目中node-sass更换dart-sass的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-07-07
  • VUE实现可随意拖动的弹窗组件

    VUE实现可随意拖动的弹窗组件

    今天小编就为大家分享一篇VUE实现可随意拖动的弹窗组件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 对vue2.0中.vue文件页面跳转之.$router.push的用法详解

    对vue2.0中.vue文件页面跳转之.$router.push的用法详解

    今天小编就为大家分享一篇对vue2.0中.vue文件页面跳转之.$router.push的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 带你了解前端的几种包管理器(npm/pnpm等)

    带你了解前端的几种包管理器(npm/pnpm等)

    随着前端工程化的应用越来越广,插件和包的管理也逐渐衍生出很多的管理器,常见的几种包管理器如:npm、cnpm、yarn、pnpm,那你知道这些管理器之间有哪些区别吗?我们一起来逐个认识下它们
    2023-04-04
  • vue关于重置表单数据出现undefined的解决

    vue关于重置表单数据出现undefined的解决

    这篇文章主要介绍了vue关于重置表单数据出现undefined的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 小白教程|一小时上手最流行的前端框架vue(推荐)

    小白教程|一小时上手最流行的前端框架vue(推荐)

    这篇文章主要介绍了前端框架vue,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue ant design 封装弹窗表单的使用

    vue ant design 封装弹窗表单的使用

    这篇文章主要介绍了vue ant design 封装弹窗表单的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06

最新评论