OSSANS Project since 2020

「もし四十のおっさんがプログラミングを始めたらどう人生変わるのか」
このブログのメインテーマです
肩肘張らずにユルく、ときたま厳しくやっていきます
※プログラミング以外のことも書きます

JavaScript

2023.03.04(更新)

【実例コードあり】覚えておきたいパララックスデザインの3つの基本

アイキャッチ画像
JavaScript

パララックスデザインを作りたいけど、どうしたらいいのかイマイチわからない…

こんな悩みに答えていきます。

本記事の内容

  • パララックスデザインの基本と実例コード

本記事を対象とする方

  • Webデザイナーを目指す方

この記事を書いている僕はプログラミング歴2年7ヶ月です。webエンジニアとして”社内転職”しました。

パララックスとはなにか?

パララックスとはなにか?まずはここから始めましょう。

Webページデザインにパララックス効果を取り入れると以下のようなメリットがあります。

  • 訪問ユーザーに先進的なイメージを与え、好意を持ってもらえる
  • 様々な視覚効果でユーザーを飽きさせず、ページ滞在時間を長くできる

ある問題があったとして、その問題を解決するためにデザインの力を使う。これこそがデザインの本質だと思うので、ユーザーが中々定着しないなどの問題を抱えている場合は有効な手法と言えそうです。

ところでパララックスとは何のことでしょうか?
パララックスとは「視差」と訳され、視差を利用した視覚効果を付与したデザインレイアウト設計のことを、パララックスデザインと呼びます。

この説明では、「ふーん…」、みたいなリアクションになりますよね。百聞は一見にしかずということで、実例を紹介します。非営利目的のWEBデザインポータルサイト、MUUUUU.ORG(ムーオルグ)さんが、パララックスデザインを取り入れたwebサイトをたくさん紹介してくれています。とても参考になるので、「パララックスってなによ?」、という方は是非ご覧ください。

ご覧頂ければわかるかと思いますが、パララックスデザインはブラウザのスクロール機能をトリガーにして発生させるアニメーションが肝となります。僕は色んなサイトを眺めていて、そのアニメーションの完成度にワクワクし、魅せられました。ただ、眺めていて気付いたんですが、肝となるアニメーションは基本3つで、その組み合わせでパララックスデザインが表現されているようでした。その気付きを次章以降で一つずつ説明していきます。

なお、本記事で紹介する実例コードはJavaScriptライブラリの「lax.js」を使用しました。Githubで詳細は確認ができますが、英語が苦手な方は下記サイトをご覧頂くと良いかと思います。丁寧に日本語で解説されています。

レイヤー

最初はレイヤーの説明です。パララックスの基本かつ最重要項目です。

レイヤー「Layer」とは階層のことです。webページにおいては、いくつかの要素を重ね合わせることで奥行き感を出すことができます。例えばこんなレイアウトがあったとします。

サンプルイメージ
※なんてことないレイアウトです

これを階層に分けると以下のイメージ。

レイヤーイメージ
※要素を階層構造で設計します

レイヤーはあらゆるデザインの基本中の基本ですので、まずはこの構造を理解しましょう。Webページ特有のパララックス効果を与えるには、スクロール量や座標位置の値を利用し、その値を元に各レイヤーの要素を動かします。

基本、JavaScriptを使い要素を動かしますが、HTML&CSSのみで作成できるレイヤー操作もあります。下記デモページをご覧ください。

これは、背景画像を表示する領域をブラウザのウィンドウ枠いっぱいで固定し、その枠の中でレイヤーを順番に重ねる手法です。ビューポートの表示領域の固定とレイヤーの重なりがギャップとなり「視差」を作る仕組みとなっています。これはCSSのbackground-attachmentプロパティを設定しているためです。background-attachmentは、ブラウザのウィンドウ内に背景画像を固定表示させるためのプロパティでして、background-imageとセットで使用する必要があります。手軽に実装できるため多くのサイトで利用されています。

コードは下記の通りです。

【HTML】

  1. <section class="layer">
  2.   <h2>01.<span>Layer</span></h2>
  3.   <div class="panel">
  4.     <figure></figure>
  5.     <div class="title_desc">
  6.       <h3>FOOTBALL</h3>
  7.       <P>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</P>
  8.     </div>
  9.   </div>
  10.   <div class="panel">
  11.     <figure></figure>
  12.     <div class="title_desc">
  13.       <h3>SURF</h3>
  14.       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  15.     </div>
  16.   </div>
  17.   <div class="panel">
  18.     <figure></figure>
  19.     <div class="title_desc">
  20.       <h3>CAMP</h3>
  21.       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  22.     </div>
  23.   </div>
  24.   <div class="panel">
  25.     <figure></figure>
  26.     <div class="title_desc">
  27.       <h3>RUNNING</h3>
  28.       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  29.     </div>
  30.   </div>
  31. </section>

