vue2写法,vue3也能用,粘之即走:
示例:
<template>
<div class="voice-hidden">
<div
class="voice-play-chat"
:class="[className, { 'animate-stop': !isPlaying }]"
>
<div class="center-box">
<div class="box-1 box" :style="{'border-color':borderColor}"></div>
<div class="box-2 box" :style="{'border-color':borderColor}"></div>
<div class="box-3 box" :style="{'border-color':borderColor}"></div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
className: {}, // 可传值 voice-play-custom(对话中发送本人查看样式),不传即为查看对方发送语音样式
isPlaying: {}, // 音频是否正在播放(true: 显示动效; false: 关闭动效)
borderColor: {
type: String,
default: "rgba(0, 0, 0, 0.8)",
}, // 音频颜色
},
};
</script>
<style lang="scss" scoped>
@keyframes top {
0% {
opacity: 0;
}
30% {
opacity: 1;
}
}
@keyframes middle {
0% {
opacity: 0;
}
15% {
opacity: 1;
}
}
.voice-hidden {
position: relative;
width: 18px;
height: 18px;
}
.voice-play-chat {
position: relative;
width: 18px;
height: 18px;
margin-left: 16px;
overflow: hidden;
transform: rotate(-45deg);
.center-box {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.box {
position: absolute;
left: 0;
top: 0;
transform: translate(-50%, -50%);
border-radius: 50%;
border: 4px solid rgba(0, 0, 0, 0.8);
}
.box-1 {
border-width: 4px;
}
.box-2 {
width: 20px;
height: 20px;
animation: middle 0.5s steps(1) alternate infinite;
}
.box-3 {
width: 36px;
height: 36px;
animation: top 0.5s steps(1) alternate infinite;
}
}
.voice-play-custom {
position: absolute;
top: 0;
right: 10px;
transform: rotate(-225deg);
}
.animate-stop {
.box {
animation: none;
}
}
</style>