:: ng-deep을 사용하는 방법과 위치


90

저는 Angular 4를 처음 사용하므로 누구나 ::ng-deepAngular 4에서 사용하는 방법과 위치를 설명해 주 시겠습니까?

실제로 부모 구성 요소에서 자식 구성 요소의 일부 CSS 속성을 덮어 쓰고 싶습니다. 또한 IE11에서 지원됩니까?


이후 /deep/::ng-deep모두 사용되지 않습니다, 나는 당신이 응답에 alook 가지고하는 것이 좋습니다 stackoverflow.com/a/49308475/2275011 및 자세한 내용 및 솔루션에 대한 의견.
Ferie

답변:


92

일반적으로 /deep/ “shadow-piercing”combinator를 사용하여 스타일을 child components. 이 선택기에는 >>> 별칭이 있으며 이제 :: ng-deep이라는 별칭이 있습니다.

이후 /deep/ combinator사용되지 않습니다, 그것은 사용하는 것이 좋습니다::ng-deep

예를 들면 :

<div class="overview tab-pane" id="overview" role="tabpanel" [innerHTML]="project?.getContent( 'DETAILS')"></div>

css

.overview {
    ::ng-deep {
        p {
            &:last-child {
                margin-bottom: 0;
            }
        }
    }
}

하위 구성 요소에 적용됩니다.


IE11을 지원합니까?
Jeyabalan Thavamani

2
Angular는 파싱을 수행하므로 호환성에 대해 걱정할 필요가 없습니다.
Simon_Weaver

하위 구성 요소에만 해당됩니까? 내가 기억하고 다른 주석에서 볼 수 있듯이 구성 요소 외부의 dom 요소에도 적용됩니다.
yaya

나는 그것이 부모 구성 요소도 수행한다는 것을 확인할 수 있습니다 ... 방금 사건을 가지고 있었고 그것에 짜증이났습니다.
Shadoweb

1
훌륭합니다. 완벽하게 작동했습니다.
Alfredo Zamudio

70

용법

::ng-deep을 클릭 >>>하고 /deep/특정 CSS 규칙에 대한보기 캡슐화를 비활성화합니다. 즉, 구성 요소의 HTML에없는 DOM 요소에 액세스 할 수 있습니다. 예를 들어 Angular Material (또는 이와 같은 다른 타사 라이브러리)을 사용하는 경우 생성 된 일부 요소는 구성 요소 영역 (예 : dialog ) 밖에 있으며 해당 요소에 직접 액세스하거나 일반 CSS를 사용하여 액세스 할 수 없습니다. 방법. 이러한 요소의 스타일을 변경하려면 다음 세 가지 중 하나를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

::ng-deep .mat-dialog {
  /* styles here */
}

현재 Angular 팀 은 EMULATED 뷰 캡슐화 로만 "깊은" 조작을 할 것을 권장 합니다.

천칭

"깊은" 조작이 실제로 사용되지하지만 각도가 사전 처리 지원 않기 때문에, 지금 일하고 스틸 (거부 서두르지 말고 ::ng-deep, 오늘 한 번 봐 걸릴 중단 사례를 첫번째).

어쨌든,이 방법을 따르기 전에 뷰 캡슐화 접근 을 비활성화하는 방법을 살펴볼 것을 권장합니다 (이상적이지 않고 스타일이 다른 구성 요소로 유출 될 수 있음). 그러나 어떤 경우에는 더 나은 방법입니다. 뷰 캡슐화를 비활성화하기로 결정했다면 특정 클래스를 사용하여 CSS 규칙 교차를 방지하고 마지막으로 스타일 시트가 엉망이되지 않도록하는 것이 좋습니다. 구성 요소의 .ts파일 에서 바로 비활성화하는 것은 정말 쉽습니다 .

@Component({
  selector: '',
  template: '',
  styles: [''],
  encapsulation: ViewEncapsulation.None  // Use to disable CSS Encapsulation for this component
})

