質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

776閲覧

生JSでページボトムボタンをスムーズスクロールしたい

erp

総合スコア46

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/10/15 09:17

編集2021/10/15 15:29

前提・実現したいこと

jQueryから書き換えを行っており、ページダウンボタンが上手く実装できません。
・ポリフィルを使わない

js

1window.scrollTo({ 2 top: scrollPosition, 3 behavior: "smooth" 4});

を使わない方法を検索してもうまくできるものが見つかりませんでした。

発生している問題・エラーメッセージ

とにかくポリフィルを使いたくないので、jsだけで済ませたいです。

該当のソースコード

js

1/* page-top / bottom button ---------------------------------- */ 2 let Btn = document.getElementById('page-top'), 3 topBtn = document.getElementById('page-all'), 4 bottomBtn = document.getElementById('page-bottom'); 5 window.addEventListener('scroll', function () { 6 if (window.scrollY > 300) { 7 Btn.classList.add('fadeIn'); 8 Btn.classList.remove('fadeOut'); 9 } else { 10 Btn.classList.remove('fadeIn'); 11 Btn.classList.add('fadeOut'); 12 } 13 }) 14 topBtn.addEventListener("click", function foo() { 15 let nowY = window.pageYOffset; 16 window.scrollTo(0, Math.floor(nowY * .9)); 17 if (nowY > 0) { 18 window.setTimeout(foo, 10); 19 } 20 }); 21 // bottomBtn.addEventListener('click', scrollToBottom); 22 // 上手い方法が見つかりませんでした。 23 /* page-top / bottom button ------------------------------ end */

試したこと

js

1window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' })

Safari だと動かないそうなので、そしてbehavior: 'smooth'だとアニメーションが速いのでもっとゆっくりにしたいです。
ライブラリやポリフィルなしで実装できますでしょうか。

js

1bottomBtn.addEventListener("click", function foo() { 2 const goalOffset = document.body.scrollHeight - document.body.clientHeight; 3 let nowY = goalOffset - window.pageYOffset; 4 window.scrollTo(goalOffset, Math.floor(nowY * .9)); 5 if (nowY > 0) { 6 window.setTimeout(foo, 10); 7 } 8 });

としたところ、初回は下までスムーズスクロールされるのですが、二回目以降度のボタンを押しても反応しませんんでした。
ページ全体が fixed が掛けられたように、マウスでのスクロールも出来ません。エラーは特になかったです。

補足情報(FW/ツールのバージョンなど)

Firefox 最新版、Safari 604.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

topBtnの挙動ができているのでしたら、bottomBtnの方も同じようにやればよいでしょう。

最終的なスクロールオフセットが0ではないので、

js

1const goalOffset = document.body.scrollHeight - document.body.clientHeight;

ここに向かって行くとすると、

  • nowY に相当するのは goalOffset から window.pageYOffset を引いた値
  • scrollTo() に渡すのは goalOffset から上記の値を 0.9 倍したものを引いた値

投稿2021/10/15 13:11

編集2021/10/16 07:44
int32_t

総合スコア21016

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erp

2021/10/15 15:31

ありがとうございます。 教えていただいたようにやってみましたが、上手くいきませんでした。初回はスクロールされますが、2回目以降が動きません。 質問に追記しました。
int32_t

2021/10/15 16:02

scrollTo() の引数が間違ってますね。
erp

2021/10/16 01:55

scrollTo() の引数、分かりませんでした。どこが違うのでしょうか。 コードをご教示いただけますと大変助かります。どうぞよろしくお願いいたします。
int32_t

2021/10/16 07:43 編集

scrollTo(0, goalOffset - Math.floor(nowY * .9)) でしょう。
erp

2021/10/16 12:55

ありがとうございます。思ったように実装できました。大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問