JavaScript

【JavaScript】要素の横幅・高さを取得する方法

本記事では、JavaScriptで要素(コンテンツ)の横幅・高さを取得する方法について解説しています。

JavaScriptの学習におすすめ参考書
改訂3版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

本書情報
出版社技術評論社
著者山田 祥寛
発売日2023/2/13
ページ数624ページ
レビュー
(Amazon)
(4件)
先輩くん
先輩くん
10万部突破したJavaScriptの本が大幅増補改訂し7年ぶりに発売されたよ!
後輩ちゃん
後輩ちゃん
最新の基本文法から、開発に欠かせない応用トピックまで学ぶことが出来るよ!

綺麗なコードが書けるようになる!
リーダブルコード-より良いコードを書くためのシンプルで実践的なテクニック

本書情報
出版社オライリージャパン
著者Dustin Boswell / Trevor Foucher
発売日2012/6/23
ページ数260ページ
レビュー
(Amazon)
(620件)
先輩くん
先輩くん
より良いコードを書きたい人におすすめの本だよ!
後輩ちゃん
後輩ちゃん
10以上前の書籍ですが、内容は今でも役に立つものばかりです!

サンプルコード

以降の解説では、下記のサンプルコードを使用します。お手元のPCで実際に実行結果を確認したり数値をいじってみたい人はコピペしてご使用ください。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #rect {
        width: 150px;
        height: 100px;
        border: 10px solid #000;
        padding: 20px;
        margin: 30px 40px 50px 60px;

        background-color: skyblue;
      }
    </style>
  </head>
  <body>
    <div id="rect"></div>
  <script src="index.js"></script>
  </body>
</html>

要素の横幅・高さを取得

純粋な要素の横幅と高さを取得したい場合は、getComputedStyleメソッドを使用します。

const el = document.querySelector("#rect");
const styleEl = getComputedStyle(el);

console.log(styleEl.width); // 150px
console.log(styleEl.height); // 100px

getComputedStyleメソッドの引数にコンテンツの横幅・高さを取得したい要素を指定します。

すると、要素のCSSプロパティの値を含むオブジェクトを返すので、それに対して横幅の場合はwidthプロパティを高さの場合はheightプロパティを使用することでコンテンツの横幅・高さを取得することが出来ます。

要素+paddingの横幅・高さを取得

要素+paddingの横幅を取得したい場合はclientWidthプロパティを、要素+paddingの高さはclientHeightプロパティを使用します。

const el = document.querySelector("#rect");

console.log(el.clientWidth); // 190px (横幅 150px + 左右padding 40px)
console.log(el.clientHeight); // 140px (高さ 100px + 上下padding 40px)

要素+padding+borderの横幅・高さを取得

要素+padding+borderの横幅を取得したい場合はoffsetWidthプロパティを、要素+padding+borderの高さはoffsetHeightプロパティを使用します。

const el = document.querySelector("#rect");

console.log(el.offsetWidth); // 210px (横幅 150px + 左右padding 40px + 左右border 20px)
console.log(el.offsetHeight); // 160px (高さ 100px + 上下padding 40px + 上下border 20px)

要素+padding+border+marginの横幅・高さを取得

JavaScriptには、要素+padding+border+marginの横幅・高さを取得する専用のメソッドやプロパティは残念ながらありません。そのため、offsetWidth/offsetHeightプロパティを使用してborderまでの値を取得、さらにmarginの値を取得しそれらを加算する必要があります。

const el = document.querySelector("#rect");
const styleEl = getComputedStyle(el);
const { marginTop, marginRight, marginBottom, marginLeft } = styleEl;
const marginLR =
  Number(marginLeft.replace("px", "")) + Number(marginRight.replace("px", ""));
const marginTB =
  Number(marginTop.replace("px", "")) + Number(marginBottom.replace("px", ""));

console.log(el.offsetWidth + marginLR); // 310px (横幅 150px + 左右padding 40px + 左右border 20px + 左右margin 100px)
console.log(el.offsetHeight + marginTB); // 240px (高さ 100px + 上下padding 40px + 上下border 20px + 上下margin 80px)

getComputedStyleメソッドでmarginの値を取得するのですが、戻り値は◯pxと文字列になっています。なので、pxの文字を除外し更に数値型に変換させる必要があります。その時に使用するのが、Numberオブジェクトreplaceメソッドです。

Numberオブジェクトは引数に代入した値を数値に変換させることができ、replaceメソッドは第一引数に指定した文字を見つけると、第二引数に指定した文字に置換させることが出来ます。

ブログランキング・にほんブログ村へ PVアクセスランキング にほんブログ村