【CSS】

  1. section h2 {
  2.   font-size: 6rem;
  3.   padding: 1rem;
  4. }
  5. section h2 span {
  6.   font-size: 7rem;
  7. }
  8. .layer {
  9.   margin-top: 0;
  10. }
  11. .layer .panel {
  12.   height: 100vh;
  13.   position: relative;
  14. }
  15. .layer .panel figure {
  16.   background-attachment: fixed;
  17.   background-repeat: no-repeat;
  18.   background-size: cover;
  19.   background-position: center;
  20.   height: 100%;
  21.   position: absolute;
  22.   left: 0;
  23.   top: 0;
  24.   width: 100%;
  25.   z-index: -1;
  26. }
  27. .layer .panel .title_desc {
  28.   color: #000000;
  29.   margin-left: auto;
  30.   max-width: 40ch;
  31. }
  32. .layer .panel .title_desc h3 {
  33.   font-size: 3rem;
  34.   padding-top: 2rem;
  35. }
  36. .layer .panel .title_desc p {
  37.   font-size: 1rem;
  38.   padding-top: 1rem;
  39. }
  40. .layer .panel:first-of-type figure {
  41.   background-image: url(../images/parallax/parallax1-min.jpg);
  42. }
  43. .layer .panel:nth-of-type(2) figure {
  44.   background-image: url(../images/parallax/parallax2-min.jpg);
  45. }
  46. .layer .panel:nth-of-type(3) figure {
  47.   background-image: url(../images/parallax/parallax3-min.jpg);
  48. }
  49. .layer .panel:nth-of-type(4) figure {
  50.   background-image: url(../images/parallax/parallax4-min.jpg);
  51. }
  52. .layer .panel:nth-of-type(odd) .title_desc {
  53.   color: #ffffff;
  54.   margin-left: 0;
  55.   margin-right: auto;
  56.   padding-left: 2rem;
  57. }
  58. .layer .panel:nth-of-type(even) {
  59.   padding-right: 2rem;
  60. }

続いてこちらのデモページをご覧ください。

見出しとディスクリプションのポジションの位置をスクロールする毎に上に動かしています。一方、画像は固定したままで動きはありません。この動きのギャップが「視差」を生み出すレイヤー操作です。このレイヤー操作は基本中の基本と言えます。簡単にまとめると…

  • 要素をレイヤー分け
  • 動かす要素と動かさない要素を作る
  • 「視差」が生まれる

このような考え方になります。階層を増やしたり、要素の動きによって色々なデザインパターンが表現可能ですね。以下サンプルコードです。

【HTML】

  1.   <div id="programming" class="panel">
  2.     <figure></figure>
  3.     <div class="title_desc layer_programming">
  4.       <h3>PROGRAMMING</h3>
  5.       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  6.     </div>
  7.   </div>

【CSS】

  1. .layer {
  2.   margin-top: 0;
  3. }
  4. .layer .panel {
  5.   height: 100vh;
  6.   position: relative;
  7. }
  8. .layer .panel figure {
  9.   background-attachment: fixed;
  10.   background-repeat: no-repeat;
  11.   background-size: cover;
  12.   background-position: center;
  13.   height: 100%;
  14.   position: absolute;
  15.   left: 0;
  16.   top: 0;
  17.   width: 100%;
  18.   z-index: -1;
  19. }
  20. .layer .panel .title_desc {
  21.   color: #000000;
  22.   margin-left: auto;
  23.   max-width: 40ch;
  24. }
  25. .layer .panel .title_desc h3 {
  26.   font-size: 3rem;
  27.   padding-top: 2rem;
  28. }
  29. .layer .panel .title_desc p {
  30.   font-size: 1rem;
  31.   padding-top: 1rem;
  32. }
  33. .layer .panel:nth-of-type(5) {
  34.   height: 125.2vh;
  35. }
  36. .layer .panel:nth-of-type(5) figure {
  37.   background-image: url(../images/parallax/parallax5-min.jpg);
  38. }

【JavaScript】

  1. import './lax.js/lib/lax.min.js';
  2. {
  3.   window.addEventListener('load', () => {
  4.     lax.init();
  5.     lax.addDriver('scrollY', function() {
  6.       return window.scrollY;
  7.     },
  8.     {
  9.       inertiaEnabled : true,
  10.       frameStep : 2
  11.     });
  12.     lax.addElements(
  13.       '.layer_programming', {scrollY : {translateY : [['elInY','elOutY'],[200, 0],{inertia: 3}]}},
  14.     );
  15.   });
  16. }

