教你用vue實(shí)現(xiàn)一個(gè)有趣的圍繞圓弧動(dòng)畫效果
前幾天在好朋友樓上小黑的介紹下,看到了某個(gè)平臺(tái)的官網(wǎng),里面有一個(gè)人物介紹的模塊,里面的動(dòng)畫感覺不錯(cuò),于是就自己動(dòng)手寫了一個(gè)。
1.0 原官網(wǎng)示例

當(dāng)然這里去掉了具體信息,原網(wǎng)站是里面圓圈中是人物的頭像,旁邊是介紹信息,每個(gè)人物就沿著圓弧移動(dòng)到指定位置
2.0 我們實(shí)現(xiàn)的結(jié)果

當(dāng)點(diǎn)擊中間開始時(shí),幾個(gè)小球一次轉(zhuǎn)動(dòng)到固定角度
3.0 簡(jiǎn)單分析下
要讓小圓在圓弧上動(dòng),我們只需要知道圓心在圓弧上的坐標(biāo)(x,y)就行了

所以當(dāng)我們知道外圓的半徑,小圓的半徑,以及角度再利用三角函數(shù)就可以計(jì)算出 小圓在圓弧上定位的位置 top right
4.0 代碼實(shí)現(xiàn)
這里是將 移動(dòng)的小圓封裝成一個(gè)組件 moveRound,只需要將 大圓半徑,小圓半徑,轉(zhuǎn)動(dòng)的角度,剩下的就可以按自己需要添加
<template>
<div>
<h3>圍繞圓弧移動(dòng)動(dòng)畫</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組件, 角度的動(dòng)態(tài)改變計(jì)算 top,right的值,其中 raf,caf是 requestAnimationFrame的兼容處理,不明白的可以看往期文章或者百度。
<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: { // 需要轉(zhuǎn)動(dòng)的角度
type: Number,
default: 0
},
bigR: { // 外層大圓半徑
type: Number,
default: 0
},
minR: { //移動(dòng)小圓半徑
type: Number,
default: 0
},
backgroundColor: {
type: String,
default: '#7fffd4'
}
},
data() {
return {
top: '',
right: '',
setAngle: 0
}
},
mounted() {
},
computed: {
/**
* sin 對(duì)應(yīng) y 的值,轉(zhuǎn)換為定位中距離頂部top等于 圓的半徑 - y - 小圓半徑(讓圓心在圓弧上)
* cos 對(duì)應(yīng) x 的值,轉(zhuǎn)換為定位中距離右邊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() {
// 調(diào)整 累加值,改變速度
this.setAngle += 1
timer = raf(this.toMove)
// 結(jié)束動(dòng)畫
if(this.setAngle > this.angle) {
caf(timer)
// 也可以根據(jù)需要重復(fù)執(zhí)行
// this.setAngle = 0
}
}
}
}
</script>
<style>
.round{
position: absolute;
will-change: top,right;
border-radius: 50%;
}
</style>5.0 總結(jié)
主要的點(diǎn)就是根據(jù)角度計(jì)算位置,只要思路正確,應(yīng)該可以少走彎路。
到此這篇關(guān)于用vue實(shí)現(xiàn)一個(gè)有趣的圍繞圓弧動(dòng)畫效果的文章就介紹到這了,更多相關(guān)vue實(shí)現(xiàn)圓弧動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)一個(gè)6個(gè)輸入框的驗(yàn)證碼輸入組件功能的實(shí)例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)一個(gè)6個(gè)輸入框的驗(yàn)證碼輸入組件功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
vue 解決form表單提交但不跳轉(zhuǎn)頁(yè)面的問題
今天小編就為大家分享一篇vue 解決form表單提交但不跳轉(zhuǎn)頁(yè)面的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-10-10
Vue使用MD5對(duì)前后端進(jìn)行加密的實(shí)現(xiàn)
前后端分離的項(xiàng)目,遇到了對(duì)密碼進(jìn)行加密的情況,在前端或者是在后端加密都是可以的,本文主要介紹了Vue使用MD5對(duì)前后端進(jìn)行加密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
VUE 解決mode為history頁(yè)面為空白的問題
今天小編就為大家分享一篇VUE 解決mode為history頁(yè)面為空白的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-11-11
搭建vue3項(xiàng)目以及按需引入element-ui框架組件全過程
element是基于vue.js框架開發(fā)的快速搭建前端的UI框架,下面這篇文章主要給大家介紹了關(guān)于搭建vue3項(xiàng)目以及按需引入element-ui框架組件的相關(guān)資料,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
vue3+ts+axios+pinia實(shí)現(xiàn)無(wú)感刷新方式
這篇文章主要介紹了vue3+ts+axios+pinia實(shí)現(xiàn)無(wú)感刷新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

