20200727のvue.jsに関する記事は14件です。

【CSS画像アニメーション55選!】Vueエンジニアがおすすめするコピペ大歓迎のオリジナルコード

スクリーンショット 2020-07-27 23.47.46.png

こちらの記事に記載のデザイン・コードは全てオリジナルなので自由に使っていただいて大丈夫です(筆者が作成したため)
プロジェクトに取り込んでより充実したデザインにしてもらえれば○
コードは全てリンク先に説明付きで記載してあります


【真似したくなる】transform:rotate×scaleでCSS画像アニメーション3選

動きは下の画像のような感じになります

1. transform rotateX×scaleで【縦回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.44.png

2. transform rotateY×scaleで【横回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.51.png

3. transform rotateY/Z×scaleで【3D回転】画像アニメーション

スクリーンショット 2020-07-27 23.27.57.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.27.32.png

transform:translateで絵画デザインのスライドショーを実現!CSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで右方向からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.41.png

2. クリックで上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.46.png

3. クリックで斜め上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.52.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.29.23.png

【transform:rotate×scale】回転×拡大するCSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.34.00.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.34.07.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.34.16.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.33.36.png

filterとtransformでリアルな絵画デザインのCSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで横幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.33.png

2. クリックで縦幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.38.png

3. クリックで思いっきり伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.43.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.36.04.png

filterとtransformで超動くCSSスライダーアニメーション4選【Web制作者必見】

動きは下の画像のような感じになります

1. 縦回転するシンプルなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.00.png

2. 滑らかに横回転するスライダーアニメーション

スクリーンショット 2020-07-27 23.39.05.png

3. 平面回転するスタイリッシュなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.11.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.38.38.png

【transform×回転『rotate』】CSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.41.19.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.41.25.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.41.31.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.40.43.png

【transform rotate×画像背景】CSS回転アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX画像背景アニメーション

スクリーンショット 2020-07-27 23.43.31.png

2. 【横回転】transform rotateY画像背景アニメーション

スクリーンショット 2020-07-27 23.43.37.png

3. 【3D回転】transform rotateYZ画像背景アニメーション

スクリーンショット 2020-07-27 23.43.42.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.42.55.png

clip path polygonで2枚の画像を半々(三角形)で表示するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【ぼやけるアニメーション】clip path : polygon+filter : blur

clip-path-image-animation1.png

2. 【美しいアニメーション】clip path : polygon+filter : grayscale contrast saturate

clip-path-image-animation2.png

3. 【オーロラアニメーション】clip path : polygon+filter : grayscale saturate hue-rotate

clip-path-image-animation3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.37.32.png


【解説付き】マテリアルデザインをコピペで実装!CSSスライダーアニメーション6選(filter編)

動きは下の画像のような感じになります

1. hoverで画像が半透明に?超便利なスライダーアニメーション

click-animation-sliders-filter-opacity.png

2. hoverで画像の色が暴れ出すスライダーアニメーション

click-animation-sliders-filter-hue-rotate.png

3. hoverでモノクロ画像が200倍色鮮やかになるスライダーアニメーション

click-animation-sliders-filter-grayscale.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.42.27.png


絶対失敗しないナビゲーションメニューサンプル3選

動きは下の画像のような感じになります

1. シンプルだけど洗練されたスライダーアニメーション

click-animation-sliders.png

2. blurでぼやけながらスライドするスライダーアニメーション

click-animation-sliders2.png

3. blurとmargin-leftでぼやけながら右へスライドするスライダーアニメーション

click-animation-sliders3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.43.47.png


hoverで画像の色が暴れ出す!filter: hue-rotateとtransitionでCSSエフェクト3選

動きは下の画像のような感じになります

1. 画像がイルミネーションみたいに光りながら回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin.png

2. 臨場感あふれる花火画像が立体的に回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin2.png

3. 色相回転しながらぼかしアニメーションを効かせて消えていくhoverエフェクト

css-effects-hover-filter-hue-rotate-blur.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.48.16.png

CSSだけ!hoverとtransitionで作る動的画像エフェクト4選(コピペOK)

動きは下の画像のような感じになります

1. 階段のように背景が現れるhoverエフェクト

animation-image-1.png

2. 上からブロックが落ちてくるように背景が現れるhoverエフェクト

animation-image2.png

3. 斜め上からスクリーンのように背景が現れるhoverエフェクト

animation-image3.png

4. 手裏剣のように回転(rotate)しながら背景が現れるhoverエフェクト

animation-image4.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.53.25.png

hoverとtransitionでオシャレなCSS画像エフェクト4選!(背景がスっと表示される)

動きは下の画像のような感じになります

1. フワッと背景が現れるhoverアニメーション

hover-animation-image-fadein.png

2. 背景が徐々に画像全体へ広がるhoverアニメーション

hover-animation-image-box.png

3. 扉が閉まるように背景が現れるhoverアニメーション

hover-animation-image-door.png

4. 丸い背景が徐々に画像全体に広がるhoverアニメーション

hover-animation-image-squere.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.56.56.png

【transform rotate(360deg)×flexbox】画像が回転+伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation1-228x300.png

