座標変換 transform について – scale について
transform属性の scale を試してみます。
以下のサンプルを用意しました。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
<style>
.params_box {
	padding-bottom: 20px;
}
.range {
	width: 400px;
}
</style>
</head>
<body>
<svg width="400" height="400" viewBox="0 0 400 400">
    <path
        id           = "test_tran_dom1"
        d            = "M 20 20 A 20 20 0 0 1 100 100"
        stroke       = "#4f4f4f"
        stroke-width = "1"
        fill         = "#cccccc"
        transform    = "translate(10, 10)"
    />
</svg>
<div>
	<div class="params_box">
		<span>パラメータ1</span>
		<div><input type="range" class="range" id="range1" value="20" max="300"></div>
		<span>scale(x方向) :</span>
		<span class="params" id="range1_value"></span>
	</div>
</div>
<script>
// スライダの要素を取得し、イベントを付与する
let range1_dom = document.getElementById('range1');
// 各スライダーごとのイベントに、共通の関数を割り当てて処理する
range1_dom.addEventListener('input', change_range_slider);
// スライダーを動かし時の処理
function change_range_slider()
{
	console.log("range1_dom.value -> " + range1_dom.value);
	// DOMを取得する
	let test_tran_dom1 = document.getElementById('test_tran_dom1');
	console.log("test_tran_dom1 -> " + test_tran_dom1);
	// パラメータの値をリスト(配列)形式にして値を決定する
	let param1_value = range1_dom.value;
	let set_param_value = (param1_value / 10);
	console.log("set_param_value -> " + set_param_value);
	// SVG要素の x方向 を変更する
	test_tran_dom1.setAttribute('transform', 'scale(' + set_param_value + ')');
	
	// 画面出力
	let range1_value_dom = document.getElementById('range1_value');
	range1_value_dom.innerHTML = set_param_value + '倍';
}
</script>
</body>
</html>
画面にアクセスすると、1つのDOMが出力されます。
パラメータを操作することで、svg画像に指定した x方向の拡大率 の値が変化します。
また、この例では拡大率の変化が把握しやすいように、スライダーの値を10分の1にして適用させています。
座標変換 transform について – scale x方向 y方向 について
先程のサンプルを変更して、y方向にもパラメータを追加してみます。
x方向 y方向 それぞれに scale を適用する場合は、下記の書き方になります。
scale(x, y)
簡単サンプルを書きました。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
<style>
.params_box {
	padding-bottom: 20px;
}
.range {
	width: 400px;
}
</style>
</head>
<body>
<svg width="400" height="400" viewBox="0 0 400 400">
    <path
        id           = "test_tran_dom1"
        x            = "20"
        y            = "20"
        d            = "M 20 20 A 20 20 0 0 1 100 100"
        stroke       = "#4f4f4f"
        stroke-width = "1"
        fill         = "#cccccc"
        transform    = "translate(10, 10)"
    />
</svg>
<div>
	<div class="params_box">
		<span>パラメータ1</span>
		<div><input type="range" class="range" id="range1" value="20" max="300"></div>
		<span>scale (x軸方向) :</span>
		<span class="params" id="range1_value"></span>
	</div>
	<div class="params_box">
		<span>パラメータ2</span>
		<div><input type="range" class="range" id="range2" value="20" max="300"></div>
		<span>scale (y軸方向) :</span>
		<span class="params" id="range2_value"></span>
	</div>
</div>
<script>
// スライダの要素を取得し、イベントを付与する
let range1_dom = document.getElementById('range1');
let range2_dom = document.getElementById('range2');
// 各スライダーごとのイベントに、共通の関数を割り当てて処理する
range1_dom.addEventListener('input', change_range_slider);
range2_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);
	// DOMを取得する
	let test_tran_dom1 = document.getElementById('test_tran_dom1');
	console.log("test_tran_dom1 -> " + test_tran_dom1);
	// パラメータの値をリスト(配列)形式にして値を決定する
	let param1_value = (range1_dom.value / 10);
	let param2_value = (range2_dom.value / 10);
	let set_param_value = param1_value + ","
	                    + param2_value;
	console.log("set_param_value -> " + set_param_value);
	// SVG要素の x方向 y方向 を変更する
	test_tran_dom1.setAttribute('transform', 'scale(' + set_param_value + ')');
	
	// 画面出力
	let range1_value_dom = document.getElementById('range1_value');
	let range2_value_dom = document.getElementById('range2_value');
	range1_value_dom.innerHTML = param1_value + '倍';
	range2_value_dom.innerHTML = param2_value + '倍';
}
</script>
</body>
</html>
画面にアクセスすると、一つのSVG画像と、パラメータが2つ表示されます。
x方向のパラメータと、y方向のパラメータを動かすと、それぞれの軸方向に対して、SVG画像が伸縮します。
パラメータが独立しているので、縦横比はバラバラな値が適用されます。
縦横比を維持した形で伸縮する場合は、ロジックを書かなくても y 方向のパラメータを省略するだけで実現可能です。
また、このサンプルも前回同様にスライダーの値を10分の1しています。
