おもろいことしかやらない

🗣: バイクに乗ったり、ものづくりしたり、ひたすら寝たり。

Rails6のアプリでポートフォリオを作った話。【2】

前回の記事の続きになります。

# 使うもの👩‍💻

  • Rails6, slim, scss, Vue.js, webpacker
  • heroku, postgres

# ゴール💡

# 今回の目次🐕

1. CSS3を使ってオシャレ感を演出する

2. Vue.jsでモーダルを追加する

3. GSAPでDOMを動かす

## 1. CSS3を使ってオシャレ感を演出する

①hover時にぼやっとする f:id:letterneginr:20200421145639g:plain

②hover時にぼやっとして文字を出す f:id:letterneginr:20200421145648g:plain

①やっていることはCSS3でfilterとanimationの動きを指定するだけです。

&:hover {
  transition: .3s ease-in-out;
  -webkit-filter: grayscale(60%) blur(2px);
  filter: grayscale(60%) blur(2px);
}

developer.mozilla.org

CSS3のfilterはinvert(反転)の効果が簡単に画像にかけられて好きです。 場合によってはデザイナーさんの手を煩わせずに加工ができてしまいますが、caniuseなどでCSSがブラウザに対応しているか見つつ、プレフィックス(-webkitなど)を導入してください。

filterだけではゆっくりと変化する動作がつけられないので、transition-durationで変化の所要時間を指定しましょう。transitionは変化のモーションを指定することもできますよ。

②画像にfilterをかけて、画像を囲っているdivのbefore要素に対して文字を載せています。beforeのような擬似要素はimgのような置換要素には適用できません。

今回はscssを触ったので、マップを使って文章を各divに載せることをしました。key名をクラスにあてがう事で、対応する文章を載せています。

$texts: (
  bike: "バイク好きです。よく1人でお出かけしたりしています。",
  game: "ホラゲとシューティングゲームが好きです。バイオハザードシリーズや最近は              World War Zに手を出しました。",
  spa: "Vue.jsを使ったSPAアプリを作りました。お手軽にできるのがいいですね。",

  … );

  @each $key, $text in $texts {
     &.-#{$key}:hover:before {
       width: 100%;
       height: 100%;
       font-size: 30px;
       font-family: 'クレー', '游明朝体', 'ヒラギノ明朝 ProN';
       position: absolute;
       content: $text;
       padding: 12px;
     }
   }

## 2. Vue.jsでモーダルを追加する

f:id:letterneginr:20200421154642p:plain

  • DOMが描画されるタイミングでトップ画面にモーダル付きのカード要素を挿入しています。
  • カードのボタン押下時のイベントを拾い、モーダルを出力します。
  • モーダルではバツボタンを押下すると、イベントが伝搬し、モーダルを閉じる動作になります。

カードのテンプレート

<template>
  <div class="m-card">
    <div class="a-picture">
      <img v-bind:src="require('../assets/images/new.PNG')"/>
    </div>
    <h2 class="a-title">What's new</h2>
    <h3 class="a-title -sub">2020.04.20 | Aboutページを更新しました!</h3>
    <button @click="showModal">...</button>
    <modal @from-upddate-modal="handler()" v-show="show"></modal>
  </div>
</template>
  • requireはRailsのアセットが置かれているパスを参照してくれます。
  • v-showはプロパティの評価に関わらず、CSSで要素の表示・非表示の切り替えをしています。評価の遅延がある分、条件が一つであるならv-showで切り替えた方が良さそうです。

モーダルのテンプレート

<template>
  <div class="m-modal__bkground">
    <div class="m-modal">
      What's new
      <button class="a-button" @click="closeModal">x</button>

      <h2 class="a-title">2020.04.20 | Aboutページを更新しました!</h2>
      <span>CSS3を使ったhover時の挙動を追加しました。</span>
          ----

   …

<script>
export default {
  methods :{
    closeModal(event){
      this.$emit('from-upddate-modal', 'false')
    }
  }
}
</script>
  • $emitメソッドは、第1引数のイベントをトリガーとして値を渡します。渡す値は複数指定することができます。
  • @イベント名で親に値を渡すことができます。

## 3. GSAPでDOMを動かす

ここで余談になりますが、Railsはhtmlを部品化して呼ぶことができます。 部品化できるメリットは、1ファイルにあるコードの行数が減るので、アレンジやバグの特定がしやすいところです。

このパーシャル(部品化)の性質を利用して、jsのコードをページ毎に整理しようとしています。(今は参照パスの問題を解消しているところです…)

なぜパーシャルの話が出るのかというと、フロントエンドの部品を独立して動かす事で変更が他の部品に適用されてしまう心配がないというメリットがあります。

考え方はさておきgsapの紹介です。ライブラリをimportしてアニメーションの作用先と設定を書くことで簡単にアニメーションができます。

TimeLineメソッドを使ってDOMを動かすコード

import { gsap } from "gsap";

function logo() {
  const tl = gsap.timeline({repeat: -1, repeatDelay: 0.5});
  const logo = document.querySelectorAll(".a-logo");
  var grid = [7,15];

  var selections = {from: "left", axis: null, ease: "none"};
  tl.to(logo, {
    duration: 1,
    scale: 0.1,
    y: 60,
    yoyo: true,
    repeat: 1,
    ease: "power1.inOut",
    stagger: {
      amount: 1.5,
      grid: grid,
      axis: selections.axis,
      ease: selections.ease,
      from: selections.from
    }
  });
}

f:id:letterneginr:20200419002837g:plain

  • .a-logoというクラス名のDOMを集めて、波のような動きを表現しています。 それぞれのプロパティを調整することでアニメーションの種類やタイミングを変更可能です。

プロパティについてはこちらの公式ドキュメントを見ながら手を動かすと、楽しいと思います。

あまり聞き慣れないかもしれませんが、gsapはGreenSockが出しているアニメーションライブラリです。gsap, TweenMaxのことをGreenSock(のライブラリ)と表現している記事も見かけられ、Vueの公式でも採用されているくらいにはアニメーションのライブラリとして普及されているようです。

日本語ドキュメントはありませんが、紹介記事やデモも多いです。 公式サイトのshowcaseは見ているだけでも楽しいので、めちゃくちゃ推しておきますヽ(´▽`)/笑