2. 【横回転】transform rotateY(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation2-265x300.png

3. 【平面回転】transform rotateZ(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation3-275x300.png

:point_down:コードを確認する

image-transform-rotate-flex.png

【徹底解説】flexを応用して画像が伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. flexで2つの画像が伸縮する画像アニメーション

flex-bigger-images-animation1-265x300.png

2. flexでhoverした画像が100%拡大する画像アニメーション

flex-bigger-images-animation2-266x300.png

3. filterでエフェクト+flexで3つの画像が伸縮する画像アニメーション

flex-bigger-images-animation3-300x249.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.00.53.png

【flexboxのjustify−content:center4選】CSS画像アニメーションを画面中央に配置

動きは下の画像のような感じになります

1. 半分の背景が左右から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image1-300x74.png

2. 背景が両斜めから現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image2-300x76.png

3. 背景が上下から現れる自動ドアのようなCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image3-300x77.png

4. 半分の背景が上下から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image4-300x77.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.05.18.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【現役Vueエンジニアがおすすめ】コピペ大歓迎のオリジナルコードCSS画像アニメーション55選!

スクリーンショット 2020-07-27 23.47.46.png

こちらの記事に記載のデザイン・コードは全てオリジナルなので自由に使っていただいて大丈夫です(筆者が作成したため)
プロジェクトに取り込んでより充実したデザインにしてもらえれば○
コードは全てリンク先に説明付きで記載してあります


【真似したくなる】transform:rotate×scaleでCSS画像アニメーション3選

動きは下の画像のような感じになります

1. transform rotateX×scaleで【縦回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.44.png

2. transform rotateY×scaleで【横回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.51.png

3. transform rotateY/Z×scaleで【3D回転】画像アニメーション

スクリーンショット 2020-07-27 23.27.57.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.27.32.png

transform:translateで絵画デザインのスライドショーを実現!CSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで右方向からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.41.png

2. クリックで上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.46.png

3. クリックで斜め上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.52.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.29.23.png

【transform:rotate×scale】回転×拡大するCSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.34.00.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.34.07.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.34.16.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.33.36.png

filterとtransformでリアルな絵画デザインのCSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで横幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.33.png

2. クリックで縦幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.38.png

3. クリックで思いっきり伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.43.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.36.04.png

filterとtransformで超動くCSSスライダーアニメーション4選【Web制作者必見】

動きは下の画像のような感じになります

1. 縦回転するシンプルなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.00.png

2. 滑らかに横回転するスライダーアニメーション

スクリーンショット 2020-07-27 23.39.05.png

3. 平面回転するスタイリッシュなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.11.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.38.38.png

【transform×回転『rotate』】CSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.41.19.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.41.25.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.41.31.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.40.43.png

【transform rotate×画像背景】CSS回転アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX画像背景アニメーション

スクリーンショット 2020-07-27 23.43.31.png

2. 【横回転】transform rotateY画像背景アニメーション

スクリーンショット 2020-07-27 23.43.37.png

3. 【3D回転】transform rotateYZ画像背景アニメーション

スクリーンショット 2020-07-27 23.43.42.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.42.55.png

clip path polygonで2枚の画像を半々(三角形)で表示するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【ぼやけるアニメーション】clip path : polygon+filter : blur

clip-path-image-animation1.png

2. 【美しいアニメーション】clip path : polygon+filter : grayscale contrast saturate

clip-path-image-animation2.png

3. 【オーロラアニメーション】clip path : polygon+filter : grayscale saturate hue-rotate

clip-path-image-animation3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.37.32.png


【解説付き】マテリアルデザインをコピペで実装!CSSスライダーアニメーション6選(filter編)

動きは下の画像のような感じになります

1. hoverで画像が半透明に?超便利なスライダーアニメーション

click-animation-sliders-filter-opacity.png

2. hoverで画像の色が暴れ出すスライダーアニメーション

click-animation-sliders-filter-hue-rotate.png

3. hoverでモノクロ画像が200倍色鮮やかになるスライダーアニメーション

click-animation-sliders-filter-grayscale.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.42.27.png


絶対失敗しないナビゲーションメニューサンプル3選

動きは下の画像のような感じになります

1. シンプルだけど洗練されたスライダーアニメーション

click-animation-sliders.png

2. blurでぼやけながらスライドするスライダーアニメーション

click-animation-sliders2.png

3. blurとmargin-leftでぼやけながら右へスライドするスライダーアニメーション

click-animation-sliders3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.43.47.png


hoverで画像の色が暴れ出す!filter: hue-rotateとtransitionでCSSエフェクト3選

動きは下の画像のような感じになります

1. 画像がイルミネーションみたいに光りながら回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin.png

2. 臨場感あふれる花火画像が立体的に回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin2.png

3. 色相回転しながらぼかしアニメーションを効かせて消えていくhoverエフェクト

css-effects-hover-filter-hue-rotate-blur.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.48.16.png

CSSだけ!hoverとtransitionで作る動的画像エフェクト4選(コピペOK)

動きは下の画像のような感じになります

1. 階段のように背景が現れるhoverエフェクト

animation-image-1.png

2. 上からブロックが落ちてくるように背景が現れるhoverエフェクト

animation-image2.png

3. 斜め上からスクリーンのように背景が現れるhoverエフェクト

animation-image3.png

4. 手裏剣のように回転(rotate)しながら背景が現れるhoverエフェクト

animation-image4.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.53.25.png

hoverとtransitionでオシャレなCSS画像エフェクト4選!(背景がスっと表示される)

動きは下の画像のような感じになります

1. フワッと背景が現れるhoverアニメーション

hover-animation-image-fadein.png

2. 背景が徐々に画像全体へ広がるhoverアニメーション

hover-animation-image-box.png

3. 扉が閉まるように背景が現れるhoverアニメーション

hover-animation-image-door.png

4. 丸い背景が徐々に画像全体に広がるhoverアニメーション

hover-animation-image-squere.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.56.56.png

【transform rotate(360deg)×flexbox】画像が回転+伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation1-228x300.png

2. 【横回転】transform rotateY(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation2-265x300.png

3. 【平面回転】transform rotateZ(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation3-275x300.png

:point_down:コードを確認する

image-transform-rotate-flex.png

【徹底解説】flexを応用して画像が伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. flexで2つの画像が伸縮する画像アニメーション

flex-bigger-images-animation1-265x300.png

2. flexでhoverした画像が100%拡大する画像アニメーション

flex-bigger-images-animation2-266x300.png

3. filterでエフェクト+flexで3つの画像が伸縮する画像アニメーション

flex-bigger-images-animation3-300x249.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.00.53.png

【flexboxのjustify−content:center4選】CSS画像アニメーションを画面中央に配置

動きは下の画像のような感じになります

1. 半分の背景が左右から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image1-300x74.png

2. 背景が両斜めから現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image2-300x76.png

3. 背景が上下から現れる自動ドアのようなCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image3-300x77.png

4. 半分の背景が上下から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image4-300x77.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.05.18.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【現役Vueエンジニアがオススメ】コピペ大歓迎の完全オリジナルコードCSS画像アニメーション55選!

スクリーンショット 2020-07-27 23.47.46.png

こちらの記事に記載のデザイン・コードは全てオリジナルなので自由に使っていただいて大丈夫です(筆者が作成したため)
プロジェクトに取り込んでより充実したデザインにしてもらえれば○
コードは全てリンク先に説明付きで記載してあります


【真似したくなる】transform:rotate×scaleでCSS画像アニメーション3選

動きは下の画像のような感じになります

1. transform rotateX×scaleで【縦回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.44.png

2. transform rotateY×scaleで【横回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.51.png

3. transform rotateY/Z×scaleで【3D回転】画像アニメーション

スクリーンショット 2020-07-27 23.27.57.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.27.32.png

transform:translateで絵画デザインのスライドショーを実現!CSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで右方向からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.41.png

2. クリックで上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.46.png

3. クリックで斜め上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.52.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.29.23.png

【transform:rotate×scale】回転×拡大するCSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.34.00.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.34.07.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.34.16.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.33.36.png

filterとtransformでリアルな絵画デザインのCSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで横幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.33.png

2. クリックで縦幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.38.png

3. クリックで思いっきり伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.43.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.36.04.png

filterとtransformで超動くCSSスライダーアニメーション4選【Web制作者必見】

動きは下の画像のような感じになります

1. 縦回転するシンプルなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.00.png

2. 滑らかに横回転するスライダーアニメーション

スクリーンショット 2020-07-27 23.39.05.png

3. 平面回転するスタイリッシュなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.11.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.38.38.png

【transform×回転『rotate』】CSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.41.19.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.41.25.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.41.31.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.40.43.png

【transform rotate×画像背景】CSS回転アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX画像背景アニメーション

スクリーンショット 2020-07-27 23.43.31.png

2. 【横回転】transform rotateY画像背景アニメーション

スクリーンショット 2020-07-27 23.43.37.png

3. 【3D回転】transform rotateYZ画像背景アニメーション

スクリーンショット 2020-07-27 23.43.42.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.42.55.png

clip path polygonで2枚の画像を半々(三角形)で表示するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【ぼやけるアニメーション】clip path : polygon+filter : blur

clip-path-image-animation1.png

2. 【美しいアニメーション】clip path : polygon+filter : grayscale contrast saturate

clip-path-image-animation2.png

3. 【オーロラアニメーション】clip path : polygon+filter : grayscale saturate hue-rotate

clip-path-image-animation3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.37.32.png


【解説付き】マテリアルデザインをコピペで実装!CSSスライダーアニメーション6選(filter編)

動きは下の画像のような感じになります

1. hoverで画像が半透明に?超便利なスライダーアニメーション

click-animation-sliders-filter-opacity.png

2. hoverで画像の色が暴れ出すスライダーアニメーション

click-animation-sliders-filter-hue-rotate.png

3. hoverでモノクロ画像が200倍色鮮やかになるスライダーアニメーション

click-animation-sliders-filter-grayscale.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.42.27.png


絶対失敗しないナビゲーションメニューサンプル3選

動きは下の画像のような感じになります

1. シンプルだけど洗練されたスライダーアニメーション

click-animation-sliders.png

2. blurでぼやけながらスライドするスライダーアニメーション

click-animation-sliders2.png

3. blurとmargin-leftでぼやけながら右へスライドするスライダーアニメーション

click-animation-sliders3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.43.47.png


hoverで画像の色が暴れ出す!filter: hue-rotateとtransitionでCSSエフェクト3選

動きは下の画像のような感じになります

1. 画像がイルミネーションみたいに光りながら回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin.png

2. 臨場感あふれる花火画像が立体的に回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin2.png

3. 色相回転しながらぼかしアニメーションを効かせて消えていくhoverエフェクト

css-effects-hover-filter-hue-rotate-blur.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.48.16.png

CSSだけ!hoverとtransitionで作る動的画像エフェクト4選(コピペOK)

動きは下の画像のような感じになります

1. 階段のように背景が現れるhoverエフェクト

animation-image-1.png

2. 上からブロックが落ちてくるように背景が現れるhoverエフェクト

animation-image2.png

3. 斜め上からスクリーンのように背景が現れるhoverエフェクト

animation-image3.png

4. 手裏剣のように回転(rotate)しながら背景が現れるhoverエフェクト

animation-image4.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.53.25.png

hoverとtransitionでオシャレなCSS画像エフェクト4選!(背景がスっと表示される)

動きは下の画像のような感じになります

1. フワッと背景が現れるhoverアニメーション

hover-animation-image-fadein.png

2. 背景が徐々に画像全体へ広がるhoverアニメーション

hover-animation-image-box.png

3. 扉が閉まるように背景が現れるhoverアニメーション

hover-animation-image-door.png

4. 丸い背景が徐々に画像全体に広がるhoverアニメーション

hover-animation-image-squere.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.56.56.png

【transform rotate(360deg)×flexbox】画像が回転+伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation1-228x300.png

2. 【横回転】transform rotateY(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation2-265x300.png

3. 【平面回転】transform rotateZ(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation3-275x300.png

:point_down:コードを確認する

image-transform-rotate-flex.png

【徹底解説】flexを応用して画像が伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. flexで2つの画像が伸縮する画像アニメーション

flex-bigger-images-animation1-265x300.png

2. flexでhoverした画像が100%拡大する画像アニメーション

flex-bigger-images-animation2-266x300.png

3. filterでエフェクト+flexで3つの画像が伸縮する画像アニメーション

flex-bigger-images-animation3-300x249.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.00.53.png

【flexboxのjustify−content:center4選】CSS画像アニメーションを画面中央に配置

動きは下の画像のような感じになります

1. 半分の背景が左右から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image1-300x74.png

2. 背景が両斜めから現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image2-300x76.png

3. 背景が上下から現れる自動ドアのようなCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image3-300x77.png

4. 半分の背景が上下から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image4-300x77.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.05.18.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【現役Vueエンジニア完全オリジナルコード】コピペ大歓迎のCSS画像アニメーション55選!

スクリーンショット 2020-07-27 23.47.46.png

こちらの記事に記載のデザイン・コードは全てオリジナルなので自由に使っていただいて大丈夫です(筆者が作成したため)
プロジェクトに取り込んでより充実したデザインにしてもらえれば○
コードは全てリンク先に説明付きで記載してあります


【真似したくなる】transform:rotate×scaleでCSS画像アニメーション3選

動きは下の画像のような感じになります

1. transform rotateX×scaleで【縦回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.44.png

2. transform rotateY×scaleで【横回転】CSS画像アニメーション

スクリーンショット 2020-07-27 23.27.51.png

3. transform rotateY/Z×scaleで【3D回転】画像アニメーション

スクリーンショット 2020-07-27 23.27.57.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.27.32.png

transform:translateで絵画デザインのスライドショーを実現!CSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで右方向からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.41.png

2. クリックで上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.46.png

3. クリックで斜め上からスライドしてくるアニメーション

スクリーンショット 2020-07-27 23.31.52.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.29.23.png

【transform:rotate×scale】回転×拡大するCSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.34.00.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.34.07.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.34.16.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.33.36.png

filterとtransformでリアルな絵画デザインのCSSスライダーアニメーション3選

動きは下の画像のような感じになります

1. クリックで横幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.33.png

2. クリックで縦幅が伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.38.png

3. クリックで思いっきり伸び縮みしながらスライドするアニメーション

スクリーンショット 2020-07-27 23.36.43.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.36.04.png

filterとtransformで超動くCSSスライダーアニメーション4選【Web制作者必見】

動きは下の画像のような感じになります

1. 縦回転するシンプルなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.00.png

2. 滑らかに横回転するスライダーアニメーション

スクリーンショット 2020-07-27 23.39.05.png

3. 平面回転するスタイリッシュなスライダーアニメーション

スクリーンショット 2020-07-27 23.39.11.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.38.38.png

【transform×回転『rotate』】CSS画像アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateXで画像アニメーション

スクリーンショット 2020-07-27 23.41.19.png

2. 【横回転】transform rotateYで画像アニメーション

スクリーンショット 2020-07-27 23.41.25.png

3. 【3D回転】transform rotateYZで画像アニメーション

スクリーンショット 2020-07-27 23.41.31.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.40.43.png

【transform rotate×画像背景】CSS回転アニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX画像背景アニメーション

スクリーンショット 2020-07-27 23.43.31.png

2. 【横回転】transform rotateY画像背景アニメーション

スクリーンショット 2020-07-27 23.43.37.png

3. 【3D回転】transform rotateYZ画像背景アニメーション

スクリーンショット 2020-07-27 23.43.42.png

:point_down:コードを確認する

スクリーンショット 2020-07-27 23.42.55.png

clip path polygonで2枚の画像を半々(三角形)で表示するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【ぼやけるアニメーション】clip path : polygon+filter : blur

clip-path-image-animation1.png

2. 【美しいアニメーション】clip path : polygon+filter : grayscale contrast saturate

clip-path-image-animation2.png

3. 【オーロラアニメーション】clip path : polygon+filter : grayscale saturate hue-rotate

clip-path-image-animation3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.37.32.png


【解説付き】マテリアルデザインをコピペで実装!CSSスライダーアニメーション6選(filter編)

動きは下の画像のような感じになります

1. hoverで画像が半透明に?超便利なスライダーアニメーション

click-animation-sliders-filter-opacity.png

2. hoverで画像の色が暴れ出すスライダーアニメーション

click-animation-sliders-filter-hue-rotate.png

3. hoverでモノクロ画像が200倍色鮮やかになるスライダーアニメーション

click-animation-sliders-filter-grayscale.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.42.27.png


絶対失敗しないナビゲーションメニューサンプル3選

動きは下の画像のような感じになります

1. シンプルだけど洗練されたスライダーアニメーション

click-animation-sliders.png

2. blurでぼやけながらスライドするスライダーアニメーション

click-animation-sliders2.png

3. blurとmargin-leftでぼやけながら右へスライドするスライダーアニメーション

click-animation-sliders3.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.43.47.png


hoverで画像の色が暴れ出す!filter: hue-rotateとtransitionでCSSエフェクト3選

動きは下の画像のような感じになります

1. 画像がイルミネーションみたいに光りながら回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin.png

2. 臨場感あふれる花火画像が立体的に回転するhoverエフェクト

css-effects-hover-filter-hue-rotate-spin2.png

3. 色相回転しながらぼかしアニメーションを効かせて消えていくhoverエフェクト

css-effects-hover-filter-hue-rotate-blur.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.48.16.png

CSSだけ!hoverとtransitionで作る動的画像エフェクト4選(コピペOK)

動きは下の画像のような感じになります

1. 階段のように背景が現れるhoverエフェクト

animation-image-1.png

2. 上からブロックが落ちてくるように背景が現れるhoverエフェクト

animation-image2.png

3. 斜め上からスクリーンのように背景が現れるhoverエフェクト

animation-image3.png

4. 手裏剣のように回転(rotate)しながら背景が現れるhoverエフェクト

animation-image4.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.53.25.png

hoverとtransitionでオシャレなCSS画像エフェクト4選!(背景がスっと表示される)

動きは下の画像のような感じになります

1. フワッと背景が現れるhoverアニメーション

hover-animation-image-fadein.png

2. 背景が徐々に画像全体へ広がるhoverアニメーション

hover-animation-image-box.png

3. 扉が閉まるように背景が現れるhoverアニメーション

hover-animation-image-door.png

4. 丸い背景が徐々に画像全体に広がるhoverアニメーション

hover-animation-image-squere.png

:point_down:コードを確認する

スクリーンショット 2020-07-07 17.56.56.png

【transform rotate(360deg)×flexbox】画像が回転+伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. 【縦回転】transform rotateX(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation1-228x300.png

2. 【横回転】transform rotateY(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation2-265x300.png

3. 【平面回転】transform rotateZ(360deg)×flexbox画像アニメーション

transform-rotate-flexbox-animation3-275x300.png

:point_down:コードを確認する

image-transform-rotate-flex.png

【徹底解説】flexを応用して画像が伸縮するCSSアニメーション3選

動きは下の画像のような感じになります

1. flexで2つの画像が伸縮する画像アニメーション

flex-bigger-images-animation1-265x300.png

2. flexでhoverした画像が100%拡大する画像アニメーション

flex-bigger-images-animation2-266x300.png

3. filterでエフェクト+flexで3つの画像が伸縮する画像アニメーション

flex-bigger-images-animation3-300x249.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.00.53.png

【flexboxのjustify−content:center4選】CSS画像アニメーションを画面中央に配置

動きは下の画像のような感じになります

1. 半分の背景が左右から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image1-300x74.png

2. 背景が両斜めから現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image2-300x76.png

3. 背景が上下から現れる自動ドアのようなCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image3-300x77.png

4. 半分の背景が上下から現れるCSS画像アニメーションをflexboxのjustify−content:centerで中央配置

flexbox-justify−content-animation-image4-300x77.png

:point_down:コードを確認する

スクリーンショット 2020-07-24 1.05.18.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

firebaseでデータにアクセスできなくなったらやること

firebaseのDBのルールタブをクリック。

すると以下のようなのが出てきます。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020, 7, 27);
    }
  }
}

この一番下の行に日付がありますね。

      allow read, write: if request.time < timestamp.date(2020, 7, 27);

これがDBに接続できるリミットです。

ですのでこの日付を未来の日付に設定します。

      allow read, write: if request.time < timestamp.date(2021, 7, 27);

こんなかんじです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Vue.js】コンポーネントの属性について

Vue.jsについて必要な知識をまとめました。
自身の備忘録として記載します。

コンポーネントの属性について

VueでHTMLのタグの属性に値を設定する場合に、「v-bind」というものを利用します。v-bind:○○という形で属性を指定することで、Vueオブジェクトを用意した値をコンポーネントタグの属性に指定して表示させることができます。

v-modelで値をバウンド

値を入力してその値をコンポーネントに表示します。
コンポーネントの場合は「v-model」というものを使用します。
「v-model」はinputに入力された値の値をVueのdataプロパティの値にバインドする機能になります。
入力された値を変更するとリアルタイムでバインドされた変数の値が更新されます。

<input v-model="変数名">

上記のように記述します。

v-onでバインドする

イベント関係の属性に値をバインドさせるためのもの。

v-on:イベント名="・・・処理・・・"

イベント名には、属性として用意する値から「on」を取り除いたものを使います。例えば、onclickをバインドしたいならば、v-on:clickとなります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vuetifyでよく使うJavascriptチップス

v-selectのitemsは配列のみ

image.png

しかも、text/valueというkeyの指定付き。
でもAPIから取ってきたデータはオブジェクトの場合。

取ってきたデータ

api_data = {
 "id1":"hoge",
 "id2":"huga",
 "id3":"hogehoge",
}

select_items = [
 {
  text: "hoge",
  value: "id1"
 },
 {
  text: "huga",
  value: "id2"
 },
 {
  text: "hogehoge",
  value: "id3"
 }

にする状況の場合。

select_items = Object.keys(api_data).map( key => {
 return {
  text: api_data[key],
  value: key
 }
});

for in を使うと

let select_itemse = [];
for(var key in api_data){
 select_itemse.push({
  text: api_data[key],
  value: key
 })
}

個人的にはmapを使った方がわかりやすいけど、for inは他の言語を触っている人にはわかりやすいと思う。

キーが異なる場合

下記の様なデータの場合

api_data = [
 {
  "id":"id1",
  "title":"hoge"
 },
 {
  "id":"id2",
  "title":"huga"
 },
 {
  "id":"id3",
  "title":"hogehoge"
 }
}

item-text,item-valueプロパティを使います。

image.png

<v-select 
 items="api_data"
 item-text="title"
 item-value="id"
/>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Vue.js, Express, Python】HTMLからテキストとWordファイルを自動生成する

課題、目的

今まで毎週Wordで書いてきたレポートを、最後に一つのWordファイルにまとめて提出する、という謎の課題が期末に出された。
しかし私は、Wordファイルが増えるのが嫌なので、Wordファイルで作成したレポートを、はてなブログにまとめて保存していた。
はてなブログからWordにコピペしようとしたのだが、Wordファイルの表示がaタグなどがじゃまできれいにならない。
スクリーンショット 2020-07-24 18.59.13.png
これらを手作業で直すのはあまりに億劫である。
そこで、HTMLファイルをテキストに変換すればうまくいきそう、と思い、変換サイトを見つけたが、せっかくなので自分で作ってみることにした。
ついでに、勉強と経験のために変換されたテキストを元にWordファイルを自動生成することにした。

文章が長すぎると404エラーになったり、他にもまだバグがあるかもしれないが、コードの整理をする前に頭の整理をするため、記事を書いていく。

完成形

https://github.com/wafuwafu13/Word-Creater

スクリーンショット 2020-07-27 14.06.45.png

1 デザイン

スクリーンショット 2020-07-27 12.21.14.png

2 HTML => TEXT 変換

スクリーンショット 2020-07-27 12.22.36.png

3 TEXT保存

スクリーンショット 2020-07-27 12.24.13.png

4 Wordファイル作成

スクリーンショット 2020-07-27 12.25.12.png

実装

1 デザイン

Vuetifyを用いた。

2 HTML => TEXT 変換

JavaScriptでHTMLタグを削除する正規表現 を実装した。

3 TEXT保存

保存すべきカラムは、名前(name)とテキスト(text)である。
axiosを使ってVueからExpressにクエリパラメータとして両者を送信し、ExpressからMySQLに保存することにした。
Node.jsでMySQLに接続する方法は
Node.jsアプリケーションとMySQLを接続しよう!
を参考にした。
公式はこれ。
https://github.com/mysqljs/mysql

App.vue
clickSaveBtn () {
  console.log('pushed save button')
  this.saveDialog = false

  axios
    .get('http://localhost:3000/' + this.saveFilename + '/' + this.text)
    .then(res => console.log(res))
    .catch(error => {
      console.log('error occurs in axios ' + error)
    })
},
server.js
app.get('/:name/:text', (req, res) => {
    console.log('from frontend params: name => ' + req.params.name)
    console.log('from frontend params: text => ' + req.params.text)

    connection.query({
        sql: 'INSERT INTO documents (name, text) values (?, ?)',
        values: [req.params.name, req.params.text]
    }, (error, results) => {
        console.log('↓ results from db')
        console.log(results)
    })
})

4 Wordファイル作成

まずは、MySQLにある名前(name)のデータを選択肢としてブラウザに表示させる。
この記事が参考になった。
Nuxt.jsとmysqlを連携してデータを表示してみた

App.vue
clickCreateBtn () {
    console.log('pushed create button')
    axios
      .get('http://localhost:3000/filenames')
      .then(res => {
        console.log('↓response from server')
        console.log(res.data)
        for (let i = 0; i < res.data.length; i++) {
          this.filenames.push(res.data[i].name)
        }
      })
      .catch(error => {
        console.log('error occurs in axions ' + error)
      })
},
server.js
app.get('/filenames', (req, res) => {
    let filenames = []
    connection.query('SELECT name from documents', (error, row, fields) => {
        if (error) {
            console.log('error occured in db: '+ error)
        }
        let files = []
        for (let i = 0; i < row.length; i++) {
            files.push(row[i])
        }
        filenames = JSON.stringify(files)
        res.header('Content-Type', 'application/json; charset=utf-8')
        res.send(filenames)
    })
})

なお、Node.js側でCORSポリシーを無効にしなければならないので注意。

server.js
app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

最後に、選択された名前のファイルを元に、そのファイル名とテキストをDBから取り出してWordファイルを作成していく。

PythonとMySQLを連携させるのにはmysqlclientを用いた。
この記事が参考になった。
Python3でMySQLを使う – 基本操作からエラー処理まで
公式はこれ。
https://pypi.org/project/mysqlclient/

Node.jsとPythonを連携させるのにはPython-shellを用いた。
この記事が参考になった。
Python-shellの使い方
公式はこれ。
https://www.npmjs.com/package/python-shell

PythonからWordファイルを作成する方法はこの記事が参考になった。
【python-docx】PythonでWordを操作する

App.vue
clickStartCreateBtn () {
   this.createDialog = false
   axios
      .get('http://localhost:3000/word/' + this.createFilename)
      .then(res => console.log(res))
      .catch(error => {
        console.log('error occurs in axios ' + error)
      })
}
server.js
app.get('/word/:filename', (req, res) => {
    let filename = req.params.filename
    console.log('from frontend params: filename => ' + filename)
    let { PythonShell } = require('python-shell')
    let pyshell = new PythonShell('createWord.py')

    pyshell.send(filename)

    pyshell.on('message', function (data) {
        console.log(data);
    });
})
createWord.py
filename = sys.stdin.readline()
print('filename =>', filename.strip())

con = MySQLdb.connect(
    host = os.environ.get("DB_HOST"),
    user = os.environ.get("DB_USER"),
    passwd = os.environ.get("DB_PASSWORD"),
    db = os.environ.get("DB_NAME"),
)

cur = con.cursor()
sql = "select text from documents where name = %s"
cur.execute(sql, (filename.strip(),))

rows = cur.fetchall()

document = Document()
print('text =>', rows[0][0])
text = rows[0][0]
document.add_paragraph(text)
document.save(filename.strip()+'.docx')

print('success')

まとめ

役に立つものを作りたいわけじゃなかったので、Python-shellに出会えただけで大きな収穫だった。
応用が効きそうなので気が向いたら色々試していきたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくっとVue3をプラウザで試したい時に使えるTips

Vue3がRCになっていよいよリリース間近ですね。
環境構築不要でさくっとVue3の動き確認したいなーって時に使えるTipsを紹介します。

script要素を追加し、CDNからVue3のスクリプトを読み込む

適当なサイトを開き、以下コードをプラウザのdevtoolsのconsole上で実行してください。
srcにvue-nextのCDNのアドレスを設定したscript要素を作成し、body直下に追加しています。

document.body.appendChild(
  (() => {
    const s = document.createElement("script");
    s.src = "https://unpkg.com/vue@next";
    return s;
  })()
);

スクリーンショット 2020-07-25 5.34.19.png

これでvue-nextのCDNが読み込めたので、console上でVueが使えます。
あとはやりたい放題使えばOKです。

スクリーンショット 2020-07-25 8.32.41.png

動作確認コードの一例

参考までに、自分で動かしてみたコードを紹介します。

Vueコンポーネントの動作確認

DOMを追加して、そこにVue.createApp()でVueをマウントしコンポーネントを表示しています。templatesetup()内を調整すればほとんどの動作を確認できます。

// マウント用のDOMの追加
document.body.insertBefore((() => {
  const d = document.createElement("div");
  d.id = 'vue-app';
  return d;
})(), document.body.firstChild);

// DOM要素へのVueコンポーネントのマウント
const app = Vue.createApp({
  template: `<my-component />`
})
app.component('my-component', {
  template: `
    <h1>Hello Vue3</h1>
    <input type="text" v-model="message"/>
    <div>{{ upperCase }}</div>
  `,
  setup() {
    const message = Vue.ref('')
    const upperCase = Vue.computed(() => message.value.toUpperCase())
    return {
      message,
      upperCase
    }
  }
})
app.mount('#vue-app')

yahoo! JAPANで実行してみた例
Jul-25-2020 08-27-10.gif

リアクティブの動作確認

Vue3のComposition APIのリアクティブAPIの動作確認です。refでもreactiveでも同様にリアクティブに処理を再実行してますね。

const reactiveObj = Vue.reactive({ count: 1 });
const refObj = Vue.ref(1);
const sumVal = Vue.computed(() => reactiveObj.count + refObj.value);

console.log(sumVal.value); // 2

refObj.value = 3;
console.log(sumVal.value); // 4

reactiveObj.count = 10;
console.log(sumVal.value); // 14

スクリーンショット 2020-07-25 5.43.55.png

リアクティブの消失の動作確認

Vue Composition APIを使う上で注意が必要なリアクティブの消失について動作確認です。リアクティブな値から分割代入でプリミティブな値を取得すると、リアクティブを消失するのが良くわかると思います。

const reactiveObj = Vue.reactive({
  num: 1,
  str: "hoge",
  arr: [1, 2, 3],
  obj: { foo: "foo", bar: "bar" },
});

const { num, str, arr, obj } = reactiveObj;

console.log(Vue.isReactive(num)); // false
console.log(Vue.isReactive(str)); // false
console.log(Vue.isReactive(arr)); // true
console.log(Vue.isReactive(obj)); // true

スクリーンショット 2020-07-25 6.33.28.png

終わりに

とても簡単ですが「さくっとVue3をプラウザで試したいときに使えるTips」でした。
ちょっと動きを確認したいときとかに地味に便利なので使ってみてください〜。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくっとVue3をWebブラウザで試したい時に使えるTips

Vue3がRCになっていよいよリリース間近ですね。
環境構築不要でさくっとVue3の動き確認したいなーって時に使えるTipsを紹介します。

script要素を追加し、CDNからVue3のスクリプトを読み込む

適当なサイトを開き、以下コードをWebブラウザのdevtoolsのconsole上で実行してください。
srcにvue-nextのCDNのアドレスを設定したscript要素を作成し、body直下に追加しています。

document.body.appendChild(
  (() => {
    const s = document.createElement("script");
    s.src = "https://unpkg.com/vue@next";
    return s;
  })()
);

スクリーンショット 2020-07-25 5.34.19.png

これでvue-nextのCDNが読み込めたので、console上でVueが使えます。
あとはやりたい放題使えばOKです。

スクリーンショット 2020-07-25 8.32.41.png

動作確認コードの一例

参考までに、自分で動かしてみたコードを紹介します。

Vueコンポーネントの動作確認

DOMを追加して、そこにVue.createApp()でVueをマウントしコンポーネントを表示しています。templatesetup()内を調整すればほとんどの動作を確認できます。

// マウント用のDOMの追加
document.body.insertBefore((() => {
  const d = document.createElement("div");
  d.id = 'vue-app';
  return d;
})(), document.body.firstChild);

// DOM要素へのVueコンポーネントのマウント
const app = Vue.createApp({
  template: `<my-component />`
})
app.component('my-component', {
  template: `
    <h1>Hello Vue3</h1>
    <input type="text" v-model="message"/>
    <div>{{ upperCase }}</div>
  `,
  setup() {
    const message = Vue.ref('')
    const upperCase = Vue.computed(() => message.value.toUpperCase())
    return {
      message,
      upperCase
    }
  }
})
app.mount('#vue-app')

yahoo! JAPANで実行してみた例
Jul-25-2020 08-27-10.gif

リアクティブの動作確認

Vue3のComposition APIのリアクティブAPIの動作確認です。refでもreactiveでも同様にリアクティブに処理を再実行してますね。

const reactiveObj = Vue.reactive({ count: 1 });
const refObj = Vue.ref(1);
const sumVal = Vue.computed(() => reactiveObj.count + refObj.value);

console.log(sumVal.value); // 2

refObj.value = 3;
console.log(sumVal.value); // 4

reactiveObj.count = 10;
console.log(sumVal.value); // 14

スクリーンショット 2020-07-25 5.43.55.png

リアクティブの消失の動作確認

Vue Composition APIを使う上で注意が必要なリアクティブの消失について動作確認です。リアクティブな値から分割代入でプリミティブな値を取得すると、リアクティブを消失するのが良くわかると思います。

const reactiveObj = Vue.reactive({
  num: 1,
  str: "hoge",
  arr: [1, 2, 3],
  obj: { foo: "foo", bar: "bar" },
});

const { num, str, arr, obj } = reactiveObj;

console.log(Vue.isReactive(num)); // false
console.log(Vue.isReactive(str)); // false
console.log(Vue.isReactive(arr)); // true
console.log(Vue.isReactive(obj)); // true

スクリーンショット 2020-07-25 6.33.28.png

終わりに

とても簡単ですが「さくっとVue3をWebブラウザで試したいときに使えるTips」でした。
ちょっと動きを確認したいときとかに地味に便利なので使ってみてください〜。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

v-app-barなどのコンポーネントが読み込まれないエラー

Nuxtを使っていて、vuetifyのコンポーネントが読み込まれないエラーに少しハマったので、メモがてらに書きます。

環境

・macOS Catalina バージョン10.15.5
・node v14.3.0
・npm 6.14.6
・Nuxt v2.13.3

エラー文

Unknown custom element: <v-app-bar> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

自分で作成したコンポーネントならまだわかるが、vuetifyが用意してくれてるコンポーネントが何で読み込まれないのか不思議でした。
綴りも何回も確認しました。
他にも<v-list-item>などvuetifyで用意してくれているコンポーネントが一部読み込まれないようです。

結論

package.jsonを確認すると、

package.json
"@nuxtjs/vuetify": "0.5.5"
// 他は割愛

バージョンが古いことがわかりました。
これが原因でした。

インストールできない問題

@nuxt.js/vuetifyの新しいバージョンをインストールしようとすると、インストール時にエラーが出て、インストールできない問題にぶつかりました。

gyp: No Xcode or CLT version detected!

「参考記事」に記載してある2つの記事を参考に以下を行うとインストールができるようになりました。

$ rm -rf $(xcode-select -print-path)
$ rm -rf /Library/Developer/CommandLineTools
$ xcode-select --install

筆者の方ありがとうございます。助かりました。

最後に

vuetifyのコンポーネントがないと言われるときはまずバージョンを確認する
といいですね。って当たり前でしたが、他のコンポーネントは使えていて、なかなか原因がわからなかったので備忘録的に書きました。

同じようなエラーにハマっている方の助けになれば幸いです。

参考記事

https://qiita.com/baby-0105/items/18f6fbc073e160bf83ac

https://qiita.com/hppRC/items/a01e33a5c890f7b2c125

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

v-if/v-showと$vuetify.breakpointを使ってうまくレスポンシブができなかった件

こんにちは、Yuiです。

皆さんVue.jsでスマホのみサイドメニューなどを非表示にしたい場合、どうしていますか?
多分色々とやり方があるとは思うのですが、私はいつも表示非表示の切り替えは個人的に一番楽なv-if/v-showを使っています。

そして画面サイズによって表示・非表示を切り替えるために、v-if="$vuetify.breakpoint.xs"というような形で簡単にレスポンシブを組んでいます。

今回、いつものようにv-if/v-show$vuetify.breakpointを組み合わせて表示非表示を切り替えようとしたら、うまくいかなかったので、代わりにscssで調整した方法をまとめます。

$vuetify.breakpointとは?

そもそも、$vuetify.breakpointとはどのような書き方かというと、Vuetifyでは下記のように画面サイズがあらかじめ決められており、例えばv-if="$vuetify.breakpoint.xs"と書くことで、その要素をスマホのみ表示にすることができます。

スクリーンショット 2020-07-27 6.49.14.png
Vuetifyドキュメントより

ちなみに、v-ifとv-showの切り替えは、v-ifがあまり頻繁に切り替えないとき、v-showは頻繁に表示非表示を切り替える場合に使うのが良いとされています。(v-ifの方が切り替えの際に負荷がかかる。)

今回起こった問題

まずはこちらを見てください。

ボタンが押すとサイドコンテンツが表示されますが、その後、ボタンが消えています。

ac672fcf879481c8676cba3870de29e2.gif

今回は、ヘッダーの下に紫色の「開く」のボタンを置いて、そのボタンを置くとサイドコンテンツが表示されるようにしています。

PC版では、サイドコンテンツはデフォルトで表示をしているため、このボタンは表示する必要がありません。
なので、スマホでのみ表示にするためにこのように書きました。

App.vue
<v-btn v-if="$vuetify.breakpoint.xs"
 color="purple"
 dark
 @click.stop="drawer = !drawer"
>
   開く
</v-btn>

〜〜〜〜
<v-navigation-drawer
 v-model="drawer"
 absolute
 right
>
 <SideComment/>
</v-navigation-drawer>

※サイドコンテンツはページをわけて、SideComment.vueとして作っています。

表示を見ると、上記の通りボタンは無事スマホでのみ表示されるものの、一度しか押せなくなってしまいました。ちなみに、今回はPCとスマホは頻繁に切り替わることもないとv-ifを使っているのですが、v-showを使っても一度きりしか押せないのは変わりませんでした。

どうやらv-if/v-show@clickの動きは併用できないようです。
※もし併用できる方法を御存知の方はひっそりと私に耳打ちしてください。笑
(少なくとも色々と調べた限りでは、v-if/v-show@clickの動きを併用するのはあまり一般的ではないようでした。)

どうしたか

v-if/v-showが使えないとなると、scssでdisplay設定をするしかありません。
ということで、下記

App.vue
<v-btn v-if="$vuetify.breakpoint.xs"
 class="sp-visible"
 color="purple"
 dark
 @click.stop="drawer = !drawer"
>
   開く
</v-btn>

〜〜〜〜
<style lang="scss" scoped>
 $pc-min: 960px;
 @mixin display_pc {
   @media (min-width: $pc-min) {
     @content;
   }
 }
 .sp-visible {
   @include display_pc {
     display: none !important;
   }
 }
</style>

クラス名をつけて、そこにscssを適用させています。
@mixinははじめて使ったのですが、かなり便利でした。(参考:Sassの「@mixin(ミックスイン)」の使い方と「引数」の解説

今回はタブレットの表示はとりあえずおいておいて、とりあえずPCでのみ非表示にすることが目的だったので、このようなざっくりとしたブレイクポイントで設定しました。

完成形

2f59efbbac9bb0ed978667ecc19c5f8a.gif

このような感じで、ボタンは押しても消えなくなったので、とりあえずは成功です。

もちろん、このままではまだまだレスポンシブとして不完全なので、引き続きレイアウトは整えますが、とりあえずは目標達成です!やったね!

今回@mixinにかなり感動したので、またまとめたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelとVueを使ってモダンなWebアプリケーションを構築する

Build a modern web application with Laravel and Vue

上記のリンク通りに進めていきますが、LaravelやVueなどは最新版にします。最終的にはTrelloのクローンアプリを作ります。
laravel-vue-trello-clone-app-preview.gif
※画像は転載元より引用
少しずつ加筆していきます。自分用のメモなので、解説は少なめです。関係ないところは飛ばしていきます。

Part 1: Setting up your environment(https://blog.pusher.com/web-application-laravel-vue-part-1/)

記事ではMacでの環境構築が紹介されていますが、Windowsで環境構築を行います。

Prerequisites

このシリーズに沿って進むためには、以下のものが必要です。

  • PHPの知識。
  • Laravelフレームワークの基本的な知識
  • JavaScriptとVueフレームワークの知識
  • Node.js **とNPMの基本的な知識

Setting up for PHP development: installing composer

Installing Composer on Windows

Composer-Setup.exeをダウンロードして実行してください。最新のComposerをインストールし、ターミナル内の任意のディレクトリからComposerを呼び出すことができるようにPATHを設定します。
完了したら次のコマンドを実行して確認をします。

shell
$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.7 2020-06-03 10:03:56

環境構築

Xamppにて環境構築を行います。以下のコマンドを実行します。

shell
$ cd C:\xampp\htdocs
$ composer create-project laravel/laravel trello-clone --prefer-dist
$ cd ./trello-clone

詳しい解説が必要な方は、以前に書いたこちらの記事を参考にしてみてください。

Laravelのタイムゾーンと言語設定

config/app.php
70行目 'timezone' => 'Asia/Tokyo',
83行目 'locale' => 'ja',

データベースの設定

xamppからphpMyAdminを起動してデータベースとユーザーを設定し、設定した情報を「.env」ファイルに書きこみます。
データベース名はフォルダ名と同一にしておくと後から見やすいので、今回はtrello-clone という名前で作成しました。

.env
4行目 DB_CONNECTION=mysql
5行目 DB_HOST=127.0.0.1
6行目 DB_PORT=3306
7行目 DB_DATABASE=trello-clone
8行目 DB_USERNAME=ユーザー名
9行目 DB_PASSWORD=パスワード

Useful Laravel CLI commands

make コマンドは最もよく使うコマンドです。これを使うと、アプリケーション用のさまざまな種類のコンポーネントを作成することができます。このコマンドを使って、モデル、コントローラ、データベースの移行、その他このシリーズでは取り上げないものを作成することができます。

app/ディレクトリに作成される新しいモデルクラスを作成するには、次のコマンドを実行します。

shell
$ php artisan make:model SampleModel

app/Http/Controller/ディレクトリに作成される新しいコントローラクラスを作成するには、次のコマンドを実行します。

shell
$ php artisan make:controller SampleController

データベース/migrations/ディレクトリに作成される新しいデータベースマイグレーションクラスを作成するには、次のコマンドを実行します。

shell
$ php artisan make:migration create_sample_table

先に生成したマイグレーションを使用してデータベースに変更をマイグレーションするには、次のコマンドを実行します。

shell
$ php artisan migrate

本当にシンプルなLaravelアプリケーションでは、これらのコマンドを使用することになるでしょう。これらのコマンドについては、アプリケーションを進めていくうちにさらに詳しく知ることができます。コンソールのドキュメントもチェックしてみてください。

Installing and configuring dependencies (Passport)

これから作るアプリケーションはAPIベースのものになるので、認識されたユーザーだけがアクセスできるようにAPIをセキュアにする方法が必要です。

Installing Laravel Passport

Laravel PassportはAPI認証のためのツールです。Passportは認証を簡単にし、数分でLaravelアプリケーションにOAuth2サーバーの完全な実装を提供します。
Passportをインストールするには、以下のコマンドを実行します。

shell
$ composer require laravel/passport

API Auth using Laravel Passport

Laravel Passportを使った認証についての詳細な記事がここにあります。このシリーズの次のパートに進む前に一読しておくと、Laravel Passportに慣れるのに役立ちます。

Conclusion

このパートでは、最新のWebアプリケーションを構築するための開発環境の設定方法を考えました。次のパートでは、Laravelアプリケーションを構築し、構築中に知っておくべき概念を説明します。

アプリケーションの構築を進めていくうちに、VueとLaravelを使って最新のアプリケーションを構築するために、どのようにすべてのツールを組み合わせることができるかがわかるでしょう。

Part 2 : Creating our endpoints with REST in mind

Building the models

Trello-cloneでは3つもモデルを使いますが、後から見やすくなるのでモデルはModelフォルダにまとめます。

Userモデル

まずapp/Model を作成して、その中にUserモデル:app/User.php
を移動し、app/Model/User.php になるように変更します。
次に以下のファイルを書き換えます。

app/Model/User.php
3行目 namespace App; => namespace App\Model;
config/app.php
71行目 'model' => App\User::class, => 'model' => App\Model\User::class,
database/factories/User.php
5行目 use App\User; => use App\Model\User;

Taskモデル、Categoryモデル

以下のコマンドを実行して、-mr オプションを利用してモデルとMigrationファイルを同時に作成します。

shell
$ php artisan make:model Model/Task -mr
$ php artisan make:model Model/Category -mr

The User model

Laravelにはデフォルトのユーザーモデルがバンドルされているので、ユーザーモデルを作成する必要はありません。ユーザーモデルは以下のフィールドを持ちます。

  • id - ユーザーのユニークなオートインクリメントID
  • name - ユーザーの名前
  • email - ユーザーのE-mail
  • password - 認証に使用されるパスワード

Userモデルを開き、以下のように編集します。

app/Model/User.php
<?php

namespace App\Model;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Authenticatable
{
  use SoftDeletes, Notifiable;

  protected $fillable = ['name', 'email', 'password'];

  protected $hidden = [
    'password', 'remember_token',
  ];

  public function tasks()
  {
    return $this->hasMany(Task::class);
  }
}

? A fillable column
代入可能なデータベースカラムのことです。つまり、代入したいデータをモデルのcreate関数に配列を渡すだけで代入できるということです。

? SoftDeletes
データベースから実際にデータを削除せずにリソースを削除する方法です。テーブルが作成されると、'deleted_at'というフィールドができ、ユーザーがタスクを削除しようとすると、'deleted_at'フィールドには削除した日付時刻が入力されます。そのため、リソースの取得が行われた場合、'deleted'リソースはレスポンスの一部にはなりません。

Task model

タスクモデルは以下のフィールドを持ちます。

  • id - タスク自体のID
  • name - タスクの名前
  • category_id - タスクが属するカテゴリのID
  • user_id - タスクが所属するユーザーのID

- order - それぞれのカテゴリ内でのタスクの順番

Taskモデルを以下のように編集します。

app/Model/Task.php
<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Task extends Model
{
  use SoftDeletes;

  protected $fillable = ['name', 'category_id', 'user_id', 'order'];

  public function category()
  {
    return $this->hasOne(Category::class);
  }

  public function user()
  {
    return $this->belongsTo(User::class);
  }
}

Category model

カテゴリモデルには以下のフィールドがあります。

  • id - カテゴリのID
  • name - カテゴリの名前

Categoryモデルを以下のように編集します。

app/Model/Category.php
<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Category extends Model
{
  use SoftDeletes;

  protected $fillable = ['name'];

  public function tasks()
  {
    return $this->hasMany(Task::class);
  }
}

Writing our migrations

Migrationファイルを以下のように編集します。

Updating our user migration

database/migrations/2014_10_12_000000_create_users_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
        Schema::table('flights', function (Blueprint $table) {
            $table->dropSoftDeletes();
        });
    }
}

Updating our category migration

database/migrations/XXXX_XX_XX_XXXXXX_create_categories_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
        Schema::table('categories', function (Blueprint $table) {
            $table->dropSoftDeletes();
        });
    }
}

Creating our task migration

外部キーの書き方が変更になっているの(参考リンク)で、チュートリアルとは異なります。

database/migrations/XXXX_XX_XX_XXXXXX_create_tasks_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTasksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->foreignId('user_id')->constrained();
            $table->foreignId('category_id')->constrained();
            $table->integer('order');
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tasks');
        Schema::table('tasks', function (Blueprint $table) {
            $table->dropSoftDeletes();
        });
    }
}

ファイルの並びを確認する

create_tasks_table.phpusers テーブルのIDとcategories テーブルのIDを外部キーとして使用するため、先にusers テーブルとcategories テーブルを作成しないと以下のようなエラーが起こります。

SQLSTATE[HY000]: General error: 1005 Can't create table `trello-clone`.`tasks`
(errno: 150 "Foreign key constraint is incorrectly formed")
(SQL: alter table `tasks` add constraint `tasks_category_id_foreign` 
foreign key (`category_id`) references `categories` (`id`))

エラーを回避するためにはdatabase/migratsions フォルダのファイルが以下のようにcreate_tasks_table.php が一番最後にあるかどうか確認します。

2014_10_12_000000_create_users_table.php
2019_08_19_000000_create_failed_jobs_table.php
XXXX_XX_XX_XXXXXX_create_categories_table.php
XXXX_XX_XX_XXXXXX_create_tasks_table.php

create_tasks_table.php が一番最後にない場合は、一番最後になるようにファイル名を変更します。
次に以下のコマンドを実行してMigrateします。

shell
$ php artisan migrate

? Migrationsはデータベースのバージョン管理のようなものです。これにより、アプリケーションの進化に合わせてデータベースを作成、変更、削除することができ、SQLクエリ(または任意のデータベースが使用するクエリ)を手動で記述する必要がありません。また、あなたとあなたのチームがアプリケーションのデータベーススキーマを簡単に変更して共有することができます。詳細はこちらをご覧ください。

Database seeders

データベースの移行ができたので、アプリケーションをテストするときのためにダミーデータを入れる方法を見てみましょう。Laravelでは、シーダと呼ばれるものがあります。

? シーダーを使うと、ダミーデータを自動的にデータベースに挿入することができます。

Creating our users table seeder

データベースシーダを作成するには、次のコマンドを入力します。

shell
$ php artisan make:seeder UsersTableSeeder

これにより、database/seeds/UsersTableSeeder.php ファイルが作成されます。ファイルを開き、内容を以下のコードに置き換えてください。

database/seeds/UsersTableSeeder.php
<?php

use App\Model\User;
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        User::create([
            'name' => 'John Doe',
            'email' => 'demo@demo.com',
            'password' => bcrypt('secret'),
        ]);
    }
}

