【Angular Material15】LegacyModuleのラジオボタンを使おう!

Angular_Material

みなさんこんにちは、現役エンジニアのサメハックです

未経験からWebエンジニアに転職し、
正社員として5年働いたのちフリーランスとして独立しました。

Angularの解説シリーズです。

今回はAngular MaterialのLegacyラジオボタンのCSSを上書きする方法について学んでいきましょう!

駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!

この記事を読むと・・・
  • Angular MaterialのLegacyModuleのCSSを上書きできる

※PCにnpm、nodeがインストールされている前提で記述します。
 yarn等をお使いの方は読み替えてください。

環境がない人はcodesansboxを使ってね!

実行環境

今回の記事はMaterial15が対象だよ!

Angular Material
UI component infrastructure and Material Design components for Angular web applications.

AngularMaterialのLegacyModuleのCSSを上書きしよう!

LegacyModuleとは

import { MatLegacyRadioModule as MatRadioModule } from '@angular/material/legacy-radio';

このように記述することで、Angularとしては非推奨ですが
古いバージョンのmaterialモジュールを使用することができます。

あえて古いバージョンを使う必要はないのですが、
最新バージョンは現状バグが多いので回避策として使用するケースがあります。

CSS設定を上書きしないとまともに動かないものが多いよ!

Angular MaterialのCSSを上書きする構文

Angular MaterialのCSSを”部分的に”上書きするには
以下のように記述する必要があります。

:host ::ng-deep {
  /* 変更したいスタイル */
}

これは公式サイトにも記述がある通り現在は非推奨となっていますが、
現状これ以外に部分的に上書きする手段が無いため、その前提で紹介します。

Legacyラジオボタンを上書きする構文

:host ::ng-deep {
  .mat-radio-group {
    // ラベル色
    .mat-radio-label {
      // ボタン間のマージン
      margin-right: 3rem;
      color: aqua;
    }
    // 未チェック時の枠線
    .mat-radio-outer-circle {
      border-color: aqua;
    }

    // ■ チェックドの設定
    .mat-radio-checked {
      // 中点の色
      .mat-radio-inner-circle {
        background-color: red;
      }
      // チェックドの際の枠線の色
      .mat-radio-outer-circle {
        border-color: red;
      }
    }

    // ■ disabledの設定
    .mat-radio-disabled {
      // disabledの際のラベルの色
      .mat-radio-label {
        color: darkgray;
      }
      // disabledの際の枠線の色
      .mat-radio-outer-circle {
        border-color: darkgray;
      }
    }
  }
}

説明が難しいですが、AngularMaterialを使うと
通常はCSSがカプセル化されて上書きできない様になっているのですが
デベロッパーツールを使うと、クラス名が特定できるので、
それらを指定してスタイルを上書きしています。

色は好きなものを設定してね!

ng-deepで上書きする際の注意点※超重要

先程の構文をそのまま使用してしまうと、
画面に表示されているすべてのコンポーネントの
スタイルが上書きされてしまいます。

これを回避するためには、以下のように
クラス名やIDを指定してスタイルを適用することを強く推奨します。

:host ::ng-deep {
  クラス名/ID名 {
   .mat-radio-group {
      // 省略
    }
  }
}

実際に動かしてみよう!

【Angular15】Angular,CLI,Materialのバージョンアップをしよう!
バージョンが重要なので、15未満のバージョンを使っている場合はアップデートしてね!

初期設定

アプリケーションの作成

ng new 好きなディレクトリ名
cd 作成したディレクトリ

Materialのインポート

ng add @angular/material
テーマカラーとアニメーションは好きな項目を選択してね!

app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

// 非推奨なのでエディタによっては斜線が付きます。
import { MatLegacyRadioModule as MatRadioModule } from '@angular/material/legacy-radio';

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    MatRadioModule,
  ],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}
エディタによっては斜線がつくけど動かせるよ!

app.component.html

<section>
  <div class="">
    <p>デフォルトのラジオボタン</p>
    <mat-radio-group aria-label="Select an option">
      <mat-radio-button value="1" checked>Option 1</mat-radio-button>
      <mat-radio-button value="2">Option 2</mat-radio-button>
      <mat-radio-button value="3" disabled>Option 3</mat-radio-button>
    </mat-radio-group>
  </div>
  <br />

  <div id="radio-wrap">
    <p>オリジナルのラジオボタン</p>
    <mat-radio-group aria-label="Select an option">
      <mat-radio-button value="1" checked>Option 1</mat-radio-button>
      <mat-radio-button value="2">Option 2</mat-radio-button>
      <mat-radio-button value="3" disabled>Option 3</mat-radio-button>
    </mat-radio-group>
  </div>
</section>

app.component.scss

:host ::ng-deep {
  #radio-wrap {
    .mat-radio-group {
      // ラベル色
      .mat-radio-label {
        // ボタン間のマージン
        margin-right: 3rem;
        color: aqua;
      }
      // 未チェック時の枠線
      .mat-radio-outer-circle {
        border-color: aqua;
      }

      // ■ チェックドの設定
      .mat-radio-checked {
        // 中点の色
        .mat-radio-inner-circle {
          background-color: red;
        }
        // チェックドの際の枠線の色
        .mat-radio-outer-circle {
          border-color: red;
        }
      }

      // ■ disabledの設定
      .mat-radio-disabled {
        // disabledの際のラベルの色
        .mat-radio-label {
          color: darkgray;
        }
        // disabledの際の枠線の色
        .mat-radio-outer-circle {
          border-color: darkgray;
        }
      }
    }
  }
}

動作確認

ng serve -o

これで同じものが出来上がるはずです。

デフォルトのものはそもそもまともに動かないよ!

GitHubのサンプルコード

今回作ったものはGitHubにあげているので
使いたい人は是非ダウンロードしてみてください。

GitHub - same-hack/Angular_Material15_Legacy
Contribute to same-hack/Angular_Material15_Legacy development by creating an account on GitHub.

まとめ

  • 非推奨だが、古いバージョンのmaterialモジュールの使用が可能
  • Materialの上書きにはng-deepを使用する
  • 公式的には非推奨となった方法だが、代替手段は現状ない

満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈

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