Angular+sass(scss)에 의한 컬러 테마 전환 모범 사례

Angular+sass(scss)에 의한 컬러 테마 전환 모범 사례





이 기사는 Angular Advent Calendar 2018, 10 일째 기사입니다.

TL;DR


  • 온라인 데모
  • 코드 전량

  • 목표로 하고 싶은 것


  • 웹에서 각 요소의 색상을 즉시 전환하고 싶습니다
  • 전부 css(sass, 원래 scss)로 관리하고 싶다
  • 색상은 scss 변수로 한 곳에서 관리하고 싶습니다.
  • 이 시세에 addClass라든지, removeClass라든지 하고 싶지 않다…
  • 각 요소에 대해 테마별 css를 모두 정의하는 것도 유지할 수 없게 되고 싶지 않다.
  • 결론, 테마마다 정의한 색변수를 이용해, 그것을 스마트하게 전환해 주는 것

  • 쓰기 동기


  • 위의 요구 사항을 충족하는 구현이 검색되지 않았습니다
  • 자주 있는 것은, 요소 마다 색을 정의해, 상위 클래스(wrapper라든지)의 클래스를 removeClass, addClass로 바꾸는 것에 의한 전환 예.
  • 더 스마트하게 할 수 있을 뿐만 아니라 색도 변수화할 수 있어야 한다고 머리를 괴롭히고 일단 떨어뜨릴 곳을 발견했기 때문에 공유하고 싶다.

  • 생각한 구성


  • 1, Wrapper 클래스를 테마 분 생성한다. 단, 색의 정의는 1회만으로 한다.
  • 2, Wrapper 클래스를 Angular의 바인드에 의해 전환한다.

  • 코드 해설


  • 1, Wrapper 클래스를 테마 분 생성한다. 단, 색의 정의는 1회만으로 한다.
  • // 適当な値で変数を初期化しておく
    $back: #000000;
    $font: #000000;
    $bttn: #000000;
    $btnf: #000000;
    
    // テーマの数だけループする
    @for $i from 1 through 2 {
    
      .wrapper#{$i} {
        @if $i == 1 {
            // テーマごとに色を定義する,1回で良い.
            $back : #F4F3EE;
            $font : #463F3A;
            $bttn : #E0AFA0;
            $btnf : #FFFFFF;
        } @else {
            $back : #000000;
            $font : #FFFFFF;
            $bttn : #32FFFB;
            $btnf : #38005B;
        }
    
        // スタイリングは,テーマごとに切り替えなくてよい.
        background-color: $back;
        color: $font;
        width: 100%;
        height: 100%;
        padding: 0;
        margin: 0;
    
        .block{
          padding: 20px;
          h1 {
            font-size: 24px;
            padding: 0;
            margin: 0;
          }
          button {
            background-color: $bttn;
            color: $btnf;
          }
        }
      }
    }
    
    
  • 2, Wrapper 클래스를 Angular의 바인드에 의해 전환한다.

  • .html
    <!-- クラス名をバインドしている -->
    <div [(class)]="colorTheme">
      <div class="block">
        <h1>Change Color Theme with .scss and .ts</h1>
        <p>
          toggle and change theme :)
        </p>
      </div>
      <div class="block">
        <button mat-button>This is the Button</button>
      </div>
      <div class="block">
        <mat-slide-toggle (change)="changeColor($event)">
            On Dark
        </mat-slide-toggle>    
      </div>
    </div>
    
    

    .ts
    
    import { Component } from '@angular/core';
    import { MatSlideToggle } from '@angular/material';
    
    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: [ './app.component.scss' ]
    })
    export class AppComponent  {
      name = 'Angular';
    
      // バインドするテーマ
      public colorTheme = 'wrapper1';
    
      constructor(){
        this.colorTheme = 'wrapper1';
      }
    
      // toggle event
      // トグルされるたびに,バインドするクラス名を変更する
      public changeColor(e){
        if(e.checked) {
          // to dark
          this.colorTheme = 'wrapper2';
        } else {
          // to light
          this.colorTheme = 'wrapper1';
        }
      }
    }
    

    끝에


  • 이 구조의 뛰어난 포인트는, 색의 정의를 1극 집중 관리하면서, 색의 전환을 실시할 수 있는 곳이다.
  • 하지만 래퍼의 전환이나 scss의 루프 등은 결코 가독성이 높지 않기 때문에 좀 더 개량을 할 수 있으면 좋겠다.


  • 내일은 @kimamula씨의 기사입니다.
    잘 부탁드립니다.

    좋은 웹페이지 즐겨찾기