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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

1724閲覧

ブラウザのリサイズ(回転)時に表示領域のデバイスピクセルまたはCSSピクセルを取得したい

yamakane

総合スコア13

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/07/21 13:49

実現したいことは
「canvas要素のサイズをブラウザの表示領域のデバイスピクセルにできるだけ一致させたい(擬似的な1:1全画面表示)」
というだけの単純な話なのですが、
「viewportのwidthを設定した場合」「回転・リサイズした場合」
の適切な設定方法がわかりません。

下記コードだと、例えばdevicePixelRatioが2、短辺のCSSピクセルが375pxのiPhoneの場合、
初回の(1)部分の実行でviewportのwidthをデバイスピクセルの750に設定すると、
回転時(リサイズ時)の(2)ではwindow.innerWidthが上述で設定した750の値で取得されるため、
以降リサイズのたびに倍々に増えていってしまいます。
(なおiPhoneのSafariではviewportの最大値がCSSピクセルの4倍までに制限されているようで、倍々が途中で打ち止めになります)
かといって(1)をフラグなどで一度しか発火しないようにすると、当然ですが初回で設定した横幅に固定されてしまいます。

いかなる場合においても(すなわちviewportの設定などに依存せず)CSSピクセルまたはデバイスピクセルを取得できる関数などはないのでしょうか。
よく使われそうな機能なのに調べても同様の記事等を見かけないので、何か単純なことを見落としているのかもしれません。
(なお算出されるCSSピクセルやデバイスピクセルが、実媒体との厳密な一致でなく近似であることは理解しています。
またアドレスバーなどのサイズについては今回の検討に含みません)
ご教示ください。

html

1<!DOCTYPE html> 2<html> 3 4<head> 5 <meta name='viewport' content="width=device-width"> 6</head> 7 8<body style="background-color:skyblue;margin:0;"> 9 <canvas id="maincanvas" style="background-color:pink;"></canvas> 10</body> 11 12<script> 13 const Resize = () => { 14 const canvas = document.getElementById('maincanvas'); 15 let w = window.innerWidth; // <-(2) 16 let h = window.innerHeight; 17 if (window.devicePixelRatio > 1) { // <-(1) 18 w = w * window.devicePixelRatio; 19 h = h * window.devicePixelRatio; 20 document.querySelector("meta[name='viewport']").setAttribute('content', `width=${w}`); 21 } 22 canvas.width = w; 23 canvas.height = h; 24 // 下記は確認表示用 25 console.log(`rotate = ${window.innerWidth > window.innerHeight ? 'landscape' : 'portrait'}`); 26 console.log(` window.iW = ${window.innerWidth}, window.iH = ${window.innerHeight}`); 27 console.log(` canvas.w = ${canvas.width}, canvas.h = ${canvas.height}`); 28 canvas.getContext('2d').font = `normal 48px sans-serif`; 29 canvas.getContext('2d').fillText(`rotate = ${window.innerWidth > window.innerHeight ? 'landscape' : 'portrait'}`, 0, 100); 30 canvas.getContext('2d').fillText(` window.iW = ${window.innerWidth}, window.iH = ${window.innerHeight}`, 0, 200); 31 canvas.getContext('2d').fillText(` canvas.w = ${canvas.width}, canvas.h = ${canvas.height}`, 0, 300); 32 }; 33 window.addEventListener('resize', Resize); 34 Resize(); 35</script> 36 37</html>

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

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

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

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

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

x_x

2019/07/24 00:19

meta を書き換える必要はあるのでしょうか?
yamakane

2019/07/24 08:08

「デバイスピクセルにほぼ一致したサイズでcanvas要素をフルスクリーンっぽく表示できる」 のであれば,どんな方法でもよいです. metaを書き換える遣り方しか把握していないというのが自分の現状です. よろしくお願いいたします.
guest

回答1

0

orientationchangeで端末の向きを検知できるので
イベント発生後に表示領域のデバイスピクセルまたは
CSSピクセルを取得してください。
https://developer.mozilla.org/ja/docs/Web/API/Window/orientationchange_event

投稿2019/07/21 14:11

yasutomi

総合スコア2937

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

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

yamakane

2019/07/23 12:53

すみません、説明が悪かったようです。 念のため上記コードの`window.addEventListener`を`resize`から`orientationchange`に変更しても、 取得できるウィンドウ幅は初回実行時に設定したviewportの値であって、物理的なデバイスピクセルまたはCSSピクセルではありませんでした。 問題は、一度viewportを設定すると以降はその値に影響されたウィンドウ幅しか取得できないという点にあります。 何か他に良い手はないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問