css作個波浪懸浮球?

最近公司項目有個需求是在網頁上操做虛擬機,emmm...操做就操做吧,誰讓是領導提的,咱也不知道,咱也不敢問啊....咋辦?搞吧,爬了n多個坑才終於把虛擬機功能給引入到項目中,看着熟悉的Linux操做窗口,都別攔我,讓我裝一會*css

領導看了十分滿意,而後說...我看電腦上都有那個懸浮球,咱們這也得有吧vue

???啥玩意???去他電腦上看了一下才發現是安全軟件的那個展現電腦使用狀況的懸浮球,WTF!!你見過哪一個Linux有這懸浮球的?你咋不讓我再給你整一隻瑞星小獅子在旁邊給你跳舞呢??算了仍是別說了,說了真讓我作怎麼搞....canvas

需求

需求提及來很簡單--》小球、懸浮在頁面最上層、內部有波浪能動、波浪高度跟虛擬機使用狀況有關、鼠標放上去展現詳細信息,大概就是醬嬸的安全

開搞

環境

項目使用的是vue框架,因此demo都是在vue環境下,不過代碼其實沒什麼環境需求的。框架

設計思路

看到這個需求的第一想法就是用canvas畫一個懸浮球,這個倒也不難,網上挺多案例的,後面想能不能用css動畫試試?性能還能更好一下,畢竟在有虛擬機的頁面已是有點卡了,任何性能的提高都是有必要的。ide

主要實現原理就是使用一個不停運動的a遮在b塊上面,而後讓a的顏色與背景顏色相同,從而形成b的邊緣在不停波動的效果。性能

1.畫個大圓套小圓
<div class="container">
    <div class="wave"></div>
</div>

<style>
    .container {
        width: 100px;
        height: 100px;
        border-radius: 50%;
        border: 3px solid #67c23a;
        background: #ffffff;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        padding: 5px;
    }
    .wave {
        position: relative;
        width: 100px;
        height: 100px;
        background-image: linear-gradient(-180deg, #aaff80 13%, #67c23a 91%);
        border-radius: 50%;
    }
</style>
複製代碼

而後咱們獲得了這個動畫

2.畫遮蓋層並讓它扭起來
<div class="container">
    <div class="wave"></div>
    <div class="wave-mask"></div>
</div>
<style>
.wave-mask {
    position: absolute;
    width: 200px;
    height: 200px;
    top: 0;
    left: 50%;
    border-radius: 40%;
    background-color: rgba(212, 24, 24, 0.9);
    transform: translate(-50%, -70%) rotate(0);
    animation: toRotate 10s linear -5s infinite;
    z-index: 20;
}
@keyframes toRotate {
  50% {
    transform: translate(-50%, -70%) rotate(180deg);
  }
  100% {
    transform: translate(-50%, -70%) rotate(360deg);
  }
}
</style>
複製代碼

而後就變成了這樣(爲了看的效果更好,原諒我使用的大紅色) spa

3.裁剪
.container {
  overflow: hidden;
}
.wave-mask {
  background-color: rgba(255, 255, 255, 0.9);
}
複製代碼

成品就醬嬸的了 設計

4.完善

波浪的高度徹底是受wave-mask的top屬性影響的,因此要動態變動懸浮球狀態只須要計算而後相應的改變top的值就能夠了,而後稍微完善一下代碼

<template>
  <div class="home">
    <div class="container" :class="{ warning: parseInt(usingRate) > 60, danger: parseInt(usingRate) > 80 }">
      <div class="wave"></div>
      <div class="wave-mask" :style="`top: ${40 - parseInt(usingRate)}px`"></div>
    </div>
    <div class="using-slider">
      <span>使用率:{{usingRate}} %</span>
      <el-slider v-model="usingRate"></el-slider>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      usingRate: 0
    }
  }
}
</script>

<style lang="scss" scoped>
.container {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 3px solid #67c23a;
  background: #ffffff;
  overflow: hidden;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  padding: 5px;
  .wave {
    position: relative;
    width: 100px;
    height: 100px;
    background-image: linear-gradient(-180deg, #aaff80 13%, #67c23a 91%);
    border-radius: 50%;
  }
  .wave-mask {
    position: absolute;
    width: 200px;
    height: 200px;
    top: 0;
    left: 50%;
    border-radius: 40%;
    background-color: rgba(255, 255, 255, 0.9);
    transform: translate(-50%, -70%) rotate(0);
    animation: toRotate 10s linear -5s infinite;
    z-index: 20;
  }
  &.warning {
    border: 3px solid #e6a23c;
    .wave {
      background-image: linear-gradient(-180deg, #f0c78a 13%, #e6a23c 91%);
    }
    &.danger {
      border: 3px solid #f56c6c;
      .wave {
        background-image: linear-gradient(-180deg, #f78989 13%, #f56c6c 91%);
      }
    }
  }
}
.using-slider {
  width: 400px;
  margin: 0 auto;
}

@keyframes toRotate {
  50% {
    transform: translate(-50%, -70%) rotate(180deg);
  }
  100% {
    transform: translate(-50%, -70%) rotate(360deg);
  }
}
</style>
複製代碼

看效果

大概就醬嬸了,第一次寫文,文筆很差多多見諒,別說我爛尾了,由於...我要下班了

相關文章
相關標籤/搜索