기사 에서 뷰 캡슐화에 대한 자세한 정보를 찾을 수 있습니다 .


3
뷰 캡슐화를 비활성화하면 구성 요소의 모든 CSS가 전역 적으로 적용됩니다.
Vedran

16
사용하지 마십시오 ViewEncapsulation.None! 이러한 스타일이 다른 구성 요소에 누출 될 수있게함으로써 많은 피해를 입힐 것입니다.
Alex Klaus

1
@AlexKlaus, 동의합니다. 그래서 제가 답변에서 언급 한 이유는 이상적이지 않습니다. 실제로 Angular Material 구성 요소에 공유 반복 가능한 스타일을 적용하는 데 한 번만 사용했습니다. 캡슐화를 비활성화하려고하면 언젠가는 엉망이 될 수 있습니다. 이 옵션에 대해 아는 것은 좋지만 이것이 필요한지 확실하지 않은 동안에는 사용하지 마십시오.
상업 자살

29

::ng-deep부모가 캡슐화 된 CSS 클래스가되도록 요구함으로써 구성 요소의 자식으로 만 제한하는 것의 중요성을 강조합니다 .

이것이 작동 ::ng-deep하려면 부모 뒤에 를 사용하는 것이 중요합니다. 그렇지 않으면 컴포넌트가로드되는 순간 동일한 이름을 가진 모든 클래스에 적용됩니다.

구성 요소 CSS :

.my-component ::ng-deep .mat-checkbox-layout {
    background-color: aqua;
}

구성 요소 템플릿 :

<h1 class="my-component">
    <mat-checkbox ....></mat-checkbox>
</h1>

결과 (각도 생성) CSS :

.my-component[_ngcontent-c1] .mat-checkbox-layout {
    background-color: aqua;
}

편집하다:

:host새 CSS 클래스를 만드는 대신 키워드를 사용하여 동일한 동작을 수행 할 수 있습니다 .

:host ::ng-deep .mat-checkbox-layout

5
당신의 대답 my-component ::ng-deep...이 내 하루를 구했습니다. ng-deep으로 내 구성 요소에 스타일을 적용하려고 하루 종일 보냈고 전체 응용 프로그램에서 모든 구성 요소를 재정의했습니다.
Cristiano Bombazar 19 년

2
주목할만한 점 : "지정된 스타일의 범위를 현재 구성 요소와 모든 하위 항목 (전역 적으로는 아님)으로 지정하려면 :: ng-deep 앞에 : host 선택기를 포함해야합니다." 보낸 사람 : angular.io/guide/component-styles
StvnBrkdll

1
@CristianoBombazar- :host키워드로 동일한 동작을 얻을 수 있습니다 -명확성을 위해 답변에 메모를 추가했습니다.
Vedran

23

각도 가이드 ( https://angular.io/guide/component-styles) 에서 :host-context바로 위에 있는 설명을 놓치지 마세요 . 면책 조항 : 나는 지금까지 그것을 놓 쳤고 그것을 더 빨리 보았 으면 좋겠다.::ng-deep

::ng-deep구성 요소를 작성하지 않았고 해당 소스에 액세스 할 수 없을 때 종종 필요하지만 :host-context그렇게 할 때 매우 유용한 옵션이 될 수 있습니다.

예를 들어 내가 <h1>디자인 한 구성 요소 내부에 검은 색 헤더가 있고 어두운 테마 배경에 표시 될 때 흰색으로 변경하는 기능을 원합니다.

소스에 대한 액세스 권한이 없다면 부모를 위해 CSS에서이 작업을 수행해야 할 수 있습니다.

.theme-dark widget-box ::ng-deep h1 { color: white; }

그러나 대신 컴포넌트 내부 에서 :host-context이를 수행 할 수 있습니다 .

 h1 
 {
     color: black;       // default color

     :host-context(.theme-dark) &
     {
         color: white;   // color for dark-theme
     }

     // OR set an attribute 'outside' with [attr.theme]="'dark'"

     :host-context([theme='dark']) &
     {
         color: white;   // color for dark-theme
     }
 }

이것은 컴포넌트 체인의 어느 곳에서나 찾고 .theme-dark발견되면 h1에 CSS를 적용합니다. 이것은 ::ng-deep종종 필요하지만 다소 안티 패턴 에 너무 많이 의존하는 것에 대한 좋은 대안 입니다.

이 경우는 (이것이 sass / scss가 작동하는 방식 &입니다)로 대체 h1되므로 '일반'및 테마 / 대체 CSS를 서로 바로 옆에 정의 할 수 있습니다.

올바른 수의 :. 들어 ::ng-deep두와 거기있는 :host-context유일한 사람.


부모 구성 요소에서 :host(.theme-dark)상속하지 않으려는 경우 에도 사용할 수 있습니다 theme-dark. 이것은 전적으로 사이트 CSS 디자인에 달려 있습니다. 또한 속성은 매우 유용 할 수 있습니다 혼자 CSS에서 정교한 방법으로 결합 될 수있다:host([theme='dark']:not([dayofweek='tuesday'))
Simon_Weaver

또한이 컨테이너 내부 (호스트 컨텍스트 CSS로) 위에 설명 된대로 구성 요소를 가지고있는 경우에는이 정상적인 CSS 규칙을 다음 있습니다 .theme-light이 차례로와 컨테이너 내부 중첩 클래스 .theme-dark여전히 선택 의지 그것 theme-dark과 적용을 css. 그러나 이것은 'modernizr'유형 클래스 또는 전체적으로 한 번만 설정된 테마가있는 경우 훌륭한 솔루션입니다.
Simon_Weaver

:: ng-deep 대신 : host-context를 사용할 수 있습니까?
eddy

@eddy 나는 이것을 완전히 생각하기에는 너무 졸려 있지만 host-context는 거의 ng-deep과 비슷하지만 DOM 트리가 다운되는 대신 위로 올라갑니다. 따라서 절대적으로 동등하지는 않지만 가능합니다
Simon_Weaver

2

업데이트 :

::ng-deep대신 /deep/사용되지 않는 것으로 보이는 것을 사용해야 합니다 .

문서 별 :

섀도 피어싱 하위 결합자는 더 이상 사용되지 않으며 주요 브라우저 및 도구에서 지원이 제거됩니다. 따라서 Angular에서 지원을 중단 할 계획입니다 (/ deep /, >>> 및 :: ng-deep 3 개 모두). 그 전까지는 도구와의 광범위한 호환성을 위해 :: ng-deep을 선호해야합니다.

여기에서 찾을 수 있습니다.


5
이 텍스트에서는 :: ng-deep도 더 이상 사용되지 않는다고 명시되어 있습니다. "Angular에서 지원을 중단 할 계획입니다 (/ deep /, >>> 및 :: ng-deep 3 개 모두)".
adripanico

-2

:: ng-deep을주의해서 사용하십시오. 앱 전체에서 머티리얼 디자인 도구 모음 색상을 앱 전체에서 다른 색상으로 설정하는 데 사용했는데 앱이 도구 모음 색상 단계를 서로 테스트 할 때만 확인했습니다. 이러한 스타일이 글로벌화되기 때문입니다. 이 기사를 참조하십시오 . 다른 구성 요소에 영향을주지 않는 작업 코드 솔루션입니다.

<mat-toolbar #subbar>
...
</mat-toolbar>

export class BypartSubBarComponent implements AfterViewInit {
  @ViewChild('subbar', { static: false }) subbar: MatToolbar;
  constructor(
    private renderer: Renderer2) { }
  ngAfterViewInit() {
    this.renderer.setStyle(
      this.subbar._elementRef.nativeElement, 'backgroundColor', 'red');
  }

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