效果如下

View部分
<div id="app"> <div class="heart-loading"> <div class="ul" style= "--line-count: 9"> <div class="li" v-for="v in 9" :key="v" :class="`line-${v}`" :style="`--line-index: ${v}`"></div> </div> </div></div>
JS部分
var app = new Vue({ el: '#app', data() { return { } }, methods: { }});
css 部分
.heart-loading { width: 200px; height: 200px; background-color: #369; display: flex; justify-content: center; align-items: center;}.ul { display: flex; justify-content: space-between; width: 150px; height: 10px;}.li { --v: calc(var(--line-index) / var(--line-count) * .5turn); --time: calc((var(--line-index) - 1) * 40ms); border-radius: 5px; width: 10px; height: 10px; background-color: #3c9; filter: hue-rotate(var(--v)); animation-duration: 1s; animation-delay: var(--time); animation-iteration-count: infinite;}.line-1, .line-9 { animation-name: line-move-1;}.line-2, .line-8 { animation-name: line-move-2;}.line-3, .line-7 { animation-name: line-move-3;}.line-4, .line-6 { animation-name: line-move-4;}.line-5 { animation-name: line-move-5;}@keyframes line-move-1 { 0%, 10%, 90%, 100% { height: 10px; } 45%, 55% { height: 30px; transform: translate3d(0, -15px, 0); }}@keyframes line-move-2 { 0%, 10%, 90%, 100% { height: 10px; } 45%, 55% { height: 60px; transform: translate3d(0, -30px, 0); }}@keyframes line-move-3 { 0%, 10%, 90%, 100% { height: 10px; } 45%, 55% { height: 80px; transform: translate3d(0, -40px, 0); }}@keyframes line-move-4 { 0%, 10%, 90%, 100% { height: 10px; } 45%, 55% { height: 90px; transform: translate3d(0, -30px, 0); }}@keyframes line-move-5 { 0%, 10%, 90%, 100% { height: 10px; } 45%, 55% { height: 90px; transform: translate3d(0, -20px, 0); }}