run関数には、シーダの実行時に実行したいデータベースクエリが含まれています。

? model factoriesを使用して、より良いシードデータを作成することができます。

? 保存する前にパスワードをハッシュするためにbcryptを使用していますが、これはLaravelがパスワードをハッシュするために使用するデフォルトのハッシュアルゴリズムだからです。

Creating our categories table seeder

データベースシーダを作成するには、次のコマンドを入力します。

shell
$ php artisan make:seeder CategoriesTableSeeder

これにより、database/seeds/CategoriesTableSeeder.php ファイルが作成されます。ファイルを開き、内容を以下のコードに置き換えてください。

database/seeds/UsersTableSeeder.php
<?php

use App\Model\Category;
use Illuminate\Database\Seeder;

class CategoriesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $categories = ['Ideas', 'On Going', 'Completed'];

        foreach ($categories as $category) {
            Category::create(['name' => $category]);
        }
    }
}

Running our database seeders

データベースシーダを実行するには、database/seeds/DatabaseSeeder.php ファイルを開き、runメソッドを以下のコードに置き換えます。

database/seeds/DatabaseSeeder.php
public function run()
{
    $this->call([
        UsersTableSeeder::class,
        CategoriesTableSeeder::class,
    ]);
}

次に以下のコマンドを実行します。

