5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事は、クソアプリアドベントカレンダーの24日目の記事です。

エル、知ってるか?夜明けまでが今日(23日)なんだ。
つまり、夜明けまでの投稿すれば、24日のアドベンドカレンダーは遅れたことにはならない。
だって、みんな寝てるじゃん(23日29時の発言)

今年のアプリは寿司だ。ソウルフードの寿司だ。
日本人の叡智が詰まった究極のご飯、寿司だ。
いまや、日本と言えば、SUSHIってくらい寿司だ。

これ以降の文章は、GPT-4に丸投げした。(ちょっと弄ったけど)
「私は好きにした、君らはいいねしろ」

ビジター、アプリはここからアクセスできる。
用件はそれだけだ。じゃあな。
https://sushilyrain.netlify.app/

🚀 プロジェクトの概要

image.png

このアプリは、ユーザーがボタンを押すか、一定時間待機すると、画面上のランダムなX座標から寿司の絵文字が出現し、画面の右端に向かって横断します。アニメーションの終了後、寿司は消えます。
今の時代に、アクティブデスクトップ壁紙があれば、壁紙にして、楽しんでいたことでしょう。

💻 コードの解説

プロジェクトのコアはVue 3のComposition APIを使用しています。以下に主要な部分を簡単に紹介します。
テンプレート部分


<template>
  <!-- ヘッダー部分 -->
  <div class="header">
    <h1>sushilyRain</h1>
    <h2>The rain will turn into sushi after midnight...</h2>
    <!-- 寿司を追加するボタン -->
    <div>
      <label>sushi:</label>
      <button @click="addSushi">Add</button>
    </div>
    <!-- 自動追加のオンオフ切り替え -->
    <div>
      <label>autoAdd:</label>
      <button @click="isAutoAdd = !isAutoAdd">{{ isAutoAdd ? 'stop' : 'start' }}</button>
    </div>
  </div>
  <!-- 寿司の絵文字が出現する部分 -->
  <div>
    <div v-for="rain in rains" :key="rain.id" class="box" :class="`box${rain.id}`" :style="rain.style"
      @animationend="rain.show = false" v-show="rain.show">
      🍣
    </div>
  </div>
</template>

addでボタンで、寿司を追加できます。
autoAddボタンを操作することで寿司の自動追加をオンオフ切り替えます。

スクリプト部分


<script setup>
import { ref, watch } from 'vue';

let nextId = 0;
let intervalId = null;
const isAutoAdd = ref(true);
const rains = ref([]);
const addSushi = () => {
  const randomLeft = Math.random() * (window.innerWidth - 50); // 50はボックスの幅
  const newItem = {
    id: nextId++,
    show: true,
    style: {
      left: `${randomLeft}px`,
      animation: `moveDiagonally ${Math.random() * 10}s forwards`
    }
  };
  rains.value.push(newItem);
}

intervalId = setInterval(addSushi, 800)
const manageAutoAdd = () => {
  if (isAutoAdd.value) {
    intervalId = setInterval(addSushi, 800)
  } else {
    clearInterval(intervalId);
  }
}

watch(isAutoAdd, manageAutoAdd);

</script>

addSushi 関数で新しい寿司の絵文字を追加し、
watch で isAutoAdd の状態変化を監視しています。
ポイントは、移動速度をランダムで設定することで、寿司の移動が単調になることを防いでいます。

スタイル部分


<style>
/* 基本スタイルとアニメーションキーフレーム */
button {
  margin-left: 5px;
}

.box {
  position: absolute;
  top: 0px;
  z-index: 1;
  font-size: 50px;
}

.header {
  text-align: center;
  z-index: 999;
  position: relative;
}

body {
  background-color: #121212;
  color: rgb(205, 204, 204);
  overflow: hidden;
}

@keyframes moveDiagonally {

  to {
    transform: translate(calc(100vw - -50px), calc(100vh - 50px)) rotate(300deg);
  }
}
</style>

CSSアニメーションで寿司が画面を横切る動きを実現しています。

🌟 ハイライト

  • ランダムな出現位置: 寿司が出現するX座標はランダムで、画面の幅に依存します。これにより、アプリに予測不可能性と面白みを加えています。
  • アニメーションのカスタマイズ: CSSアニメーションはカスタマイズ可能で、異なる速度や動きを簡単に実装できます。
  • ユーザーインタラクション: ボタンを押すことでアニメーションを即座に開始できるため、ユーザーのインタラクションを取り入れています。

📚 結論

この小さなプロジェクトを通じて、Vue.jsとCSSアニメーションの強力な組み合わせを楽しく学ぶことができました。初心者にも分かりやすいように、コードの全体像と重要な部分を紹介しています。ぜひチェックして、あなたのプロジェクトにも応用してみてください!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?