本記事では、JavaScriptで要素(コンテンツ)の横幅・高さを取得する方法について解説しています。
- 誰でも分かるように嚙み砕いて説明してくれる
- アニメーションの知識が深く学べる
- 1つのWebサイトを作りながら学べる
Amazon Kindle Unlimitedに登録すると、月額980円で読み放題だからオススメだよ!
初回30日間は無料だから、まだ登録したことのない人はぜひ試してみてね!
変数名/関数名にもう悩まない!
- 美しいコードが書けるが自然と書けるようになる
- 他の開発者が理解しやすいコードになる
サンプルコード
以降の解説では、下記のサンプルコードを使用します。お手元の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メソッドは第一引数に指定した文字を見つけると、第二引数に指定した文字に置換させることが出来ます。