shell
$ php artisan db:seed

これでデータベースがデータで更新されるはずです。ある時点でデータをリフレッシュして再度シードしたい場合は、以下のコマンドを実行してください。

shell
$ php artisan migrate:fresh --seed

これはデータベースのテーブルを削除し、それらを元に戻してシーダを実行します。

REST in a nutshell

技術的な用語では、RESTはREpresentational State Transferの略です(他の場所では、単に「リラックスする」という意味です)。この記事をよく理解するために、一口サイズのナゲットに分解する必要がある用語がいくつかあります。

Clients, statelessness, resources – what’s the relationship?

クライアントClients とは、アプリケーションと関わるデバイスのことです。どんなアプリケーションでも、それを操作するクライアントの数は 1 から数十億にもなります。あなたがウェブサイト (https://pusher.com など) にアクセスすると、クライアントはサーバーにリクエストを送信します。サーバーはあなたのリクエストを処理してから、クライアントに応答を送り返し、相互作用を行います。

ステートレスStatelessness とは、最も簡単に言えば、クライアントがすべてのリクエストを完了するために必要なものをすべて持っているような方法でアプリケーションを構築することを意味します。クライアントがそれ以降のリクエストを行うとき、サーバはクライアントに関連するデータを保存したり取得したりしません。アプリケーションがより多くのアクティブな同時使用ユーザを持つようになると、クライアントの状態を管理するサーバに不必要な負担がかかるようになります。ステートレスであることはアプリケーションの設計をシンプルにします。

リソースResources は、コード内の実際のインスタンスを表現したものです。例えば、学生が自分の成績をチェックできるアプリケーションを構築しているとします。これらのリソースは、データベースに保存されるデータとリンクされています。

RESTfulアプリケーションを構築するとき、サーバーはクライアントにリソースへのアクセス権を与えます。クライアントは、リソースを取得、変更、削除するためのリクエストを行うことができます。リソースは通常JSONやXML形式で表現されますが、他にも多くの形式があり、どの形式にするかは実装中に決めることができます。

Creating your first few REST endpoints

エンドポイントの作成を始める前に、REST リソースの命名のベストプラクティスに精通していることを確認してください。

現在、以下の HTTP 動詞を使用しています。

  • GET - 通常はリソースを取得するために使用します。
  • POST - 新しいリソースを作成するために使用します。
  • PUT/PATCH - 既存のリソースを置換/更新するために使用します。
  • DELETE - リソースを削除するために使用する

以下は、タスクリソースの REST エンドポイントがどのように見えるかを表形式で表したものです。

METHOD ROUTE FUNCTION
POST /api/task Creates a new task
GET /api/task Fetches all tasks
GET /api/task/{task_id} Fetches a specific task
PUT/PATCH /api/task/{task_id} Update a specific task
DELETE /api/task/{task_id} Delete a specific task

それでは、アプリケーションでルートの作成を始めましょう。routes/api.phpファイルを開き、更新します。

routes/api.php
Route::resource('/task', 'TaskController');
Route::get('/category/{category}/tasks', 'CategoryController@tasks');
Route::resource('/category', 'CategoryController');

上記では、ルートを定義しました。2つのルートがあり、それらを手動で作成しなくても他のすべてのルートを登録してくれます。リソースコントローラとルートについてはこちらをご覧ください。

Formatting responses and handling API errors

ここでは、リクエストが処理されたときのレスポンスの作成方法とフォーマットについて見ていきましょう。

Creating our controllers

ルートができたので、すべてのリクエストを処理するコントローラロジックを追加する必要があります。コントローラを作成するには、ターミナルで以下のコマンドを実行する必要があります。

shell
$ php artisan make:controller NameController

しかし、先ほどの-mrを使った時にリクエストを作成しているので、それを編集してみましょう。

app/Http/Controller/ディレクトリ内のTaskController.phpを開きます。その中で、先ほど作成したルートを処理するための基本的なメソッドを定義します。
ファイル内のストアメソッドを以下のように更新します。

app/Http/Controller/TaskController.php
public function store(Request $request)
{
    $task = Task::create([
        'name' => $request->name,
        'category_id' => $request->category_id,
        'user_id' => $request->user_id,
        'order' => $request->order
    ]);

    $data = [
        'data' => $task,
        'status' => (bool) $task,
        'message' => $task ? 'Task Created!' : 'Error Creating Task',
    ];

    return response()->json($data);
}

? 16行目で、レスポンスがJSON形式に設定されていることがわかります。データをどのようなレスポンス形式で返したいかを指定することができますが、ここではJSONを使用します。

⚠️ まだアプリケーションの肉付けには力を入れていません。RESTfulエンドポイントを作成する方法を説明しています。後編ではコントローラを完全に作成していきます。

Securing our endpoints with Passport

ルートを作成しましたが、今のままでは誰でもアクセスできてしまうので、制限をかけて安全にしていきます。

Laravelは、デフォルトでWebルートとAPIルートをサポートしています。WebルートはWebブラウザからアクセスした動的に生成されたページのルーティングを処理し、APIルートはJSONまたはXML形式のレスポンスを必要とするクライアントからのリクエストを処理します。

Authentication and authorization (JWT) to secure the APIs

Part 1 では、Laravel Passportを使ったAPI認証について説明しているので、簡単にまとめます。

まず、Laravel Passportをインストールします。

shell
$ composer require laravel/passport

Laravel Passportには、動作に必要なデータベーステーブル用のMigrateファイルが付属しているので、実行します。

shell
$ php artisan migrate

次に、アプリケーションを保護するために必要なキーを作成できるように、パスポートのインストールするコマンドを実行します。

shell
$ php artisan passport:install

このコマンドは、セキュアなアクセストークンを生成するために必要な暗号化キーに加えて、アクセストークンを生成するために使用される「個人アクセス」と「パスワード付与」クライアントを作成します。

インストール後、UserモデルでLaravel Passport HasApiToken trait を使用する必要があります。この特性はモデルにいくつかのヘルパーメソッドを提供し、認証済みユーザーのトークンとスコープを検査できるようにします。

app/Model/User.php
<?php

[...]

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, SoftDeletes, Notifiable;

    [...]
}

