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重の装飾をかけることも可能です。