0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

画像を含むページ内遷移がズレるんでなんとかしたい

Last updated at Posted at 2020-05-05

画像を含むページ内遷移をしたいとと思ったら、やっぱり基本は <a href="#hoge"><div id="hoge"> とかだと思うんですよ。それか <a name="hoge"> でもいいです。

で、遷移先までの途中に画像が差し込まれていると、ハッシュ付きURLで開いた時、
画像の読み込みによって遷移先がズレることがありませんか?

基本

  • 画像はサイズ指定するべき←サイズが指定されていればこの問題は起きないはず
  • 画像のサイズが読み込まれてからでないと決定しないときズレがち
  • アニメーションでサイズが可変になることでも生じる

対応策

.js
function tryToScroll(img){
  leftImages--;
  if(leftImages === 0) scrollTo(img)
}

function scrollTo(el){
   el.scrollIntoView()
}

const imgs = document.querySelectorAll("img") //対象のタグは任意に変えること
let leftImages = imgs.length
imgs.forEach(img, () => {
  img.addEvemtListener("load", tryToScroll(img));
  img.addEvemtListener("error", tryToScroll(img));
})

多分これでうまくいくはず?
(空でタイプしたのでちょっと確認してないです。うまくいかなかったらコメントください)

アイデアとしては最初にimgタグの個数を数えて、読み込みおわりもしくはエラーならデクリメントし、
残っている画像の数が0個になったら再度スクロールを試みるというものです。

これで多分うまくいくんじゃないでしょうか

アニメーションするときの備え

cssアニメーションなどで画像を可変サイズにしたいとかもありますよね!
そういう時にもこの問題にぶちあたります。

まず確認するのは、アニメーション秒数が固定秒かどうかです。
たとえば0.2秒固定なら、0.2秒遅延して scrollTo() を試みましょう

.js
function tryToScroll(img){
  setTimeout(() => {
    leftImages--;
    if(leftImages === 0) scrollTo(img)
  }, 200)
}

こんな感じでうまくいくんじゃないでしょうか。
試してみてください。

SPAとかありがち

APIリクエストの結果で画像の数とか変わるので、よしなに頑張りましょう(๑•̀ㅂ•́)و✧

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?