スクロールバーの幅を考慮してサブウィンドウを開く方法(2023/12/17)

パソコンで、画像のサイズに合わせてサブウィンドウを開きたい。これはディスプレイのサイズより画像のサイズが小さければ、何の問題もない。しかし、画像のサイズが大きい場合、ブラウザによってスクロールバーの幅が異なるため、何らかの細工が必要となる。

javascript and CSS

画像サイズが幅720px×高さ840px、周囲の余白が10pxの場合を例にとる。 デスクトップパソコン用ディスプレイの解像度は1920×1080pxや1536×864pxが主流である。これらより低いものも多く存在するが、きりがないので無視する。サブウィンドウのクライエント領域の最大サイズは、タイトルバーの高さや枠の幅、ステータスバーの高さなどをディスプレイの解像度から差し引き、幅1500px×高さ742px(暫定値)とする。 JavaScript でサブウィンドウを開く。 window.open("url.html", "subwindow", "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, width=740, height=742, left=0, top=0"); 、Firefox では問題なく表示されるが、他のブラウザでは左右の余白がなくなってしまう。

Firefox Ver. 120.0.1 で開いたサブウィンドウ
Firefox Ver. 120.0.1 で表示した場合(マウスアウトでスクロールバーは消える)
Edge Ver. 120.0.2210.77 で開いたサブウィンドウ
Edge Ver. 120.0.2210.77 で表示した場合(スクロールバーは常時表示)
Chrome Ver. 120.0.6099.110 で開いたサブウィンドウ
Chrome Ver. 120.0.6099.110 で表示した場合(スクロールバーは常時表示)

そこで、スクロールバーの幅の分を調整してみる。 1.  .image{ /* 画像要素 */    position: absolute;    top: 10px;    left: 10px;    width: calc(720px - calc(100vw - 100%));  }  @-moz-document url-prefix() { /* Firefox のみ */    .image {      width: 720px;    }  }  .wrap{ /* 親要素 */    position: relative;    margin: 0;    width: 100%;  } この方法は一見良さそうだが、Firefox 以外では画像サイズがオリジナルから縮小されるので、鮮明度が若干低下する。

Firefox Ver. 120.0.1 で開いたサブウィンドウ(2)
Firefox Ver. 120.0.1 で表示した場合
Edge Ver. 120.0.2210.77 で開いたサブウィンドウ(2)
Edge Ver. 120.0.2210.77 で表示した場合
Chrome Ver. 120.0.6099.110 で開いたサブウィンドウ(2)
Chrome Ver. 120.0.6099.110 で表示した場合

2.  var mywidth = 740 + window.innerWidth - document.body.clientWidth; /* add scrfoll bar width */  window.open("url.html", "subwindow", "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, width=" + mywidth + ", height=742, left=0, top=0");

Firefox Ver. 120.0.1 で開いたサブウィンドウ(3)
Firefox Ver. 120.0.1 で表示した場合
Edge Ver. 120.0.2210.77 で開いたサブウィンドウ(3)
Edge Ver. 120.0.2210.77 で表示した場合
Chrome Ver. 120.0.6099.110 で開いたサブウィンドウ(3)
Chrome Ver. 120.0.6099.110 で表示した場合

ブラウザとバージョンを選ばず対応でき、コードもシンプル。これで決まり。 なお、忘備録として JavaScript でブラウザを判定して条件分けする方法を書き留めておく。ただし、コードが長ったらしくなり、Firefox のバージョンも判別できないので、あえて採用するメリットはない。 var userAgent = window.navigator.userAgent.toLowerCase(); var mywidth = 740 + window.innerWidth - document.body.clientWidth; if(userAgent.indexOf('firefox') != -1 || userAgent.indexOf('trident') != -1) {   window.open("url.html", "subwindow", "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, width=740, height=742, left=0, top=0"); else {   window.open("url.html", "subwindow", "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, width=" + mywidth + ", height=742, left=0, top=0");   } }

< 前の記事次の記事 >