次に、AuthServiceProviderのブートメソッド内のPassport::routesメソッドを呼び出します。このメソッドは、アプリが必要とするトークンを発行するために必要なルートを登録します。

app/Providers/AuthServiceProvider.php
<?php

[...]

use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    [...]

    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }

    [...]
}

最後に、config/auth.phpの設定ファイルで、API認証ガードのドライバオプションをpassportに設定します。

config/auth.php
[...]

'guards' => [
    [...]

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

[...]

Log in and register using the API

Laravel Passportを使ってこのアプリケーションのAPI認証を設定したところで、ログインと登録のエンドポイントを作っていきます。

routes/api.php ファイルに以下のルートを追加します。

routes/api.php
Route::post('login', 'UserController@login');
Route::post('register', 'UserController@register');

また、APIの認証リクエストを処理するためのUserControllerを作成する必要があります。app/Http/Controllers/UserController.php というファイルを新規作成し、その中に以下のコードを配置します。

app/Http/Controllers/UserController.php
<?php

namespace App\Http\Controllers;

use App\Model\User;
use Validator;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class UserController extends Controller
{
    public function login()
    {
        $credentials = [
            'email' => request('email'),
            'password' => request('password')
        ];

        if (Auth::attempt($credentials)) {
            $success['token'] = Auth::user()->createToken('MyApp')->accessToken;

            return response()->json(['success' => $success]);
        }

        return response()->json($response, $status);
    }

    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => $validator->errors()], 401);
        }

        $input = $request->all();
        $input['password'] = bcrypt($input['password']);

        $user = User::create($input);
        $success['token'] = $user->createToken('MyApp')->accessToken;
        $success['name'] = $user->name;

        return response()->json(['success' => $success]);
    }

    public function getDetails()
    {
        return response()->json(['success' => Auth::user()]);
    }
}

