6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BlazorAdvent Calendar 2022

Day 3

テキストをグラデーション表示する Blazor コンポーネントを作り、NuGet パッケージにして再利用する

Last updated at Posted at 2022-12-03

イントロダクション

最近は、Web ページ上でテキストをグラデーション付きで表示するの、流行っているのでしょうか?

https://blazor.net
image.png

https://asp.net
image.png

https://dotnet.microsoft.com/download/dotnet
image.png

この流行に乗るべく、上図のようにテキストをグラデーション表示する Blazor コンポーネントを作ってみました!

Razor クラスライブラリとして作る

作成する Blazor コンポーネントは Razor クラスライブラリのプロジェクトとして作成し、任意の Blazor アプリケーションプロジェクトから参照して使えるようにしたいと思います。ライブラリの名前は "GradatedText" としましょう。対象とする .NET のバージョンですが、今日現在の最新版は 2022年11月にリリースされた .NET 7 であるものの、.NET 6 も 2024年11月12日までサポートされる長期サポート対象 (LTS, Long Term Support) なので、.NET 6 を対象としましょう。.NET 6 対象の Razor クラスライブラリは、.NET 7 の Blazor アプリケーションからも普通に使えますので。ということで、下記コマンドを実行して、"GradatedText" Razor クラスライブラリのプロジェクトを作成します。

> dotnet new razorclasslib -n GradatedText -f net6.0
...

続けて、この Razor クラスライブラリのプロジェクトフォルダに、GradatedText.razor Razor コンポーネントファイルを新規作成しましょう。

> cd ./GradatedText
> touch GradatedText.razor

GradatedText.razor をテキストエディタで開き、以下のようにマークアップします。

GradatedText.razor
<span class="gradated-text">
    @ChildContent
</span>

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}

ここでやっていることは単純で、GradatetText コンポーネントの子コンテンツを gradated-text CSS クラスが付与された <span> 要素でくるんでレンダリングするだけですね。詳細は公式ドキュメントサイトの 「子コンテンツのレンダリング フラグメント」(下記リンク先)を参照ください。

続けて CSS スタイルファイルを用意します。この GradatedText コンポーネント内の要素に適用したい CSS スタイルを定義するので、Razor コンポーネントのファイル名 + ".css" というファイル名で CSS スタイルファイルを作成します。

> touch GradatedText.razor.css

GradatedText.razor.css をテキストエディタで開き、以下のように CSS スタイル定義を記述します。

