# 「実践JS/CSS」を語るフロントエンドTechCafe〜Tips集〜 ## 1. アニメーションライブラリ(GSAPメイン)(岩佐) * 全般 * [現場で使えるアニメーション系JSライブラリまとめ(2022年版)](https://ics.media/entry/14973/) * GSAPについて * [基本機能](https://ics.media/entry/220822/) * [CSSでのイージング](https://developer.mozilla.org/ja/docs/Web/CSS/animation-timing-function) * [タイムライン・スクロール制御](https://ics.media/entry/220825/) * Typescript * 型定義ファイルが含まれている * [性能比較](https://ics.media/entry/14993/) * [ライセンス](https://web-children.com/2022/10/16/introduction-of-gsap-license/) * React * [Framer Motion](https://www.framer.com/motion/) * 宣言的にアニメーションが書ける * [Framer Motionで簡単アニメーション実装](https://qiita.com/cryptobox/items/0e1f0ebc32143152dc70) * [Example](https://www.framer.com/motion/examples/) * 内部エンジンは[Popmotion](https://popmotion.io/)を使っている(Framer Motionと同じ作者) * Vue * [GSAP + Vue](https://www.twilio.com/ja/blog/create-animation-vue3-gsap-jp?tag=flex) * transition * Svelte * [Motion](https://svelte.jp/tutorial/tweened) * [Transition](https://svelte.jp/tutorial/transition) * [Animation](https://svelte.jp/tutorial/animate) ## 2. rippleでのアニメーション表現調査体験談(北嶋) * 商材で[Vuetify](https://v2.vuetifyjs.com/en/)を利用しているがパフォーマンスの懸念でやめたい * 独自コンポーネントに置き換える場合、機能は満たせそうだがアニメーションを維持するのが難しそう * まずは[波紋(ripple)](https://vuetifyjs.com/ja/directives/ripple/)を調査してみる * rippleの実現方法を調査 * [Vuetifyソース](https://github.com/vuetifyjs/vuetify/tree/master/packages/vuetify/src/directives/ripple)を読んでみる * JS + CSSでやってるっぽい * ripple要素を追加してそこにCSSでアニメーションを当てているよう * [JS該当ソース](https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/directives/ripple/index.ts#L83) * [CSS該当ソース](https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/directives/ripple/VRipple.sass#L17) * いくつか記事を読んでみる * [リップルエフェクト解体新書](https://qiita.com/NumLocker/items/5cd3c07d47fde475856c) * [jQueryとcssで作る波紋アニメーション](https://zenn.dev/harurow/articles/230aa640741dd8) * JSで要素追加 + CSSでアニメーションが定石っぽい ### まとめ * これくらいなら独自で作っても良さそう * 軽量なものであればライブラリを利用するのもあり * [v-wave](https://www.npmjs.com/package/v-wave) * [v-ripple](https://vuetifyjs.com/ja/directives/ripple/)だけ利用する ## 3. 実務で使ってみたいモダンCSS機能(北嶋) * Grid Layouts * 新しいレイアウト仕様 * Flexboxの代わりになるかと思って調べたが微妙 * デザイン設計がハマれば使えるかも(レスポンシブ対応とか?) * 参考記事 * https://zero-plus.io/media/grid-layout/ * https://ics.media/entry/15649/ * Cascade Layers * 詳細度よりも優先してスタイルを当てられる仕組み * 思ったよりも仕様が複雑なので、すぐに実用は難しそう * [参考記事](https://zenn.dev/yend724/articles/20221227-fcz1jh70bhnqof2v) ## 4. ドラッグ&ドロップ ライブラリ紹介(庄禮) * ドラッグ&ドロップとは * マウスクリックをしたまま目的の場所まで移動させ(ドラッグ)、目的の場所でクリックを離す(ドロップ)操作 * Webサイトでは「要素の並び替え」や「要素の追加/削除」などでよく使われる * 以下並び替え(sort)に寄った話多め * 実現手段 1. [draggable](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/draggable) & [HTML ドラッグ & ドロップ API](https://developer.mozilla.org/ja/docs/Web/API/HTML_Drag_and_Drop_API) * [サンプル](https://www.htmq.com/dnd/) * Good: ライブラリを入れなくていい * Bad: 規模が大きくなればなるほどデータの変更などが煩雑になるため、小規模でない限り現実的にライブラリを使わないケースはほとんどなさそう 1. [jQuery UI / Draggable (+ Sortable)](https://jqueryui.com/) * [サンプル](https://jqueryui.com/draggable/) * Good: すでにjQueryやjQuery Uiを使用している場合の導入障壁が低い * Good: バニラよりシンプル * Bad: SPAに使いづらい(jQuery自体の話になりそう) 1. ★[SortableJS](https://sortablejs.github.io/Sortable/) * [サンプル1](http://sortablejs.github.io/Sortable/#simple-list) [サンプル2](https://bsblog.casareal.co.jp/archives/6327) [サンプル3](https://taitan916.info/blog/archives/3309) * Good: Vue.jsやReactでの使用実績も多い * Goog: jQueryと合わせての仕様が可能 * Good: 「HTML ドラッグ & ドロップ API」を使いやすくしたイメージ( [記事](https://github.com/SortableJS/Sortable/wiki/Sorting-with-the-help-of-HTML5-Drag'n'Drop-API/)) * Bad: 上記APIを使える(=高機能だから)こその難しさ(バニラよりはまし) 1. ★[Vue.Draggable](https://github.com/SortableJS/Vue.Draggable) * [サンプル1](https://david-desmaisons.github.io/draggable-example/) [サンプル2](https://scramblenote.com/article/vue-draggable) * Good: SortableJSのVue.js用ラッパーでVue.js用に追加やすいようにカスタマイズされている(=とりあえず動くものが簡単に作れる) * Bad?: 細かい制御をしようとすると結局SortableJSの設定値を意識する必要がある 1. 以下は知見がないが参考情報とて合わせて紹介 * [Packery](https://packery.metafizzy.co/) * [shopify draggable](https://shopify.github.io/draggable/) * [interact JS](https://interactjs.io/) ## 5. lazyload ライブラリ紹介(庄禮) * lazyloadとは * Webページ全体を最初にロードや描画せず、スクロールに応じて順次読み込む手法(遅延読込) * 画面の初期表示が速くなることによりユーザビリティが向上 * 実現手段 1. [loding属性](https://developer.mozilla.org/ja/docs/Web/API/HTMLImageElement/loading) * [サンプル](https://coliss.com/articles/build-websites/operation/work/native-image-lazy-loading.html#:~:text=%3C/script%3E-,loading%E5%B1%9E%E6%80%A7%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%87%E3%83%A2,-100%E5%8C%B9%E3%81%AE) * Bad: 画像のみ対応 * Note(~~Bad~~): 対応ブラウザ ([Can I Use](https://caniuse.com/loading-lazy-attr)) 1. ★[Intersection Observer API](https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API) * [サンプル](https://www.wakuwakubank.com/posts/623-javascript-intersection-observer/) (遅延描画ではなくAPI自体のサンプル) * Note: 画面交差(=現在Webページのどこが表示されているか)を監視するAPI。 * Good: 自前で監視して画面に表示するため、画像以外も遅延描画可能 * 余談: 監視系のAPIは他にも存在 * https://www.mitsue.co.jp/knowledge/blog/frontend/201803/28_1056.html 1. [Lazy Load](https://github.com/tuupola/lazyload) (ややこしいですがライブラリ名) * [サンプル](https://codepen.io/symm_egashira/pen/Examogb) * Good: 画像へのclass指定とdata-srcを使用するだけで対応可能 * Bad: 画像のみ対応 * Note: 「Intersection Observer API」を使用したライブラリ 1. [Lozad.js](https://github.com/ApoorvSaxena/lozad.js) * [サンプル](https://apoorv.pro/lozad.js/demo/) * Note: 「Intersection Observer API」をラップしたライブラリ * Good: 画像以外も遅延描画可能 1. [VueUse useIntersectionObserver](https://vueuse.org/core/useIntersectionObserver/) * [サンプル](https://vueuse.org/core/useIntersectionObserver/) * Note: Vueのライブラリの「Intersection Observer API」ラッパー 1. ★[(Vue.js/Vuetify.js用) lazyコンポーネント](https://vuetifyjs.com/ja/components/lazy/) * Good: とりあえず動くものが簡単に作れる(タグで囲うだけ) ## 6. 小ネタ * CSSでのビジュアル表現(岩佐) * [pokemon-cards-css](https://github.com/simeydotme/pokemon-cards-css)で使われているCSS * JSもゴリゴリに使われているのでCSSでどんなことをしているかを中心に * [background-blend-mode](https://developer.mozilla.org/ja/docs/Web/CSS/background-blend-mode) * [mix-blend-mode](https://developer.mozilla.org/ja/docs/Web/CSS/mix-blend-mode) * [filter](https://developer.mozilla.org/ja/docs/Web/CSS/filter) * [radial-gradient](https://developer.mozilla.org/ja/docs/Web/CSS/gradient/radial-gradient) * [conic-gradient](https://developer.mozilla.org/ja/docs/Web/CSS/gradient/conic-gradient) * [repeating-linear-gradient](https://developer.mozilla.org/ja/docs/Web/CSS/gradient/repeating-linear-gradient) * [will-change](https://developer.mozilla.org/ja/docs/Web/CSS/will-change) * ページ内リンク関連(庄禮) * [scroll-margin-top](https://developer.mozilla.org/ja/docs/Web/CSS/scroll-margin-top) * [scroll-behavior: smooth](https://developer.mozilla.org/ja/docs/Web/CSS/scroll-behavior) * [サンプル](https://gihyo.jp/article/2022/08/tfc005-modern_css) * 日付・時間系ライブラリ(岩佐) * 今採用するならどれなんだろう? * やりたいこと * 日付・時間の計算 * フォーマット変換(任意の文字列からのパース・計算結果を任意のフォーマットで出力) * [date-fns](https://date-fns.org/) * Date オブジェクトのヘルパ関数の集合体(Date オブジェクトの lodash みたいな) * [day.js](https://day.js.org/) * Moment.js の操作感に近い * [cdate](https://github.com/kawanet/cdate) * [moment.js・day.js よりも速くて軽い cdate ライブラリ](https://qiita.com/kawanet/items/7ce867f5b1ad187c2111) * [Temporal](https://tc39.es/proposal-temporal/docs/ja/index.html) * 現在、stage3 * @js-temporal/polyfill を使えば利用可能 * 動向を見守る * ライブラリ系(北嶋) * [body-scroll-lock](https://zenn.dev/kalubi/articles/75b735fd986584) * 実際にサービスでも使えそうかも