要素内にあるテキストの行数を取得

要素内にあるテキストの行数を取得するには、次のような方法で実装します。

関数定義

JavaScript

/**
 * 要素内にあるテキストの行数を取得
 * @param {Element} element 取得するもとの要素
 * @return {Number} 行数を返す
 */
var getNumberLines = function(element) {
	var fontSize = 0, count = 0, calcResult = 0;

	/**
	 * 要素からスタイルを取得
	 */
	var getStyleValue = function(element, styleName, pseudoElt) {
		if (!element) return '';
		if (!pseudoElt) pseudoElt = '';

		var style;

		/**
		 * キャメルケースへ変換
		 */
		var toCamelcase = function(str, upper) {
			if (!str) return str;

			var strs = str.split(/[-_ ]+/),
			    i = 1, len = strs.length;

			if (len <= 1) return str;

			if (upper) {
				i = 0;
				str = '';
			} else {
				str = strs[0].toLowerCase();
			}

			for (; i < len; i++) {
				str += strs[i].toLowerCase().replace(/^[a-z]/, function(value) {
					return value.toUpperCase();
				});
			}

			return str;
		};

		if (document.defaultView) {
			style = document.defaultView.getComputedStyle(element, pseudoElt);
		} else {
			style = element.currentStyle;
			styleName = toCamelcase(styleName);
		}
		return (styleName) ? style[styleName] : style;
	};

	/**
	 * 要素からフォントサイズを取得
	 */
	var getFontSize = function(element) {
		var fontSize = getStyleValue(element, 'font-size');

		if (!fontSize.match(/px$/)) {
			var tmpElem = document.createElement('div');
			tmpElem.style.width = '1em';
			element.appendChild(tmpElem);
			fontSize = tmpElem.offsetWidth;
			element.removeChild(tmpElem);
		}

		return parseInt(fontSize);
	};

	var lineHeightVal = getStyleValue(element, 'line-height'),
	    heightVal     = element.clientHeight,
	    boxSizing     = getStyleValue(element, 'box-sizing');

	if (boxSizing === 'border-box' || boxSizing === 'padding-box') {
		heightVal -= parseInt(getStyleValue(element, 'padding-top'));
		heightVal -= parseInt(getStyleValue(element, 'padding-bottom'));
	}

	if (isNaN(parseInt(lineHeightVal))) {
		fontSize = getFontSize(element);
		while (calcResult < heightVal) {
			calcResult += fontSize;
			if (calcResult <= heightVal) count++;
		}
	} else {
		count = Math.floor(heightVal / parseInt(lineHeightVal));
	}

	return count;
};

使い方

引数

引数名 説明
第一引数
必須
element Element 要素

戻り値

行数を返します。

サンプルコード

JavaScript

var sampleElem = document.getElementById('sample');

alert(getNumberLines(sampleElem));

JavaScript逆引きリファレンス一覧へ戻る