SVGについて – テキストについて(7)

javascript

SVGについて – テキストについて(7)

前々回の x属性の変更のサンプルに対して、writing-mode属性をつけてみます。

writing-mode属性は文字列の出力方向を決定します。

writing-mode="lr"
左から右に出力する(通常の出力と同じ)

writing-mode="rl"
右から左に出力する(通常の出力とは逆になる)

writing-mode="tb"
上から下に出力する(縦書きになる)

具体的なサンプルを用意しました。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テストHTML</title>

<style>
.params_box {
	padding-top: 30px;
}

.range {
	width: 300px;
}
</style>


</head>
<body>

<svg width="500" height="200" viewBox="0 0 500 200">

	<text
		id="test_text1"
		x="20"
		y="20"
		dx="0"
		dy="0"
		transform="rotate(0, 20,40)"
		writing-mode="tb"
	>
	テキストのテスト
	</text>

</svg>


<div>
	<div class="params_box">
		<span class="param_title">パラメータ1</span>
		<div><input type="range" class="range" id="range1" value="20" max="400"></div>
		<span>x :</span>
		<span class="params" id="range1_value"></span>
	</div>

	<div class="params_box">
		<span class="param_title">パラメータ2</span>
		<div><input type="range" class="range" id="range2" value="20" max="400"></div>
		<span>x :</span>
		<span class="params" id="range2_value"></span>
	</div>

	<div class="params_box">
		<span class="param_title">パラメータ3</span>
		<div><input type="range" class="range" id="range3" value="20" max="400"></div>
		<span>x :</span>
		<span class="params" id="range3_value"></span>
	</div>

	<div class="params_box">
		<span class="param_title">パラメータ4</span>
		<div><input type="range" class="range" id="range4" value="20" max="400"></div>
		<span>x :</span>
		<span class="params" id="range4_value"></span>
	</div>

	<div class="params_box">
		<span class="param_title">パラメータ5</span>
		<div><input type="range" class="range" id="range5" value="20" max="400"></div>
		<span>x :</span>
		<span class="params" id="range5_value"></span>
	<div>

</div>


<script>

// スライダ range1 の要素を取得し、イベントを付与する
let range1_dom = document.getElementById('range1');
let range2_dom = document.getElementById('range2');
let range3_dom = document.getElementById('range3');
let range4_dom = document.getElementById('range4');
let range5_dom = document.getElementById('range5');

// 各スライダーごとのイベントに、共通の関数を割り当てて処理する
range1_dom.addEventListener('input', change_range_slider);
range2_dom.addEventListener('input', change_range_slider);
range3_dom.addEventListener('input', change_range_slider);
range4_dom.addEventListener('input', change_range_slider);
range5_dom.addEventListener('input', change_range_slider);

// スライダーを動かし時の処理
function change_range_slider()
{
	console.log("range1_dom.value -> " + range1_dom.value);
	console.log("range2_dom.value -> " + range2_dom.value);
	console.log("range3_dom.value -> " + range3_dom.value);
	console.log("range4_dom.value -> " + range4_dom.value);
	console.log("range5_dom.value -> " + range5_dom.value);

	// パターン内のDOM情報を取得する
	let test_text1_dom = document.getElementById('test_text1');
	let test_text2_dom = document.getElementById('test_text2');
	let test_text3_dom = document.getElementById('test_text3');
	let test_text4_dom = document.getElementById('test_text4');
	let test_text5_dom = document.getElementById('test_text5');

	console.log("test_text1_dom -> " + test_text1_dom);
	console.log("test_text2_dom -> " + test_text2_dom);
	console.log("test_text3_dom -> " + test_text3_dom);
	console.log("test_text4_dom -> " + test_text4_dom);
	console.log("test_text5_dom -> " + test_text5_dom);

	// パラメータ1~パラメータ5まで値をリスト(配列)形式にして角度を決定する
	let param1_value = range1_dom.value;
	let param2_value = range2_dom.value;
	let param3_value = range3_dom.value;
	let param4_value = range4_dom.value;
	let param5_value = range5_dom.value;

	let set_param_value = param1_value + " "
	                    + param2_value + " "
	                    + param3_value + " "
	                    + param4_value + " "
	                    + param5_value;

	console.log("set_param_value -> " + set_param_value);

	// SVG要素の x属性 を変更する
	test_text1_dom.setAttribute('x', set_param_value);
	
	// 画面出力
	let range1_value_dom = document.getElementById('range1_value');
	let range2_value_dom = document.getElementById('range2_value');
	let range3_value_dom = document.getElementById('range3_value');
	let range4_value_dom = document.getElementById('range4_value');
	let range5_value_dom = document.getElementById('range5_value');

	range1_value_dom.innerHTML = range1_dom.value + '<br />';
	range2_value_dom.innerHTML = range2_dom.value + '<br />';
	range3_value_dom.innerHTML = range3_dom.value + '<br />';
	range4_value_dom.innerHTML = range4_dom.value + '<br />';
	range5_value_dom.innerHTML = range5_dom.value + '<br />';

}

</script>


</body>
</html>

サーバ上のHTMLはこちら(test1.html)

画面にアクセスすると、「テキストのテスト」という文字列が縦書きで表示されます。

また、画面下部のパラメータ1~5は、前々回のサンプルのまま設置しています。

縦書きの属性にしても、x方向の各文字の移動はそのまま処理できることがわかります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です