Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

【SVG】続・ちょっとだけSVGを試してみる【文字入れ】

 どうも!LSSです!!

 

先日の記事、

 

が色々と興味を持っていただけたようで^^

 

tn198403s.hatenablog.jp

カメさん(id:tn198403s)は早々にコードコピペを試していただいた上に、色を変えたり記載順を変えたりして、絵本仕立てにまでなりました!

 

arsinput.hatenablog.jp

アーシさん(id:arshii)はググって他のSVG要素も試みておられます。
先を越された!!www

 

カメさん、アーシさん、言及ありがとうございます^^

 

というわけで、LSSも続きをやってみる事にしました!

 

 

まず、こないだ作った画像

 

コード

<svg xmlns="http://www.w3.org/2000/svg" width="300" height="400" viewbox="0 0 300 400">
<rect x="0" y="0" width="300" height="400" fill="lightblue"></rect>
<circle cx="230" cy="70" r="40" fill="red"></circle>
<rect x="0" y="300" width="300" height="100" fill="yellowgreen"></rect>
</svg>

 

ここに、手を加えていきます!

 

 

文字を入れてみました

赤く熱く燃える

 

コード

<svg xmlns="http://www.w3.org/2000/svg" width="300" height="400" viewbox="0 0 300 400">
<rect x="0" y="0" width="300" height="400" fill="lightblue"></rect>
<circle cx="230" cy="70" r="40" fill="red"></circle>
<rect x="0" y="300" width="300" height="100" fill="yellowgreen"></rect>
<text x="20" y="100" style="font-size: 20px;">赤く熱く燃える</text>
</svg>

 

 <text x="20" y="100" style="font-size: 20px;">赤く熱く燃える</text>

 という一行を追加してみました。

 

x="20" y="100" 
が、文字を書き始める位置の指定になります。

 

style="font-size: 20px;"
で文字サイズを決めていますが…これってCSS??

 

 

試しにCSSプロパティを足して…

赤く熱く燃える

 

コード

<svg xmlns="http://www.w3.org/2000/svg" width="300" height="400" viewbox="0 0 300 400">
<rect x="0" y="0" width="300" height="400" fill="lightblue"></rect>
<circle cx="230" cy="70" r="40" fill="red"></circle>
<rect x="0" y="300" width="300" height="100" fill="yellowgreen"></rect>
<text x="20" y="100" style="font-size: 20px; font-weight: bold;">赤く熱く燃える</text>
</svg>

 

font-weight: bold;
を追加してみると、文字が太くなりました!

 

やっぱりstyle=の内容はCSSのようですね^^
こんな風にSVGにCSSが割り込むのかぁ。

 

 

線を引いてみる

赤く熱く燃える

 

コード

<svg xmlns="http://www.w3.org/2000/svg" width="300" height="400" viewbox="0 0 300 400">
<rect x="0" y="0" width="300" height="400" fill="lightblue"></rect>
<circle cx="230" cy="70" r="40" fill="red"></circle>
<rect x="0" y="300" width="300" height="100" fill="yellowgreen"></rect>
<text x="20" y="100" style="font-size: 20px; font-weight: bold;">赤く熱く燃える</text>
<path d="M 50 200 L 250 150" stroke="black" stroke-width="3" fill="none"></path>
</svg>

 

<path d="M 50 200 L 250 150" stroke="black" stroke-width="3" fill="none"></path>
を追加してみました。

 

線を引くSVG要素は
<line>…直線
<polyline>…折れ線
などもありますが、ここでは<path>を使ってみます^^

 

d="M 50 200 L 250 150"
で、線の始点と終点を指定しています。

 

M 50 200
x座標 50 、y座標 200 の地点から、

L 250 150
x座標 250 、y座標 150 の地点まで線を引く、という指定になります。


なお、これを
L 250 150 100 100 50 150
のように「x座標とy座標のペア」を続けて書く事で、 

赤く熱く燃える

↑こんな風に「50,100 から 250,150 に線を引き、そこから 100,100 に線を引き、そこから 50,150 に線を引く」という風に折れ線を描く事ができます。

 

stroke="black"
で「線の色を黒」と指定、
stroke-width="3"
で「線の太さは3ピクセル」と指定、
fill="none"
で「中は塗りつぶさない」と指定しています。

 

ところで、ちょっと気づいたのですが、<path>タグの書式、手元の情報からは
<path オプション />
のように書く事になっていましたが、はてなブログHTML編集画面に入れると、
<path オプション></path>
に勝手に変更されてしまいますw

<svg>タグは削除されるのに、その中身を監視しているのが不思議な感じがしますね

 

 

