クリッピング マスキング について(その6) – clipPathUnitsの指定について

javascript

クリッピング マスキング について(その6) – clipPathUnitsの指定について

クリッピングパスその6は、clipPathUnitsの指定について試してみます。

clipPathUnitsは、clipPathのDOMを記述する際の、パラメータとして追加します。

今回のサンプルでは、以前の投稿(クリッピング マスキング について(その2) – クリッピングパスに画像を使用した場合)で使用したHTMLソースをもとに、clipPathUnitsの記述を追記して動きを確認します。

(一部抜粋)

<defs>
    <clipPath id="test_clip_dom1" clipPathUnits="objectBoundingBox">
        <path
            id="test_clip_path1"
            d='M16 238 L236 246 L242 22 Z'
            rx="0.5"
            ry="0.5"
            cx="0.5"
            cy="0.5"
            stroke="#999999"
            stroke-width="1"
            fill="#cccccc"
        />

        <ellipse
        	id="dom_ellipse"
            cx="0.5"
            cy="0.5"
            rx="0.2"
            ry="0.2"
            stroke="#000000"
            stroke-width="1"
            fill="none"
        />

    </clipPath>
</defs>

追記したパラメータは下記の場所で、

<clipPath id="test_clip_dom1" clipPathUnits="objectBoundingBox">

「clipPathUnits=”objectBoundingBox”」という指定をしています。

この記述を省略するとデフォルト値として、userSpaceOnUse という値が暗黙的に適用されます。
デフォルトの場合はクリッピングする要素を「座標の値で指定」します。

今回の例では、objectBoundingBox として、クリッピングする要素を「比率(100分率)で指定」します。

例えば、0を指定すると0%、0.5を指定すると50%、1を指定すると100%、というように作用します。

サンプルでは、スライダをつけてクリッピングする側の要素(楕円)の
「位置(x軸、y軸)」「サイズ(x軸、y軸)」を100分率で動的に確認できるものを用意しました。

下記、サンプルの全体です。

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

<style>
.params_box {
    font-size : 0.8em;
    padding-bottom: 10px;
}
.range {
    width: 400px;
}
.code_view {
    font-size : 0.8em;
    padding: 5px;
    background-color: #000000;
    color: #ffffff;
}
#code_view1, #code_view2, #code_view3, #code_view4 {
    color: #ff0000;
}
</style>

</head>
<body>

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

    <defs>
        <clipPath id="test_clip_dom1" clipPathUnits="objectBoundingBox">
            <path
                id="test_clip_path1"
                d='M16 238 L236 246 L242 22 Z'
                rx="0.5"
                ry="0.5"
                cx="0.5"
                cy="0.5"
                stroke="#999999"
                stroke-width="1"
                fill="#cccccc"
            />

            <ellipse
            	id="dom_ellipse"
                cx="0.5"
                cy="0.5"
                rx="0.2"
                ry="0.2"
                stroke="#000000"
                stroke-width="1"
                fill="none"
            />

        </clipPath>
    </defs>
    
    <image href="./sima.jpg" clip-path="url(#test_clip_dom1)" width="400" height="226"/>
    
</svg>

<div>

    <div class="params_box">
        <span>param1 : </span><span class="params" id="range1_value"></span>
        <div><input type="range" class="range" id="range1" value="50" max="100"></div>
    </div>

    <div class="params_box">
        <span>param2 : <span class="params" id="range2_value"></span></span>
        <div><input type="range" class="range" id="range2" value="50" max="100"></div>
    </div>

    <div class="params_box">
        <span>param3 : <span class="params" id="range3_value"></span></span>
        <div><input type="range" class="range" id="range3" value="20" max="100"></div>
    </div>

    <div class="params_box">
        <span>param4 : <span class="params" id="range4_value"></span></span>
        <div><input type="range" class="range" id="range4" value="20" max="100"></div>
    </div>

</div>

<div class="code_view">
&lt;clipPath id="dom_ellipse"&gt;<br />
  &lt;path<br />
    id="dom_ellipse"<br />
    cx="<span id="code_view1"></span>"<br />
    cy="<span id="code_view2"></span>"<br />
    rx="<span id="code_view3"></span>"<br />
    ry="<span id="code_view4"></span>"<br />
    stroke="#000000"<br />
    stroke-width="1"<br />
    fill="none"<br />
  /&gt;<br />
&lt;/clipPath&gt;<br />
</div>

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

// 各スライダーごとのイベントに、共通の関数を割り当てて処理する
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);

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

    // クリップする側の要素を取得する
    let dom_ellipse = document.getElementById('dom_ellipse');
    console.log("dom_ellipse -> " + dom_ellipse);

    // DOM要素 「id="dom_ellipse" 」の cx, cy, rx, ry のパラメータを動的に変更する
    dom_ellipse.setAttribute('cx', (range1_dom.value / 100));
    dom_ellipse.setAttribute('cy', (range2_dom.value / 100));
    dom_ellipse.setAttribute('rx', (range3_dom.value / 100));
    dom_ellipse.setAttribute('ry', (range4_dom.value / 100));

    // パラメータ値を出力
    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');

    range1_value_dom.innerHTML = range1_dom.value;
    range2_value_dom.innerHTML = range2_dom.value;
    range3_value_dom.innerHTML = range3_dom.value;
    range4_value_dom.innerHTML = range4_dom.value;

    // DOM要素 「id="dom_ellipse" 」の cx, cy, rx, ry のパラメータを出力する
    let code_view1_dom = document.getElementById('code_view1');
    let code_view2_dom = document.getElementById('code_view2');
    let code_view3_dom = document.getElementById('code_view3');
    let code_view4_dom = document.getElementById('code_view4');
    code_view1_dom.innerHTML = (range1_dom.value / 100);
    code_view2_dom.innerHTML = (range2_dom.value / 100);
    code_view3_dom.innerHTML = (range3_dom.value / 100);
    code_view4_dom.innerHTML = (range4_dom.value / 100);
}

</script>

</body>
</html>

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

画面にアクセスすると、初期表示の状態で、

位置が画面全体の x = 0.5(画面の50%の大きさ) 、 y = 0.5(画面の50%の大きさ) 、
サイズが x = 0.2(画面左から20%の位置) 、 y = 0.2(画面上から20%の位置) 、に

クリッピング要素の楕円が表示されることがわかります。

また、スライダを操作すると、その下に表示されるDOM要素のソースが変化するので、
objectBoundingBox 指定時の値が100分率(%)で指定され、画面にどのように作用するかが動的にわかります。

下記は、スライダの操作例です。

コメントを残す

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