【テキスト縁取り】テキストの周りに枠線をつける方法【簡単キレイ】

未分類
Just a moment...

結論から言うとつぎのようにやります

HTML

<h1 class="strokeBlack" style="--word:'テキストデコレーション!';">
テキストデコレーション!
</h1>

<h2 class="strokeRed" style="--word:'長い文章でも対応できるか?';">
長い文章でも対応できるか?
</h2>

<p class="strokeBlue" style="--word:'ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト';">
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
</p>

CSS

.strokeRed{
-webkit-text-stroke-width: 4px;
-webkit-text-stroke-color: red;
}
.strokeBlack{
-webkit-text-stroke-width: 8px;
-webkit-text-stroke-color: black;
}
.strokeBlue{
-webkit-text-stroke-width: 2px;
-webkit-text-stroke-color: blue;
}

[style^=--word]{
position:relative;
}

[style^=--word]::before{
content:var(--word);
position:absolute;
top:0;
left:0;
z-index:1;
-webkit-text-stroke-width: 0;
color:#fff;
}

こうすると次のようになります。

 

解説

-webkit-text-strokeだけだと、あんまり綺麗な表示にならないのは周知のとおり。
かといって、text-shadowもぼやけた表示になってしまいます。

それを改善したのがこちらのコードです。

HTMLのstyle属性でCSS変数を設定することにより、before要素の中身を書き換える、と言うことをしています。

個人的にはすごい発見をしてしまった・・・と思いました。
まあChatGPTを触ってて、そのコードの中でこれやってて「そんなことできるんかいな!」となっただけなんですが。

SVGで枠線をつけるなどのハックはありますが、テキストとしてのCSS装飾ができないなどの難点がありました。
その点これであればいろいろと応用がききます。

テキストの線に関しては、場所によってやりたいことが変わると思いますので、CSSでクラス指定しています。

ぜひともこちらのコード活用してください。

動作デモ

Just a moment...

 

改善案

このコードだと、変数は自分で書き込まなければいけません。
「.textStroke」というクラスがあったらstyle属性の値を付与する、というJavaScriptがあればさらに便利だと思います。

また、after要素を組み合わせれば2重の装飾をかけることも可能です。

タイトルとURLをコピーしました