上のコードでは

Login Method: ここでは、ユーザが提供した認証情報を使って Auth::attempt を呼び出しています。認証に成功した場合は、アクセストークンを作成してユーザに返します。このアクセストークンは、ユーザがAPIにアクセスできるようにするために、すべてのAPIコールと一緒に送信するものです。

Register Method: ログインメソッドと同様に、ユーザー情報を検証し、ユーザーのアカウントを作成し、ユーザーのアクセストークンを生成します。

Grouping routes under a common middleware

ルートについては、認証が必要なルートを共通のミドルウェアの下にグループ化することができます。Laravelにはauth:apiミドルウェアが組み込まれているので、それを使っていくつかのルートを保護することができます。

routes/api.php
<?php

Route::post('login', 'UserController@login');
Route::post('register', 'UserController@register');

Route::group(['middleware' => 'auth:api'], function(){
    Route::resource('/task', 'TasksController');
    Route::resource('/category', 'CategoryController');
    Route::get('/category/{category}/tasks', 'CategoryController@tasks');
});

Handling API errors

サーバーがリソースを提供したり操作したりしているときにエラーが発生した場合、クライアントに何か問題が発生したことを伝える方法を実装しなければなりません。そのためには、特定のHTTP ステータスコードでレスポンスを提供しなければなりません。

