Chromeのバグ対策:URLに「#~」を付けずにscrollToを使って「id=~」までスクロールさせる
【Chromeではiframeで表示するページをfragmentから表示すると親ページが先頭から表示せずにiframeの所から表示してしまう問題】の続き。
2021/5/13 11:00頃
Chromeのバグを再現するソース
test3.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Chromeのiframeのバグ?</title>
</head>
<body>
<div style="height:200px;">
バナー、ヘッダなど。
</div>
<div style="height:250px;">
<h4>↓↓↓iframe↓↓↓</h4>
<iframe src="test00.html#y500" id="test00" title="test00"></iframe>
</div>
<div style="height:1000px;">
<a href="test3.html">このページへのリンク</a>
</div>
</body>
</html>
test00.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>iframe内</title>
</head>
<body>
<p style="height:500px;">iframe内</p>
<p style="height:500px;" id="y500">iframe内500px</p>
</body>
</html>
Chromeでtest3.htmlをリンクから開くと先頭からではなくiframeまでスクロールした状態で開いてしまう。これはiframeで開くページのURLに「#~」があると起こるらしい。ただし、ページ内に「#~」で指定した場所が無い場合は無視されて先頭から表示される。
このバグに対処するには iframeで開くページのURLに「#~」を付けずに「#~」でスクロールさせたい場所までスクロールさせなければいけない。その方法として「id="~"」の要素がある場所の位置をgetBoundingClientRect()で取得して、scrollToでその位置までスクロールさせる。
対処用のソース
test3.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Chromeのiframeのバグ?</title>
</head>
<body>
<div style="height:200px;">
バナー、ヘッダなど。
</div>
<div style="height:250px;">
<h4>↓↓↓iframe↓↓↓</h4>
<iframe src="test00.html?y500" id="test00" title="test00"></iframe>
</div>
<div style="height:1000px;">
<a href="test3.html">このページへのリンク</a>
</div>
</body>
</html>
test00.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>iframe内</title>
<script type="text/javascript">
<!--
function scrollToid(){
var id = location.search.slice(1);
var y0 = document.body.getBoundingClientRect().top;
var y1 = document.getElementById(id).getBoundingClientRect().top;
window.scrollTo(0,y1-y0);
}
-->
</script>
</head>
<body onload="scrollToid();">
<p style="height:500px;">iframe内</p>
<p style="height:500px;" id="y500">iframe内500px</p>
</body>
</html>
2021/5/28 16:00頃
続き→【対処法:ChromiumベースのブラウザやIEでは iframe を含むページが先頭から表示されない場合がある。(iframe で開くページのURLに「#~」があると起こる)】
コメント
コメントを投稿