先程も説明しましたが、JavaScriptは「lax.js」というライブラリを使用しています。使い方はGithub(英語)か、英語が苦手な方は下記サイトでご確認ください。

サイズ

続いてサイズです。主にフォントや図形の拡大縮小で使用されることが多いです。

サイズもやはりスクロールをトリガーにして要素の拡大縮小を行なっていきます。百聞は一見にしかず。まずはデモページをご覧ください。

スクロールするたびにイラストが拡大縮小したかと思います。これは取得したスクロール量を図形の大きさに割り当てているだけです。ここで大事になるのが初期値の設定と、拡大縮小を止める閾値です。閾値をちゃんと設定しないと意図しない「視差」が出来てしまい、場合によってはユーザーを不快にさせるかもしれません。以下、サンプルコードです。

【HTML】

  1. <section class="size">
  2.   <h2>02.<span>SIZE</span></h2>
  3.   <div class="center">
  4.     <div class="ufo"><img src="images/parallax/ufo1.svg" alt=""></div>
  5.     <div class="man"><img src="images/parallax/takeawayman.svg" alt=""></div>
  6.   </div>
  7. </section>

【CSS】

  1. .size .center {
  2.   max-width: none;
  3.   padding-top: 3rem;
  4.   background: linear-gradient(180deg, rgb(161, 161, 161) 0%, rgb(255, 255, 255) 100%);
  5. }

【JavaScript】

  1. import './lax.js/lib/lax.min.js';
  2. {
  3.   window.addEventListener('load', () => {
  4.     lax.init();
  5.     lax.addDriver('scrollY', function() {
  6.       return window.scrollY;
  7.     },
  8.     {
  9.       inertiaEnabled : true,
  10.       frameStep : 2
  11.     });
  12.     lax.addElements(
  13.       '.ufo', {scrollY : {scale : [['elInY','elCenterY-200'],[0, 1]], opacity:[['elInY','elCenterY'],[0,1]]}},
  14.     );
  15.     lax.addElements(
  16.       '.man', {scrollY : {scale : [['elInY','elOutY'],[0.7, 0]], translateY : [['elInY','elOutY'],[-50, -800],{inertia: 3}], opacity : [['elInY','elOutY'],[1, 0]]}}
  17.     );
  18.   });
  19. }

変形

続いて変形の説明です。図形を回転させたり、斜めにしたり、移動させたりしてみましょう。

変形ではCSSのtransformプロパティを操作します。transformプロパティで操作できるのは、「rotate」「translate」「scale」「skew」となります。これらをスクロールをトリガーにして操作していきます。下記デモページです。

以下サンプルコードとなります。

【HTML】

  1. <section class="translate">
  2.   <h2>03.<span>TRANSLATE</span></h2>
  3.   <div class="center">
  4.     <div class="skategirl"><img src="images/parallax/skategirl_color.svg" alt=""></div>
  5.   </div>
  6.   <div class="snowboarder"><img src="images/parallax/snowboarder.svg" alt=""></div>
  7.   <div class="shuriken"><img src="images/parallax/shuriken.svg" alt=""></div>
  8. </section>
  1. .translate {
  2.   height: 1400px;
  3. }
  4. .translate h2 {
  5.   background-color: #ffffff;
  6. }
  7. .translate div img {
  8.   width: 100%;
  9. }
  10. .translate .center {
  11.   padding-top: 3rem;
  12. }
  13. .translate .center .skategirl {
  14.   height: 5rem;
  15.   width: 5rem;
  16. }
  17. .translate .snowboarder {
  18.   height: 12rem;
  19.   width: 12rem;
  20. }
  21. .translate .shuriken {
  22.   height: 12rem;
  23.   width: 12rem;
  24. }

【JavaScript】

  1. 'use strict';
  2. import './lax.js/lib/lax.min.js';
  3. {
  4.   window.addEventListener('load', () => {
  5.     lax.init();
  6.     lax.addDriver('scrollY', function() {
  7.       return window.scrollY;
  8.     },
  9.     {
  10.       inertiaEnabled : true,
  11.       frameStep : 2
  12.     });
  13.     lax.addElements(
  14.       '.skategirl', {scrollY : {rotate : [['elInY','elInY+200','elCenterY','elCenterY+200','elOutY,elOutY+300'],[8,-16,8,-16,8,-16]], translateY : [['elInY','elOutY'],[0,100],{inertia: 3}]}}
  15.       );
  16.     lax.addElements(
  17.       '.snowboarder', {scrollY : {rotate : [['elInY','elOutY+500'],[0, 1800],{inertia:3}], translateX : [['elInY+200','elOutY+500'],[-200, 1500]], translateY : [['elInY','elOutY'],[450, 450],{inertia: 3}]}}
  18.     );
  19.     lax.addElements(
  20.       '.shuriken', {scrollY : {skew : [['elInY+500','elOutY+500'],[0,60]],rotate : [['elInY','elOutY+500'],[0, 1800],{inertia:3}], translateY : [['elInY','elOutY'],[600, 600]], translateX : [['elInY+500','elOutY+500'],[1500, -1000],{inertia: 3}]}}
  21.     );
  22.   });
  23. }

