zoomした要素の中でzoomした要素の高さを取得しようとしたら

以前のプロジェクトで、訳あってレスポンシブとか使えないので、<html>にzoomを指定して、どんな機種でも画面幅にあわせるようにzoom値を変更する処理というのを行っていました。

さらにその中で、そのページをどうしても画面内に収めたいという仕様が降りてきました。イメージとしては、以下のような感じ。

<html> <== 画面幅を合わせるためにzoomする
  <body>
    <div id="content"> <== スクロールしないように画面長に収めるようにzoomする
      コンテンツ
    </div>
  </body>
</html>

以下のようにJavaScriptの処理を記述しました。

var windowHeight = window.innerHeight;
var contentHeight = $('#content').innerHeight();

if( contentHeight > windowHeight ) {
  var ratio = windowHeight/contentHeight;
  $('#content').css({
  "zoom": (ratio*100) + "%"
  });
}

ただ、これだと想定より小さくならなかったので、試行錯誤しました。ふと色んな端末で数値をみていると、htmlのzoomの値に比例していそうと気づきましたので、htmlのzoom値を計算に入れたら上手くいきました。zoomの中でzoomすると親元のzoom値を考慮しなくてならないようです。上記の処理を以下のように変更しました。

var windowHeight = window.innerHeight;
var contentHeight = $('#content').innerHeight();

// htmlのzoom値を考慮に入れる (この処理が必要!)
var zoom = $('html').css('zoom');
if( zoom != null ) contentHeight = contentHeight*zoom; 

if( contentHeight > windowHeight ) {
  var ratio = windowHeight/contentHeight;
  $('#content').css({
  "zoom": (ratio*100) + "%"
  });
}

これでなんとなく上手くいきます。これがzoomだらけの要素ばかりになると処理が大変そうですね(笑)そもそもzoomを使うことなんてレアなケースだとは思いますので、滅多に遭遇しないとは思いますが、なるほどなと思ったので参考になれば。

funnydreamer
栃木生まれのミドルエイジ。フロントエンドとデザインの領域におりましたが、最近はマーケティングやライティングにPythonによる自動化など何でも屋になってきました。趣味は、ゲーム、アニメ、自転車(ポタリング)、カフェ巡り、お絵描きと自称多趣味。ケーキはショートケーキが好物。

ADD COMMENT

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください