AngularJS에서 CSS 스타일을 조건부로 적용하려면 어떻게합니까?


309

Q1. 기본 "삭제"버튼을 누르기 전에 사용자가 삭제 표시 한 각 "항목"의 모양을 변경하고 싶다고 가정합니다. 이 즉각적인 시각적 피드백을 통해 속담 "확실합니까?"대화 상자가 필요하지 않습니다. 사용자는 확인란을 선택하여 삭제해야 할 항목을 나타냅니다. 확인란을 선택하지 않으면 해당 항목이 다시 원래 모양으로 되돌아갑니다.

CSS 스타일을 적용하거나 제거하는 가장 좋은 방법은 무엇입니까?

Q2. 각 사용자가 내 사이트를 표시하는 방법을 개인화 할 수 있도록 허용하려고한다고 가정하십시오. 예를 들어, 고정 된 글꼴 크기 세트에서 선택하고 사용자 정의 가능한 전경색 및 배경색 등을 허용합니다

사용자가 선택 / 입력하는 CSS 스타일을 적용하는 가장 좋은 방법은 무엇입니까?


답변:


485

Angular는 조건부 / 동적으로 CSS 스타일을 조작하기위한 여러 가지 기본 제공 지시문을 제공합니다.

  • ng-class- CSS 스타일 세트가 정적 / 미리 알려진 경우 사용
  • ng-style- 스타일 값이 동적으로 변경 될 수 있으므로 CSS 클래스를 정의 할 수없는 경우에 사용하십시오. 스타일 값의 프로그래밍 가능한 제어를 생각하십시오.
  • ng-show ng-hide- 표시하거나 숨길 필요가있는 경우 사용 (CSS 수정)
  • ng- if-버전 1.1.5의 새로운 기능, 단일 조건 만 확인해야하는 경우 더 자세한 ng- 스위치 대신 사용 (DOM 수정)
  • ng-switch- 상호 배타적 인 ng-show를 사용하는 대신 사용 (DOM 수정)
  • ng-disabled ng-readonly- 양식 요소 동작을 제한하는 데 사용
  • ng-animate- 버전 1.1.4의 새로운 기능, CSS3 전환 / 애니메이션을 추가하는 데 사용

일반적인 "각도"는 사용자 입력 / 조작을 받아 들일 (즉, ng-model 사용) UI 요소에 모델 / 범위 속성을 연결 한 다음 해당 모델 속성을 위에서 언급 한 내장 지시어 중 하나에 연결합니다.

사용자가 UI를 변경하면 Angular는 페이지의 관련 요소를 자동으로 업데이트합니다.


Q1은 ng-class에 좋은 사례로 들립니다. CSS 스타일은 클래스에서 캡처 할 수 있습니다.

ng-class 는 다음 중 하나로 평가되어야하는 "표현식"을 허용합니다.

  1. 공백으로 구분 된 클래스 이름의 문자열
  2. 클래스 명의 배열
  3. 부울 값에 대한 클래스 이름의 맵 / 객체

일부 배열 모델에서 ng-repeat를 사용하여 항목이 표시되고 항목의 확인란을 선택하면 pending-delete클래스 를 적용한다고 가정합니다 .

<div ng-repeat="item in items" ng-class="{'pending-delete': item.checked}">
   ... HTML to display the item ...
   <input type="checkbox" ng-model="item.checked">
</div>

위에서 우리는 ng-class expression type # 3-클래스 이름을 부울 값으로 매핑하는 객체를 사용했습니다.


Q2는 ng 스타일의 좋은 사례처럼 들립니다. CSS 스타일은 동적이므로 클래스를 정의 할 수 없습니다.

ng-style 은 다음과 같이 평가되어야하는 "표현식"을 허용합니다.

  1. CSS 스타일 이름의 CSS 값에 대한 맵 / 객체

고안된 예제의 경우 사용자가 배경색의 texbox에 색상 이름을 입력 할 수 있다고 가정합니다 (jQuery 색상 선택기가 훨씬 더 좋을 것임).

<div class="main-body" ng-style="{color: myColor}">
   ...
   <input type="text" ng-model="myColor" placeholder="enter a color name">


위의 두 가지 모두에 대한 바이올린 .

바이올린에는 ng-showng-hide 의 예제도 포함되어 있습니다 . 배경색이 분홍색으로 바뀌는 것 외에도 확인란을 선택하면 일부 텍스트가 표시됩니다. 텍스트 상자에 '빨간색'을 입력하면 div가 숨겨집니다.


이 답변은 훌륭합니다! click 이벤트가 clicked 요소가 아닌 영역에서 클래스를 변경 / 추가하는 경우 차이점이 무엇인지 jsfiddle을 통해 알려주시겠습니까? 페이지의 다른 곳에서 div를 말하십시오.
tehaaron


위대한 대답. Btw, ng-style에 각도 필터를 적용 해 보셨습니까?
Evi Song

이 질문에 대한 최근 답변에 방금 추가 한 Q2와 관련된 추가 옵션을 추가하는 것이 좋습니다.
개빈 팔머

105

전체 테이블에 이미 하나의 클래스가 적용된 경우 테이블 요소 내부에 클래스를 적용 할 때 문제가 있음을 발견했습니다 (예 : 홀수 행에 적용된 색상 <myClass tbody tr:nth-child(even) td>). 당신이 가진 요소를 검사 할 때 것으로 보인다 개발자 도구 는이 element.style할당 된 스타일이 없습니다. 따라서을 사용하는 대신을 사용해 ng-class보았습니다 ng-style.이 경우 새로운 CSS 속성이 안에 나타납니다 element.style. 이 코드는 저에게 효과적입니다.

<tr ng-repeat="element in collection">

    [...amazing code...]

    <td ng-style="myvar === 0 && {'background-color': 'red'} ||
                  myvar === 1 && {'background-color': 'green'} ||
                  myvar === 2 && {'background-color': 'yellow'}">{{ myvar }}</td>

    [...more amazing code...]

</tr>

Myvar 은 내가 평가하는 것이며 각 경우 <td>myvar 값 에 따라 각각의 스타일을 적용하여 전체 테이블의 CSS 클래스에 의해 적용된 현재 스타일을 덮어 씁니다.

최신 정보

예를 들어, 페이지를 방문하거나 다른 경우에 클래스를 테이블에 적용하려면 다음 구조를 사용할 수 있습니다.

<li ng-class="{ active: isActive('/route_a') || isActive('/route_b')}">

기본적으로 ng-class 를 활성화해야하는 것은 적용 할 클래스와 true 또는 false 문입니다. True 는 클래스를 적용하고 false 는 적용 하지 않습니다. 그래서 여기에 우리는 페이지의 경로와 두 검사가 또는 우리에 그렇다면, 그들 사이 /route_a 또는 우리에 route_b활성 클래스가 적용됩니다.

이것은 오른쪽에 논리 함수를 사용하여 true 또는 false를 반환합니다.

첫 번째 예에서 ng-style 은 세 가지 문장으로 구성됩니다. 이들 모두가 거짓이면 스타일이 적용되지 않지만 논리에 따라 하나 이상이 적용되므로 논리 표현식은 어떤 변수 비교가 참인지 확인하고 비어 있지 않은 배열이 항상 참이므로 논리식은 전체 응답에 OR 을 사용한다는 점을 고려하면 배열을 반환으로 반환하고 하나만 true로 남겨두고 나머지 스타일이 적용됩니다.

그건 그렇고, isActive () 함수를 제공하는 것을 잊었습니다.

$rootScope.isActive = function(viewLocation) {
    return viewLocation === $location.path();
};

새로운 업데이트

여기에 정말 유용한 것이 있습니다. 변수 값에 따라 클래스를 적용해야하는 경우 (예 :의 내용에 따라 아이콘) div다음 코드를 사용할 수 있습니다 (에서 매우 유용함 ng-repeat).

<i class="fa" ng-class="{ 'fa-github'   : type === 0,
                          'fa-linkedin' : type === 1,
                          'fa-skype'    : type === 2,
                          'fa-google'   : type === 3 }"></i>

글꼴 멋진 아이콘


다른 어떤 영감을받은 언어와 마찬가지로 AND가 의미하는 이상한 구문은 무엇입니까?
Pizzaiola Gorgonzola

3
@PizzaiolaGorgonzola &&는 AND와 ||를 의미합니다. OR을 의미합니다. 거의 사건 / 스위치 진술로 단락 논리를 사용하는 영리한 해킹입니다 ...
Stein G. Strindhaug

고마워요 나는 그 세부 사항을 깨닫지 못했다.
Timbergus

새로운 업데이트 섹션은 매력처럼 작동했습니다! +1!
Matias

New Update에서 언급 한 ng-class 예제를 사용하여 저에게 매우 효과적이었습니다. 아주 매끄럽다
Acewin

34

ng-class를 사용할 수 없을 때 (예 : SVG 스타일링) 잘 작동합니다.

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"

(ng-attr-를 사용하려면 최신 불안정한 각도에 있어야한다고 생각합니다. 현재 1.1.4입니다.)

AngularJS + SVG 작업에 관한 기사를 게시했습니다. 이 문제와 다른 많은 문제에 대해 이야기합니다. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS


1.1.4 문서 에 ng-attr에 대한 언급이 없습니다 . 링크가 있습니까?
마크 Rajcok

죄송합니다. 링크가 없습니다. 정확한 페이지를 기억할 수는 없지만 Angular 포럼을 따라 그것에 대해 알았습니다.
Ashley Davis

1
최신 문서 (v1.2) ng-attr-지시문 페이지 의 섹션 ngAttr 속성 바인딩 에 대해 설명 합니다 .
Mark Rajcok

1.2에서는 이것이 큰 해답이됩니다. ng-class논리를 수행하지는 않지만 수행 ng-attr-class합니다. 둘 다 용도가 있지만 많은 개발자가 찾고있을 것입니다 ng-attr-class.
Hylianpuffball

여기에 제공된 다른 솔루션이 실패했을 때 잘 작동했습니다. 감사합니다.
dps

13
span class="circle circle-{{selectcss(document.Extension)}}">

그리고 코드

$scope.selectcss = function (data) {
    if (data == '.pdf')
        return 'circle circle-pdf';
    else
        return 'circle circle-small';
};

CSS

.circle-pdf {
    width: 24px;
    height: 24px;
    font-size: 16px;
    font-weight: 700;
    padding-top: 3px;
    -webkit-border-radius: 12px;
    -moz-border-radius: 12px;
    border-radius: 12px;
    background-image: url(images/pdf_icon32.png);
}

항상 iF 단어를 피하십시오
LastTribunal

클래스 속성을 직접 사용하지 않도록 권장하고 싶습니다. 이 요소의 다른 플러그인에서 변경 한 내용을 덮어 씁니다.
SimonSimCity

10

이 솔루션은 나를 위해 트릭을했다

<a ng-style="{true: {paddingLeft: '25px'}, false: {}}[deleteTriggered]">...</a>

8

삼항식을 사용할 수 있습니다. 이를 수행하는 두 가지 방법이 있습니다.

<div ng-style="myVariable > 100 ? {'color': 'red'} : {'color': 'blue'}"></div>

또는...

<div ng-style="{'color': (myVariable > 100) ? 'red' : 'blue' }"></div>

1
어쩌면 당신은 그것을 더 잘 찾을 것입니다 : <div ng-style = "{ 'color': (myVariable> 100)? 'red': 'blue'}"> </ div>
Dudi

Dudi는 유용하지는 않지만 @maykel의 "삼항 표현"답변에 추가했습니다. 둘 다 감사합니다!
jbobbins

7

하나 또는 두 개의 속성으로 구성된 간단한 CSS 스타일이 필요한 경우 다른 옵션 :

전망:

<tr ng-repeat="element in collection">
    [...amazing code...] 
    <td ng-style="{'background-color': getTrColor(element.myvar)}">
        {{ element.myvar }}
    </td>
    [...more amazing code...]
</tr>

제어 장치:

$scope.getTrColor = function (colorIndex) {
    switch(colorIndex){
        case 0: return 'red';
        case 1: return 'green';
        default: return 'yellow';
    }
};

6

다음 예를 참조하십시오

<!DOCTYPE html>
    <html ng-app>
    <head>
    <title>Demo Changing CSS Classes Conditionally with Angular</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
    <script src="res/js/controllers.js"></script>

    <style>

    .checkboxList {
        border:1px solid #000;
        background-color:#fff;
        color:#000;
        width:300px;
        height: 100px;
        overflow-y: scroll;
    }

    .uncheckedClass {
       background-color:#eeeeee;
       color:black;
    }
    .checkedClass {
        background-color:#3ab44a;
        color:white;
    }
    </style>

    </head>
    <body ng-controller="TeamListCtrl">
    <b>Teams</b>
    <div id="teamCheckboxList" class="checkboxList">

    <div class="uncheckedClass" ng-repeat="team in teams" ng-class="{'checkedClass': team.isChecked, 'uncheckedClass': !team.isChecked}">

    <label>
    <input type="checkbox" ng-model="team.isChecked" />
    <span>{{team.name}}</span>
    </label>
    </div>
    </div>
    </body>
    </html>

2

AngularJS와의로 v1.2.0rc, ng-class심지어ng-attr-class SVG 요소와 실패 (그들은 심지어 클래스 속성 내에서 바인딩 정상으로, 초기 작업을했다)

특히, 지금은이 중 어느 것도 작동하지 않습니다.

ng-class="current==this_element?'active':' ' "
ng-attr-class="{{current==this_element?'active':' '}}"
class="class1 class2 .... {{current==this_element?'active':''}}"

해결 방법으로 사용했습니다

ng-attr-otherAttr="{{current==this_element?'active':''}}"

그런 다음 스타일을 사용하여

[otherAttr='active'] {
   ... styles ...
}

1

조건부로 스타일을 적용하는 또 다른 방법은 조건부 범위 스타일을 작성하는 것입니다.

<style scoped type="text/css" ng-if="...">

</style>

그러나 현재 FireFox 만 범위가 지정된 스타일을 지원합니다.


1

스타일 요소 내에서 CSS 규칙을 변경할 수 있으므로 ng-style, ng-class, ang-class, ng-class, ng-show, ng-hide, ng-aniimate 등

이 옵션은 컨트롤러에 의해 설정되고 "custom-style"이라고하는 속성 지시문으로 감시되는 서비스 변수가있는 서비스를 사용합니다. 이 전략은 여러 가지 방법으로 사용될 수 있으며이 바이올린에 대한 일반적인 지침을 제공하려고 시도했습니다 .

var app = angular.module('myApp', ['ui.bootstrap']);
app.service('MainService', function(){
    var vm = this;
});
app.controller('MainCtrl', function(MainService){
    var vm = this;
    vm.ms = MainService;
});
app.directive('customStyle', function(MainService){
    return {
        restrict : 'A',
        link : function(scope, element, attr){
            var style = angular.element('<style></style>');
            element.append(style);
            scope.$watch(function(){ return MainService.theme; },
                function(){
                    var css = '';
                    angular.forEach(MainService.theme, function(selector, key){
                        angular.forEach(MainService.theme[key], function(val, k){
                            css += key + ' { '+k+' : '+val+'} ';
                        });                        
                    });
                    style.html(css);
                }, true);
        }
    };
});

1

글쎄, true 또는 false를 반환하는 함수로 컨트롤러의 상태를 확인하는 것이 좋습니다 .

<div class="week-wrap" ng-class="{today: getTodayForHighLight(todayDate, day.date)}">{{day.date}}</div>

컨트롤러에서 상태를 확인하십시오.

$scope.getTodayForHighLight = function(today, date){
    return (today == date);
}

0

CSS 스타일에 대시가있는 경우 제거해야합니다. 따라서 설정하려는 경우 background-color올바른 방법은 다음과 같습니다.

ng-style="{backgroundColor:myColor}" 

5
아닙니다. ng-style = "{ 'background-color': myColor}"은 완벽하게 작동합니다.
gerasalus

0

비활성화 된 버튼에 회색 텍스트 스타일을 조건부로 적용하는 방법은 다음과 같습니다.

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  styleUrls: [ './app.component.css' ],
  template: `
  <button 
    (click)='buttonClick1()' 
    [disabled] = "btnDisabled"
    [ngStyle]="{'color': (btnDisabled)? 'gray': 'black'}">
    {{btnText}}
  </button>`
})
export class AppComponent  {
  name = 'Angular';
  btnText = 'Click me';
  btnDisabled = false;
  buttonClick1() {
    this.btnDisabled = true;
    this.btnText = 'you clicked me';
    setTimeout(() => {
      this.btnText = 'click me again';
      this.btnDisabled = false
      }, 5000);
  }
}

실제 예는 다음과 같습니다.
https://stackblitz.com/edit/example-conditional-disable-button?file=src%2Fapp%2Fapp.component.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.