ベジェ曲線

赤く熱く燃える

 

コード

<svg xmlns="http://www.w3.org/2000/svg" width="300" height="400" viewbox="0 0 300 400">
<rect x="0" y="0" width="300" height="400" fill="lightblue"></rect>
<circle cx="230" cy="70" r="40" fill="red"></circle>
<rect x="0" y="300" width="300" height="100" fill="yellowgreen"></rect>
<text x="20" y="100" style="font-size: 20px; font-weight: bold;">赤く熱く燃える</text>
<path d="M 50 200 Q 200 200 250 150" stroke="black" stroke-width="3" fill="none"></path>
</svg>

 

さっきのコードで、
L 250 150
としていたところを、
Q 200 200 250 150
に置き換えました。

 

線の最初と最後の座標は同じですが、途中でひん曲がっていますねw

 

これ、「ベジェ曲線」っていうもので、名前だけは聞いた事があるものの、詳しいところは分かりませんw

SVGでは「二次ベジェ曲線」と「三次ベジェ曲線」を使う事ができ、
Q
で描くのは「二次ベジェ曲線」のほうになります。

 

Q 200 200 250 150
の意味としては、「座標 200 200 を制御点として、座標 250 150 まで線を引く」という指定になります。
「制御点って…何?」となりますが…「そっちのほうに引っ張る」という感じかな?って認識していますw

 

なお、三次ベジェ曲線はQの代わりにCを使い、制御点が2つになります。
(1つめの制御点のx座標・y座標、2つめの制御点のx座標・y座標、終点のx座標・y座標、と6つの数字を並べる事になります)

 

 

三次ベジェ曲線もやってみます

赤く熱く燃える

 

コード

<svg xmlns="http://www.w3.org/2000/svg" width="300" height="400" viewbox="0 0 300 400">
<rect x="0" y="0" width="300" height="400" fill="lightblue"></rect>
<circle cx="230" cy="70" r="40" fill="red"></circle>
<rect x="0" y="300" width="300" height="100" fill="yellowgreen"></rect>
<text x="20" y="100" style="font-size: 20px; font-weight: bold;">赤く熱く燃える</text>
<path d="M 50 200 C 100 150 200 200 250 150" stroke="black" stroke-width="3" fill="none"></path>
</svg>

 

こういう事ですね。

制御点が2つになった事で、途中で「くねっ、くねっ」と2回、曲がってる線になりました!

 

 

作った波線パスに沿って文字を入れる大技!

赤く熱く燃えるお日様

 

コード

<svg xmlns="http://www.w3.org/2000/svg" width="300" height="400" viewbox="0 0 300 400">
<rect x="0" y="0" width="300" height="400" fill="lightblue"></rect>
<circle cx="230" cy="70" r="40" fill="red"></circle>
<rect x="0" y="300" width="300" height="100" fill="yellowgreen"></rect>
<defs>
<path id="namisen" d="M 50 200 C 100 150 200 200 250 150" stroke="black" stroke-width="3" fill="none"></path>
</defs>
<text style="font-size: 20px; font-weight: bold;">
<textpath xlink:href="#namisen">赤く熱く燃えるお日様</textpath>
</text>
</svg>

 

ここで大技です!

 

<defs>
というのを使ってみました。

これは「定義する」もので、<defs></defs>の間に、先ほど作った三次ベジェ曲線のpathを入れました。

<defs>の中に入れたものは「定義される」だけで終わるので、そのままでは描画されず、別に呼び出して使用する事になります。

 

呼び出すのに名前が必要なため、
<path id="namisen" d="M 50 200 C 100 150 200 200 250 150" stroke="black" stroke-width="3" fill="none"></path>
のように「id」をつけました。

 

そして、
<text style="font-size: 20px; font-weight: bold;">
<textpath xlink:href="#namisen">赤く熱く燃えるお日様</textpath>
</text>

<text>タグから位置指定(xとyの指定)を削除して、文字を入れていた部分に
<textpath>タグを入れています。

 

この<textpath>タグが、「文字をパスに沿って配置」してくれるもので
xlink:href="#namisen"
という書き方で、<defs>で定義した中にあるパスを呼び出して使用しているんですね^^

 

 

あとがき

という事で、CSSでは真似できない(多分)、SVGならではの「文字を曲線上に配置」するところまで出来ました^^

 

まだまだSVGで出来る事は色々あるようで、勉強のしがいがありますw

 

なお、今日、

この本を買ってきました^^

 

 

 

ってなとこで、今回はこのへんで!

次回もまた、よろしくお願いします^^