Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

data-scroll属性を指定したヘッダーに、ヘッダーの高さを超える子要素が存在するとき、スクロールの位置がずれる #69

Open
saketi0906 opened this issue Aug 13, 2019 · 0 comments

Comments

@saketi0906
Copy link

saketi0906 commented Aug 13, 2019

sweet-scrollをいつも使わせていただいています、使いやすいプラグインをありがとうございます。
初めてのissueで勝手が分からず、既におかしなことをしてしまってます。申し訳ないです。

さて、タイトルの問題についてですが、固定ヘッダーにドロップダウンを実装したところ発生しました。
固定されたヘッダーにdata-scroll属性を指定すると、以下のコードからヘッダーの高さを取得して、高さ分ずれた位置にスクロールされると思います。

var getHeight = function ($el) {
    return Math.max($el.scrollHeight, $el.clientHeight, $el.offsetHeight);
};

その際に、ヘッダーの中でヘッダーの高さを超えた子要素が存在する場合、子要素の高さがスクロールの計算に利用され、見た目上スクロールがおかしな位置で止まったように見える場合があります。これは、scrollHeightの高さが使われているため、発生する問題だと推察します。

そのため、getHeightメソッドで取得する高さはclientHeight、offsetHeightだけで取得するのが良いかと思うのですが、いかがでしょうか。scrollHeightが必要であるケースが想像できなかったので、issueを立てさせてもらいました。

var getHeight = function ($el) {
    return Math.max($el.clientHeight, $el.offsetHeight);
};

以下、今回の現象が再現するコードです。Safari、Chromeの最新版、バージョンは4.0.0で確認しています。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    body {
      margin: 0;
    }
    header {
      position: fixed;
      left: 0;
      top: 0;
      display: flex;
      justify-content: space-between;
      align-items: center;
      width: 100%;
      height: 5rem;
      padding: 0 1rem;
      background: #eee;
      box-sizing: border-box;
    }
    .menu {
      position: relative;
    }
    .menu__child {
      position: absolute;
      right: 0;
      top: 100%;
      width: 5rem;
      height: 10rem;
      background: orange;
      visibility: hidden;
      opacity: 0;
      transition: 1s;
    }
    .menu:hover .menu__child {
      visibility: visible;
      opacity: 1;
    }
    section {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      width: 100%;
      height: 50rem;
    }
    section:first-of-type {
      background: #ddd;
    }
    section:last-of-type {
      background: #ccc;
    }
  </style>
</head>

<body>
  <header data-scroll-header>
    <p>Header</p>
    <div class="menu">
      <p>menu</p>
      <div class="menu__child"></div>
    </div>
  </header>
  <main>
    <section>
      <p>First</p>
      <a href="#second" data-scroll>to Second</a>
    </section>
    <section id="second">
      <p>Second</p>
    </section>
  </main>

  <script src="sweet-scroll.js"></script>
  <script>
    document.addEventListener('DOMContentLoaded', () => new SweetScroll(), false);
  </script>
</body>
</html>

スクリーンショット

スクリーンショット 2019-08-14 0 48 18

@saketi0906 saketi0906 reopened this Aug 13, 2019
@saketi0906 saketi0906 changed the title headerオプションををにスクロール位置がずれる headerオプションを有効にした時にスクロール位置がずれる Aug 13, 2019
@saketi0906 saketi0906 changed the title headerオプションを有効にした時にスクロール位置がずれる data-scroll属性を指定したヘッダーに、ヘッダーの高さを超える子要素が存在するとき、スクロールの位置がずれる Aug 13, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant