Web production note

 【更新日 :

【JavaScript】bodyのスクロールを停止する機能を実装する

Category:
JavaScript

Vanilla JSでbodyのスクロールを停止するメソッドを実装したサンプルです。
メニューやモーダル展開時などに利用できます。

オブジェクト版

codepen

See the Pen Menu Open Scroll stop(body fixed) Vanilla JS by web_nak (@web_walking_nak) on CodePen.

HTML・CSS

特別な記述は特にありません。

JavaScript

//スクロール固定オブジェクトセット
const bodyScroll = {
  //スクロール位置保存用プロパティ
  scrollY: 0,

  //スクロール固定用ベースstyle
  styles: {
    position: 'fixed',
    left: 0,
    width: '100%',
    boxSizing: 'border-box',
  },

  //スクロール固定・解除メソッド
  fixed: function(isFixed) {
    //スクロール固定
    if(isFixed) {
      //style追加・更新
      //現在の位置を取得
      this.scrollY = window.pageYOffset || document.documentElement.scrollTop;
      //現在の位置をstyleに設定
      this.styles.top = (this.scrollY * -1) + 'px';

      //スクロールバーの幅取得・設定(ガタツキ防止)
      this.styles.paddingRight = (window.innerWidth - document.body.clientWidth) + 'px'

      //その他のstyleをセット
      Object.keys(this.styles).forEach(function(key) {
        document.body.style[key] = this.styles[key];
      }.bind(this));


    //スクロール固定解除
    } else {
      //styleリセット
      Object.keys(this.styles).forEach(function(key) {
        document.body.style[key] = '';
      });

      //スクロール位置設定
      window.scrollTo(0, this.scrollY);
    }
  }
};

メソッドの呼び出し

任意の場所で以下を実行しメソッドを呼び出してください。

//スクロール停止
bodyScroll.fixed(true);

//スクロール停止解除
bodyScroll.fixed(false);

関数版

オブジェクト版と機能は同じで export, importできるよう関数化したものです。

codepen

<p class="codepen" data-height="500" data-default-tab="result" data-slug-hash="gOjOPQB" data-user="web_walking_nak" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/web_walking_nak/pen/gOjOPQB">
  Menu Open Scroll stop function(body fixed) Vanilla JS</a> by web_nak (<a href="https://codepen.io/web_walking_nak">@web_walking_nak</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

JavaScript

//スクロール固定関数
const bodyScrollFixed = isFixed => {
  //スクロール固定用ベースstyle
  const styles = {
    position: 'fixed',
    top: 0,
    left: 0,
    width: '100%',
    boxSizing: 'border-box',
    paddingRight: 0
  };
  const body = document.body;

  //スクロール固定
  if(isFixed) {
    //style設定
    const scrollY = window.pageYOffset || document.documentElement.scrollTop;
    styles.top = (scrollY * -1) + 'px';
    styles.paddingRight = (window.innerWidth - document.body.clientWidth) + 'px';
    Object.keys(styles).forEach( key => {
      body.style[key] = styles[key];
    });

    body.classList.add('is-fixed');

  } else {
    //スクロール固定解除

    //スクロール位置取得
    const scrollY = parseInt(body.style.top || '0');

    //style解除
    Object.keys(styles).forEach( key => {
      body.style[key] = '';
    });
    body.classList.remove('is-fixed');

    //スクロール位置設定
    window.scrollTo(0, scrollY * -1);
  }
}

HTML・CSS

特別な記述は特にありません。

関数の呼び出し

任意の場所で以下を実行し関数を呼び出してください。

//スクロール停止
bodyScrollFixed(true);

//スクロール停止解除
bodyScrollFixed(false);

関連リンク

参考リンク