Vueでスクロール位置を取得しフェードイン・アウト処理をする

# Vueを始めている者です、いかがおすごしでしょうか？

<details><summary>冬にこの記事を読んだ人用</summary>温かいおそばに野沢菜とたまごを入れると、
とても美味しいのでおすすめです</details>

## さて、スクロール位置によってフェードイン・アウトする処理ですが
ググると以下の情報を取得できまして、それらをもとに試行錯誤してみました

- スクロール位置によって、画像をフェードイン・アウトする処理：jQuery
- スクロール位置によって、コンテンツをフェードイン：Vue
- ボタンによって画像をフェードイン・アウトする処理：Vue

Vueでスクロール位置によって、フェードイン・アウトする処理の
ピンポイントな情報が、なかなかみつけられなかったので
備忘録を兼ねて、ここに記述しておきたいと思います

ちなみにjQueryをVueに組み込むこともできるんですね！
それは素晴らしいと思いましたが、まずはVueのみで処理[^1]を行ってみました

# まずは`jsfiddle`用に書きましたので実行結果をごらんください

https://jsfiddle.net/han_aru/boxqn182/27/

# 実際には〇〇〇〇.vue という1ファイルに以下のすべての処理を書きました

```html:templateタグ部分のみを書きました
<template>
　<transition>
　　<div v-show="visible">
　　　<h1 id="header-logo">ここがフェードイン・アウトするよ</h1>
　　</div>
　</transition>

　<p>いろいろ書きたいこと...夢...希望...勇気...そして、愛</p>
　.....
</template>
```

この`<transition>`が大事なようです

[Vue.jsのtransitionによるアニメーションの基礎を学ぶ
で詳しく知りました。ありがとうございます](https://noumenon-th.net/programming/2019/05/25/transition/)

>Vue.jsには、要素の表示・非表示の挙動においてアニメーションを実装していくtransition（トランジション）と呼ばれる機能があります。

divタグ内に`v-show="visible"`を書いて、
まずは見えている`visible`状態を作ります

[[Vue.js]スクロールでコンテンツがフェードインする実装
で詳しく知りました。ありがとうございます](https://qiita.com/RyoTa0222/items/cba9c1cebc6fda927837)

>v-showは、画面への表示、非表示の切替がCSSで行われます。つまりDOM上では常に描画された状態であり、例えばv-show="false"は、CSSでdisplay: none;が与えられて非表示になっています。

>変数のvisibleはデフォルトでfalseとなっており、非表示の状態になっています、このコンポーネントでは、スクロールイベントを設定し、デフォルトで非表示の要素が一定の高さにくるとvisibleがtrueになり、表示されます。

# 続いてscriptの部分です

```javascript:jsfiddle用の記述とは若干違い、〇〇〇〇.vueでは以下のように書きましたが、処理内容はどちらも一緒です
<script>
export default {
  data() {
    return {
      visible: false,
    };
  },
  created() {
    window.addEventListener("scroll", this.handleScroll);
  },
  methods: {
    handleScroll() {
      this.scrollY = window.scrollY;
      if (!this.visible) {
        this.visible = window.scrollY > 100;
      } else if (window.scrollY < 90) {
        this.visible = !this.visible;
      }
    },
  },
};
</script>
```

[Vue.jsでスクロールを検知する
で詳しく知りました。ありがとうございます](https://qiita.com/SatoTakumi/items/d88df8afae82c53d2d2a)

とうぜんながら、ここが一番悩んだところで、やりたかったことは、

1. 最初は消えていて
2. あるスクロール位置で、消えていたものが登場する
3. あるスクロール位置で、登場していたものが消える

なわけですが、これをif文を使って書くことで解消されました:clap:

```javascript:書き終わってみると単純な記述ですね
      if (!this.visible) {
        this.visible = window.scrollY > 100;
      } else if (window.scrollY < 90) {
        this.visible = !this.visible;
      }
```

`visible: false,`で表示をデフォルトで消して、かつ
`!this.visible`と書くことで、`!`見えていない、とするわけですね

```javascript:こんな書き方がわかりやすいかなとおもいつつ、動きましたが、スクロールスピードによっては消えなかったりしました
      if (!this.visible) {
        this.visible = this.visible < window.scrollY + 100;
      } else if (this.visible) {
        this.visible = !this.visible < window.scrollY - 100;
      }
```

[【Vue.js】クリックで要素を動的に切り替える
で詳しく知りました。ありがとうございます](https://into-the-program.com/vue-elem-switch/)

>ボタンのクリックによってisActiveをトグルしています。isActiveがtrueのときはfalseを、falseのときはtrueとすることで要素が切り替わります。

>トグルとは、ある同じ操作を繰り返すことで、機能や状態のON/OFFを切り替える仕組みのことである。

`created()`に関してはまだ良くわかっていませんが
こういう:point_down:ことだそうです

[vue.jsのcreatedとmountedの違いを目で見て理解
で詳しく知りました。ありがとうございます](https://reffect.co.jp/vue/vue-js-created-mounted-diffrence)

>created, mountedはライフサイクルフックと呼ばれ、vue.jsの初期化の中の決められたタイミングで実行される関数です。各ライフサイクルフックの中にプログラムを記述することでvue.jsの初期化の流れの中で記述したプログラムを必ず実行させることができます。

# CSSでフェードするアニメを作る

```css
<style scoped>
#header-logo {
  position: fixed;
  top: 5%;
  left: 9%;
}

/* ヘッダーロゴ フェード処理ここから */
.v-enter {
  opacity: 0;
}

.v-enter-active,
.v-leave-active {
  transition: opacity 1s;
}

.v-enter-to {
  opacity: 1;
}

.v-leave-to {
  opacity: 0;
  transition: opacity 1s;
}
/* ヘッダーロゴ フェード処理ここまで */
</style>
```

`v-enter` `v-enter-active` `v-leave` 
と言うものがあるのですね

[Vue.jsについての基礎（transitionによるアニメーション）
で詳しく知りました。ありがとうございます](https://qiita.com/watataku8911/items/f691a2999c3e2600173b)

>ざっくり分けると、表示時はenterで、非表示時はleave系のクラスが付与されます。

<details><summary>冬じゃなくてもこの記事を読んだ人用</summary><h1>これは米粉を使って焼いたピザ（グルテンフリー）です！！</h1>
大葉がいい味を出してくれました。
シーチキン、味付け卵、そして大量のチーズの下には、
**チャーシュー**がたくさん入っているのです！<br>美味しいのでぜひやってみてください![pizza1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/aba599fb-7391-6429-0c98-8861eb46bb6f.jpeg)</details>



[^1]: 多くの処理内容はこれから理解していきまして、今回はあくまでも動いたよ、という処理であることをご了承くださいませ