GradatedText.razor.css
.gradated-text {
    display: inline-block;
    background: linear-gradient(128.87deg,#9780e5 14.05%,#e666cc 89.3%);
    background: -webkit-linear-gradient(38.87deg,#9780e5 14.05%,#e666cc 89.3%);
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
    text-fill-color: transparent;
}

上記 CSS スタイル定義が、この GradatedText コンポーネントのキモで、同コンポーネント内の gradated-text CSS クラスが適用されている要素に対しテキストをグラデーション表示するようスタイル定義するものですね。CSS でテキストをグラデーション表示する方法については、下記リンク先のサイトの説明を参照しました。

こうして作成された、Razor コンポーネントのファイル名 + ".css" のファル名の CSS スタイル定義は、その基の名前の Razor コンポーネントにのみ適用されます。この仕組みについて詳しくは公式ドキュメントサイトの 「CSS の分離」(下記リンク先) を参照ください。

以上で GradatedText コンポーネントの実装は終わりですね。なお、dotnet new razorclasslib ~ コマンドで作成した Razor クラスライブラリプロジェクトには、デモンストレーション用にいくつか既にコンポーネントや JavaScript ファイルなどが追加されていますので、しかしそれらは不要ですから、削除しておきます。

> rm ./Componen.*
> rm ./ExampleJsInterop.cs
> rm ./wwwroot -r

動作を確認

早速動作確認してみましょう。

動作確認用の Blazor WebAssembly プロジェクトを作成し (プロジェクト名は "BlazorWasmApp1" としてみました)、続けて GradatedText Razor クラスライブラリプロジェクトを参照するよう、いま作成した Blazor WebAssembly プロジェクトにプロジェクト参照を追加します。

> cd ..
> dotnet new blazorwasm -n BlazorWasmApp1
...
> cd ./BlazorWasmApp1
> dotnet add reference ../GradatedText
...

GradatedText コンポーネントを簡素に使用できるよう、この Blazor WebAssembly プロジェクト内の _Imports.razor をテキストエディタで編集し、GradedText プロジェクトの名前空間を開いておきます。

_Imports.razor
...
@using GradatedText

準備が整ったので、Blazor WebAssembly の既定のプロジェクトテンプレートによって生成された、Index.razor の中で、GradatedText コンポーネントを使ってみましょう。グラデーション表示したいコンテンツを <GradatedText> で囲むだけです。具体的には、下記 h1 タグの箇所を、

Pages/Index.razor
...
<h1>
    Hello, world!
</h1>
...

下記のように書き換えてみました。

Pages/Index.razor
...
<h1>
    <GradatedText>Hello, world!</GradatedText>
</h1>
...

これでファイルを保存し、実行してみると...

> dotnet watch
...

テキストがグラデーション表示されるようになりました!

image.png

NuGet パッケージ化する

以上で再利用可能な GradatedText コンポーネントは実装できたのですが、しかし実際にこの GradatedText コンポーネントをあちこちの Blazor アプリケーションプロジェクトから使いたいというときに、これら GradatedText Razor クラスライブラリプロジェクトのソースファイル一式をコピーしてきてプロジェクト参照を追加して使うのはナンセンスですよね。

そこで、この GradatedText Razor クラスライブラリを NuGet パッケージ化しましょう。

NuGet パッケージとは、つまるところ、.NET の DLL や各種必要ファイル (今回のケースですと .css ファイルとか) を Zip 形式のアーカイブに圧縮収録して、ファイル名の拡張子を ".nupkg" にしたファイルです。で、.NET SDK の仕組みにより、プロジェクトが必要とする NuGet パッケージをそのパッケージ名 (パッケージ ID) から NuGet パッケージの所在 ("パッケージソース") に取りに行って利用可能となるカラクリですね。

Razor クラスライブラリプロジェクトから NuGet パッケージを生成するのは簡単です。以下のように対象となるライブラリがあるフォルダで、dotnet pack コマンドを実行するだけです(下記実行例)。なお、リリース構成でビルドしてパッケージ化するよう、-c Release のオプション指定を忘れずに。

> cd ../GradatedText
> dotnet pack -c Release

これで、GradatedText プロジェクトフォルダ以下、bin/Release フォルダ内に、NuGet パッケージファイル「GradatedText.1.0.0.nupkg」が生成・出力されます!

あとはお好みの共有方法・配置先に、この NuGet パッケージを配置しておけば OK です。世界中どこからでも公に参照可能にしたいなら nuget.org に発行するのがよいでしょうし、GitHub Packages などの各種パッケージリポジトリサービスに配置することもあるでしょう。組織内のファイルサーバー上の共有フォルダに .nupkg ファイルを置いておくだけでも利用できますし、Google Drive や OneDrive などのクラウドストレージサービスおよびそのローカルストレージとの同期機能を利用して共有・配付することも可能です。詳しくは、2019年に書いた下記 Qiita 記事が参考になると思います。

まとめ

ということで、テキストをグラデーション表示する Blazor コンポーネントを作り、NuGet パッケージにして再利用できるようにしてみました。今回の作例、GradatedText コンポーネントは、名前空間の変更や、各種 NuGet パッケージメタデータ (Copyright とか説明とかパッケージアイコンとか) の付与、README ドキュメントの用意など、諸々調整を済ませた上で、nuget.org に一般公開しました (下記リンク先)。

ソースコード類一式は下記リンク先 GitHub リポジトリで公開しています。

まぁ、実際のところは、テキストをグラデーション表示したいというだけなら、こんな大仰なパッケージを使わずに、ささっと CSS を書いて適用して終わりだとは思います😅。でもまぁ、とにかく、これでグラデーションテキストの流行の波に乗れた、ってことでいいですよね!?

Happy Coding :)

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?