- var text = "water"

#js-vue(@mouseover="water" @mouseout="water")
  svg.svg(xmlns="http://www.w3.org/2000/svg")
    filter#filter_1
      feTurbulence#js-fe_turbulence_1(type="turbulence" baseFrequency="0.01" numOctaves="1" seed="1")
      feDisplacementMap#js-fe_displacement_map_1(in="SourceGraphic" in2="turbulence" scale="0" xChannelSelector="R" yChannelSelector="B")
    filter#filter_2
      feTurbulence#js-fe_turbulence_2(type="turbulence" baseFrequency="0.01" numOctaves="1" seed="1")
      feDisplacementMap#js-fe_displacement_map_2(in="SourceGraphic" in2="turbulence" scale="0" xChannelSelector="R" yChannelSelector="B")
    filter#filter_3
      feTurbulence#js-fe_turbulence_3(type="turbulence" baseFrequency="0.01" numOctaves="1" seed="1")
      feDisplacementMap#js-fe_displacement_map_3(in="SourceGraphic" in2="turbulence" scale="0" xChannelSelector="R" yChannelSelector="B")
  .water.water_1= text
  .water.water_2= text
  .water.water_3= text
View Compiled
body {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);
  color: rgba(100, 200, 255, 0.7);
  font-family: 'Dosis', sans-serif;
  font-size: 8rem;
}

.svg {
  display: none;
}

.water {
  position: absolute;
  transform: translate(-50%, -50%);
  background: linear-gradient(180deg, #ffffff, #ffffff, #0000ff);
  background-clip: text;
  text-fill-color: transparent;
  opacity: 0.8;
  cursor: pointer;
  
  &_1 {
    filter: url(#filter_1);
  }
  
  &_2 {
    filter: url(#filter_2);
  }
  
  &_3 {
    filter: url(#filter_3);
    opacity: 0.3;
  }
}
View Compiled
new Vue({
  el: '#js-vue',

  data () {
    return {
      duration: 5000
    }
  },

  computed: {
  },

  mounted () {
    this.water()
    this.duration = 2000
  },

  methods: {
    water () {
      anime({
        targets: ['#js-fe_turbulence_1', '#js-fe_displacement_map_1'],
        baseFrequency: [0.03, 0],
        scale: [20, 0],
        duration: this.duration,
        easing: 'easeOutCubic'
      })
      
      anime({
        targets: ['#js-fe_turbulence_2', '#js-fe_displacement_map_2'],
        baseFrequency: [0.2, 0],
        scale: [20, 0],
        duration: this.duration * 2,
        easing: 'easeOutCubic'
      })
      
      anime({
        targets: ['#js-fe_turbulence_3', '#js-fe_displacement_map_3'],
        baseFrequency: [0.1, 0],
        scale: [40, 0],
        duration: this.duration * 3,
        easing: 'easeOutCubic'
      })
    }
  }
})
View Compiled

External CSS

  1. https://fonts.googleapis.com/css?family=Dosis

External JavaScript

  1. https://cdn.jsdelivr.net/npm/vue@2.6.7/dist/vue.min.js
  2. https://cdn.jsdelivr.net/npm/animejs@3.0.1/lib/anime.min.js