UserController.php ファイルを見ると、HTTPステータスコード401を実装しているのがわかります。

Conclusion

このシリーズのこの部分では、アプリケーション用の RESTful エンドポイントをどのように作成するかを考えてきました。また、どのようにしてエラーを処理し、正しいHTTPステータスコードをクライアントに提供するかについても検討しました。

次の章では、Postmanを使ってAPIエンドポイントをテストする方法を取り上げます。コマンドラインからのテストに役立つユニットテストをいくつか設定します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

vue でコンポーネントを作るときのファイル構成のモヤモヤを解決したい

事の発端

現在仕事ではangular を使用して悪戦苦闘しながら社内webシステムを作っています。
angularで好きだなーと思う中で、コンポーネントのファイル構成が自分の中でスッキリしています。

何がスッキリしているかというと、コンポーネントを作ると
以下のようにファイルがはっきり分かれるのが好き。

hoge.component.html
hoge.component.css
hoge.component.ts

vue-cliで作るとこの全部がvueファイルの中に全部入りになってしまうのが
自分の中でモヤモヤしてました。
※ 自分が知らないだけ?

そんなときに、別のことをgithubで調べていると
anlularのような構成 で作っている方がいて、おぉぉぉ!コレだ!と思いました。

そんでもって毎回作るのは大変なので、以下のようなボイラープレートを作成して、これから使っていこうと思っています。

