icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【vue.js】Vueアプリ内にscrollでstyle.backgroundPositionYを操作する機能を入れてパララックス風に見せる方法

更新: 2025/05/25 3406文字

今回はVueアプリ内にscrollでstyle.backgroundPositionYを操作する機能を入れてパララックス風に見せるというのに挑戦してみます。ライブラリをさがしたけど、結局は『生のjavascriptで書いたコードを、vueで使う』という形に落ち着きました。早速、コードや表示例を確認していきましょう。

webデザインにおける、パララックス効果とは?

検索すると最近こんな感じでgoogleのAIが概要だしてくれます。『複数のレイヤー(層)を設け、スクロールの速さに合わせて異なる速度で動かすことで、立体感や奥行きを表現』。とのこと。TVゲームとかでもありますよね。たとえばSFCマリオコレクションでいうと、マリオが歩いている手前のレイヤーより、背景のレイヤーのスクロールスピードが遅い、みたいな。

今回は、『手前は通常スピードでスクロールして、背景はそれより遅くスクロールして立体的にする』というのを、パララックス(または、そういう風に見せるのをパララックス風)というように定義して、作ってみたいと思います。

事前調査~Vueのパララックスライブラリはあるか?また代用できる方法は?

普段このコラムでもよく登場しているvue用UIフレームワーク『element-plus』ですけど、どうやらその機能は無いとのことです。chat-gptにきいてみたところ・・・ vue-parallaxのようなライブラリはあるようです。npmコマンド(Node Package Managerのコマンド)でインストールするもののほか、CDNからロードして使えるものもあります。

他のプロンプト渡したところ『生のjavascriptで書いたコードを、vueで使う(addEventListener("scroll", onScroll)みたいなやつ)』というのも提示してくれたので、『backgroundPositionYのオフセットをスクロールに応じて変えればいいんじゃね?』というアイデアが思いつきました。この方法を採用しました。

Vue & backgroundPositionパララックス コードやポイント

コード例やポイント

コードはこんな感じになりました。CSSでポイントになりそうなところはbackground-attachment: fixed;でしょうか。最初は固定状態(fixed)にしておきます。これだけでもちょっと立体的にに見えるのでおススメです。

#app{
background-image: url(bg.jpg);
object-fit: cover;
background-size: 150%;
background-attachment: fixed;
background-position: center top;
background-repeat: no-repeat;
transition: background-position 20ms linear;
}

あと、javascript部分は、別にvueを間にかませなくてもできるんですけど(笑)、スクロールイベントを補足して、前述の固定背景のオフセットをずらしていくという処理を入れました。

const offsetY = ref(0);
const onScroll = () => {
    offsetY.value = window.scrollY * 0.8;
    document.getElementById("app”").style.backgroundPositionY = `-${offsetY.value}px`;
};
onMounted(() => {
    window.addEventListener("scroll", onScroll);
});
onBeforeUnmount(() => {
     window.removeEventListener("scroll", onScroll);
});

この部分です。getElementById、addEventListenerはよく使う気がします(個人的な感想)。window.scrollY × 0.8分がオフセットになってずれていくので、パララックス的に見える感じです。

注意点~コンテンツや画像のheightについて

上記のコードではpタグに『margin-bottom:128px』がついていますが、コンテンツの縦の長さが短いとスクロールが発生しません。むりやり大きめのマージンを設定して、コンテンツが長くなってスクロールが発生するようにしています。

また、bg.jpgのサイズが『2048×1700』のものを使ってしまったのは、管理人のミスです(笑)スクロールに対して画像の縦の長さが足りない場合、下のほうが少し切れてしまうような表示になります。画像探すのに時間をかけたくなかったので、『メディアクエリで表示幅が狭くなったらbackground-size: 200%; のように拡大』みたいに応急処置しています。より縦長の画像を使う・スマートフォンやタブレット用の縦長画像も用意する・スクロール量がある程度超えたら、オフセットでずらすのをやめるのような処置が必要になります。

繰り返せるパターンの画像の場合はcssのbackground-repeatで繰り返してもokです。

Vue & backgroundPositionパララックス表示例

では表示確認してみましょう。スクロールなしの初期状態。背景の下のほうに、建物の屋根みたいなのが見えています。固定だとこの状態からスクロールしても変化しませんが、オフセットを操作できるようにしたので・・・

下までスクロールするころには、背景も少しずつスクロールしてここまで見えるようになります。マウスホイールよりも、スクロールバーをゆっくり動かすとわかりやすいかも。

今回の動作サンプルは、以下のurlに上げています。ただし背景画像の関係でPC推奨です(スマートフォン用縦長画像を用意していない)。

あとがき・まとめ

  • Vue.jsのelement-plusにはパララックスが無いけれど、外部ライブラリが存在する
  • パララックスを生javascriptで書く、それをVue.jsアプリのコードに組み込むことができる
  • 背景固定して、スクロールに応じてオフセット値を変化させてずらすと、それっぽく見える

まとめると、こんなところでしょうか。別にVue.jsかませる必要はないですけど、メインフレームワークに使う場合はこういう書き方も使うのかなーという感想です。他のライブラリが無い分、構成はシンプルです。


【カテゴリ】- javascript/jQuery、その他
【タグ】-

関連記事