【Vue.js】押しちゃダメ！お化けが取り憑くボタン

### 【概要】
クリックするとお化けの画像が現れ、マウスカーソルの移動に合わせてお化けの画像も移動するボタンを作りました。

### 【動作結果】
![お化けソース.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/3174fa19-aca1-08d4-506c-e956632513c0.gif)

### 【コード】

https://play.vuejs.org/#eNqVVutv01YU/1cO+bB2rH7GTZOsZUAFE1PZ0LqhTcoX49wkBse2fJ0HoErYgQ1oUTXEm20MCUEFEkxiH9h47I+5pGWf9i/snOs4TSdAm+TE9zzuub97nj5d2BeGarfDCtXCfMzaoWfHbE/NB5ivu13oKrwV9BZqha7L3WMeqxXA8WzOkdNsBTxGusrjkx5DRies494jAXdjN/BrBWkF7exSFBDJxeHaNZH8IJLHW1eeDwfrInny+tnqm40bYvBQDJ6K9Mnw3HmULh/9VKRPxeCFGFwQ6WWR/IRMkbyih/hXSJRcF8kdkaYoyg4BaMVxyKua1gj82O4xHrSZ6gRtzXUCn2sS7CeNBQnedT7gCzzw3DooSo6Sd5vQb3s+XY1soaler6f2imoQNTVT13UNVfC+LeY2WzFqGayNZNdlvf1BH2kddCiWLZg1zPHls+vvgoOICvZlsOBgxBiUVEs14dhJ2DuBGJR33QOWXIf5/D0amjfSmF4M2m0WOa7t5bs+hMUgPBkRcDB1syjxSM/MwCHfUbf9gIBDO27lBEAdb3bY0lUDrNKcaniKYSDuiqMU8WWqswoyoahWiC8Xi2WwyuQLa86k/5KpmkeNirmoQ7lEjw5Igb5MvkKSXsg4KhUdHSpqWSmDMYcv+pMrR7FAx5PwFNWSJ+HxlQyLgliMIrF1dU4pmrivolhWBmbJLFXUIszqJQJcRBYaR+Al2lKEElcqaBQPlrRS8hSzpJaUoq7OolUTDRoW0bNkn1YW7daXDMv4P2aXyhRsa85Ao7iRLFfokJF5QksXOnXYKEnv2EUT8ME1/pQSXp7IMYcYp9oV9N1OTZ1UdzBQ9VStkEdTy5OdUjkrcg2rPFsd68Rx4MNeB/PoxHbFwwLsGhf/ns2LWfHdFelADM6Iwd2/XyTzWrYX7cxrEz0ESe5EbhgDZ3EnBM/2m2g45rI83HYYRDGchsA/HHT8mNVncPm1386JiDVmABM77CAJK9CIsAymsFVNkWlK3hirLweJ2tMN28Ncz2Uea8QjgT5mxkE4wav5mgZi8LNI74v0960Hz4erV6ndpPfE4CZ1pQG2pFWRXhjroPT1y0tbL1Hn8nD92vDV9dxy1v7Q+DSW28IeOE1eJQxq1/Y6JGBqaDfZN8RHGP9if1vzV0aAMrujJve2gxeXl7eubIjk0ebtZyK5tLl+WyTnRbq6E0reifGI3IvT09vQIoxJ5GfrDGh1Eu5HMBX2p2YyKcKtTmCekCHmFenIcRRHZ/Rcvx70VLteP9Blfrzk8pj5LJqewvhy1g66bGpmBPRDNDAR+Z0GIqn7n2xgWst0G6UejSXgThCyOnK03dtDKJ9AayI5i8/m2TsiubHt4OTRX+eyxVWRrsmUWBcpZsJ3KIoYZrfbZZtr3w8f35Lu6bn1uCWSjWwy4GATgx9F+ifmD5YLDrnNmzSosNDe3E+2fvvlzd2NrXt/kAKlGUYYh9+vInkgziTjjRNgEOQthCGSh4Q2hyGSmxhwOQWTmr9bq/mqnHFZPMNR6KsY5Qzux8SWQKugh31JZnhzGiOJDiSnobcKM1immEwNt6ke54GPXwfScK1AqeR6LPoipAOwlKt5CtUKtucFvc8kL446bJQ8uKfFnBNv4R/nfeLVCkcixlnUxQ4zlsV21GT4fUHiA8ufsz6ux8J2UO9QP3qP8EscjF4n+xIhtf0dv46wJ/Qk2kOyC7l+8yt+oI/ZxfNLEVCZ4FIf22GH4Vx959W34WLDzwujsPIPrilyxw==

上記リンク先と同じコード

```vue:App.vue
<template>
  <div v-show="visible" class="ghost" :style="updatePosition">
    <!-- お化けの画像は下記リンク先のSVGコードをそのままコピーしたもの
      https://fontawesome.com/icons/ghost?f=classic&s=solid -->
    <svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 384 512">
      <!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
      <path
        d="M40.1 467.1l-11.2 9c-3.2 2.5-7.1 3.9-11.1 3.9C8 480 0 472 0 462.2V192C0 86 86 0 192 0S384 86 384 192V462.2c0 9.8-8 17.8-17.8 17.8c-4 0-7.9-1.4-11.1-3.9l-11.2-9c-13.4-10.7-32.8-9-44.1 3.9L269.3 506c-3.3 3.8-8.2 6-13.3 6s-9.9-2.2-13.3-6l-26.6-30.5c-12.7-14.6-35.4-14.6-48.2 0L141.3 506c-3.3 3.8-8.2 6-13.3 6s-9.9-2.2-13.3-6L84.2 471c-11.3-12.9-30.7-14.6-44.1-3.9zM160 192a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zm96 32a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"
      />
    </svg>
  </div>
  <button @click="visible = !visible">押しちゃダメ！</button>
</template>

<script setup lang="ts">
import { onMounted, onUnmounted, ref, computed } from 'vue'

const visible = ref(false)
const left = ref(0)
const top = ref(0)

// マウス移動のイベントからマウスの位置を取得
const update = (e) => {
  left.value = e.pageX
  top.value = e.pageY
}

// 取得したマウスの位置をCSS用に書き換える
const updatePosition = computed(() => {
  return {
    left: left.value + 'px',
    top: top.value + 'px',
  }
})

onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
</script>

<style scoped>
/* お化け画像がいい感じの位置に配置され動くようにrelative指定
   widthとheightはボタン押下時のdiv要素表示タイミングで、ボタンの位置がずれないようにするため
*/
.ghost {
  position: relative;
  width: 0px;
  height: 0px;
}
</style>
```