仕組み

難しいことはできないので、以下のような構成を事前に準備。

$ tree ./boilerplate/
./boilerplate/
├── Template.component.css
├── Template.component.html
├── Template.component.vue
└── Template.component.vue.ts

css、htmlは空ファイルでおいておくとして、vue、vue.tsファイルは一応
以下のようにしておきます。

Templete.component.vue
<template src="./{{ Template }}.component.html"></template>
<style scoped src="./{{ Template }}.component.css"></style>
<script lant="ts" src="./{{ Template }}.component.vue.ts"></script>
Templete.component.vue.ts
import { Component, Vue, Prop, Emit } from "vue-property-decorator";

@Component
export default class {{ Template }}Component extends Vue {
  constructor() {
    super();
  }
}

ボイラープレートが出来たところで、以下のようなスクリプトを準備します。

make_component.sh
#!/bin/bash
compname=$1

cp -r ./boilerplate ./src/components/${compname}

exts=(css html vue vue.ts)
for ext in ${exts[@]}; do
  mv ./src/components/${compname}/Template.component.${ext} \
     ./src/components/${compname}/${compname}.component.${ext}
done

exts=(vue vue.ts)
for ext in ${exts[@]}; do
  filepath=./src/components/${compname}/${compname}.component.${ext}
  sed -ri "s/[{]{2} ?Template ?[}]{2}/${compname}/g" ${filepath}
done

このスクリプトを以下のように実行してやると

$ ./make_component.sh Hoge
$ tree ./src/components/
./src/components/
├── Hoge
│   ├── Hoge.component.css
│   ├── Hoge.component.html
│   ├── Hoge.component.vue
│   └── Hoge.component.vue.ts

$ cat ./src/components/Hoge/Hoge.component.vue
<template src="./Hoge.component.html"></template>
<style scoped src="./Hoge.component.css"></style>
<script lant="ts" src="./Hoge.component.vue.ts"></script>

$ cat ./src/components/Hoge/Hoge.component.vue.ts
import { Component, Vue, Prop, Emit } from "vue-property-decorator";

@Component
export default class HogeComponent extends Vue {

  constructor() {
    super();
  }

}

自分の中ではかなりスッキリ。超自己満足。

ここまでお付き合いしていただきありがとうございます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む