translateを使用すると、要素をスクロールに合わせて移動させることができますが、値の設定には工夫が必要かと思います。自分が実現したいレイアウトには時間をかけてトライ&エラーしていく必要があることを頭に入れておきましょう。

「lax.js」のハマりポイント

最後に「lax.js」のハマりポイントを説明しておきます。

今回の紹介したデモページでは「lax.js」を使用しています。使い方の詳細は本記事では省いていますが、僕がハマったポイントだけ紹介しておきます。

Githubの公式サイトを眺めると、モジュールをimportする際は、下記のようにしてね、と書いてありました。

  1. import lax from 'lax.js'

しかし、これを実行すると以下のエラーがコンソールに吐き出されました。

  • Uncaught TypeError: Failed to resolve module specifier “lax.js”. Relative references must start with either “/”, “./”, or “../”.

‘lax.js’のままだとパス指定になってないから、頭に / か ./ か ../ をつけてねと言われ、パスに従って ./ をつけて再度実行すると、、、

  • GET 403 (Forbidden)

なんと403エラーが出ました。「ほぇ〜、マジかー!」と。そこから403エラーの解決方法を調査したり、アクセス宣言ファイルを調べたり。。。時間をかけてあれこれやってみたのですが、解決できず途方に暮れました。

しかし、僕の経験上、諦めない限りプログラミングの道は必ず開けると知っています。なのでネチネチ考えていたら、、、

公式に書いてある、import lax from ‘lax.js’、この呼び出し方じゃなくてもよくね?

と、急に思いつき、以下の呼び出し方法を試したら、あっさりすぎるほど無事にimportできました。

  1. import './lax.js/lib/lax.min.js';

パス指定はご自身のファイルの置き場所に従って、適宜調整してください。

今回のまとめ

今回はパララックスデザインの3つの基本について紹介しました。最後まで読んで頂きありがとうございました。

レイヤー構造はギャップを使って視差を出す

要素のサイズ変更で視差を出す

要素の変形によって視差を出す

関連記事

  • JavaScript
    ブログアイキャッチ画像
    JavaScript

    【ユーザー離脱阻止!】画面遷移アニメーション実装時の注意点

  • JavaScript
    ブログアイキャッチ画像
    JavaScript

    【図解あり】JavaScript / 要素の高さや位置の取得まとめ

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2022.11.19(更新)

    「一瞬でトップへ戻るボタン」を実装する方法【jQuery不要】

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.02.02(更新)

    【CSSとJavaScriptのみ】ページ内リンクでスムーススクロールさせる方法

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.02.21(更新)

    【お手軽だった!】画像クリックで拡大画像をポップアップ表示する方法

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2022.11.25(更新)

    【5分で完了!】webデザインにおけるスマホファーストビュー高さ設定方法

CATEGORY カテゴリー別最新記事

  • CSS
    アイキャッチ画像
    CSS

    【CSS】margin?position?要素の中央寄せで使うプロパティとは?

  • Docker
    アイキャッチ画像
    Docker
    2022.10.03(更新)

    【簡単設定!】DockerでWordPressをローカル開発する方法

  • HTML
    アイキャッチ画像
    HTML
    2023.02.18(更新)

    【図解あり】aタグの入れ子ルールとHTMLの入れ子ルールを覚える方法

  • JavaScript
    アイキャッチ画像
    JavaScript
    2023.03.04(更新)

    【実例コードあり】覚えておきたいパララックスデザインの3つの基本

  • Python
    アイキャッチ画像
    Python
    2023.02.09(更新)

    【やらなきゃ損!】2日でできるPythonのExcelコピペ自動化!

  • Study
    アイキャッチ画像
    Study
    2023.02.16(更新)

    稼ぐために始めたプログラミングのこれまでの振り返り。勉強方法や役立った本も紹介。

  • web site
    アイキャッチ画像
    web site
    2022.11.26(更新)

    ページ表示速度アップ!npmでソースファイルを軽量化する方法【サクッと簡単!】

  • WordPress
    アイキャッチ画像
    WordPress
    2022.10.26(更新)

    【コピペ可】WordPressサイトをPWA化するためにService Workerを実装してみた。