Angular 2 : 컴포넌트의 호스트 요소를 어떻게 스타일링합니까?


189

Angular 2에는 my-comp라는 구성 요소가 있습니다.

<my-comp></my-comp>

Angular 2 에서이 구성 요소의 호스트 요소를 어떻게 스타일링합니까?

Polymer에서는 ": host"선택기를 사용합니다. Angular 2에서 시도했지만 작동하지 않습니다.

:host {
  display: block;
  width: 100%;
  height: 100%;
}

또한 구성 요소를 선택기로 사용하려고 시도했습니다.

my-comp {
  display: block;
  width: 100%;
  height: 100%;
}

두 방법 모두 작동하지 않는 것 같습니다.

감사.


2
스타일이 적용되지 않았습니까? 나는 기본 프로젝트를 만들었고 정확히 그 작업을 수행했습니다. my-selector { color : red}CSS로 설정했는데 제대로 작동합니다.
— Pacane

1
베타 7부터 : host selector가 나를 위해 일하고 있습니다.
— Jon Swanson 2016 년

답변:


285

버그가 있었지만 그 동안 수정되었습니다. :host { }지금은 잘 작동합니다.

또한 지원됩니다

  • :host(selector) { ... }selector호스트 요소에서 속성, 클래스 등을 일치 시키기 위해
  • :host-context(selector) { ... }selector부모 구성 요소의 요소, 클래스 등을 일치 시키기 위해

  • selector /deep/ selectorselector >>> selector요소 경계에서 스타일이 일치하도록 (별칭 은 SASS와 함께 작동하지 않음)

    • 업데이트 : SASS가 더 이상 사용되지 않습니다 /deep/. SASS와 호환되는 대체품으로
      Angular (TS 및 Dart)가 추가 ::ng-deep되었습니다.

    • UPDATE2 : ::slotted ::slotted 이제 모든 새 브라우저에서 지원되며`ViewEncapsulation.ShadowDom https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted 와 함께 사용할 수 있습니다

Angular 2 구성 요소에 외부 CSS 스타일로드를 참조하십시오.

/deep/하고 >>>있다 영향을받지 크롬에서 사용되지 않습니다 같은 선택 콤비에 의해.
Angular는 그것들을 에뮬레이트 (다시 쓰기)하므로이를 지원하는 브라우저에 의존하지 않습니다.

이것이 기본 섀도우 DOM을 활성화하고 브라우저 지원에 의존하는 이유 /deep/와 >>>작동하지 않는 이유 ViewEncapsulation.Native입니다.


@Component({selector: 'some-selector', template: 'xxx', styles: [':host { display: block; background-color: green; border: solid 1px red; }']}) export class SomeClass {}
— Günter Zöchbauer

@ OndraŽižka 더 정교하게 할 수 있습니까? 이것은 순수한 CSS입니다. 어떻게 CSS 및 그 자체와 일치하지 않을 수 있습니까?
— Günter Zöchbauer 's

CSS에서 중요한 변화를 놓치지 않으면 / deep / 및 >>>는 CSS가 아닙니다.
— Ondra Žižka

더 이상 사용되지 않지만 중요하지 않습니다. 그것들은 Angular에 의해 에뮬레이트되어 (다시 쓰여 지므로)로만 작동 ViewEncapsularion.Emulated하지만 (기본값)으로는 작동 하지 않습니다 Native.
— Günter Zöchbauer

Angular 2.4.7에서는 :host { p { font-size: 80%; } }... component.css 파일에서 작업 할 수 있습니다. styles: [:host { p { font-size: 80%; } }]더 이상 사용 하지 않으면 더 이상 작동하지 않습니다. 아주 이상한.
— Martin

39

구성 요소 요소의 스타일을 지정하는 방법에 대한 해결책을 찾았습니다. 작동 방식에 대한 문서를 찾지 못했지만 다음과 같이 속성 값을 'host'속성 아래의 구성 요소 지시문에 넣을 수 있습니다.

@Component({
    ...
    styles: [`
      :host {
        'style': 'display: table; height: 100%',
        'class': 'myClass'
      }`
})
export class MyComponent
{
    constructor() {}

    // Also you can use @HostBinding decorator
    @HostBinding('style.background-color') public color: string = 'lime';
    @HostBinding('class.highlighted') public highlighted: boolean = true;
}

업데이트 : Günter Zöchbauer가 언급했듯이 버그가 있었고 이제 CSS 파일에서도 다음과 같이 호스트 요소의 스타일을 지정할 수 있습니다.

:host{ ... }

1
나는 더미 .root 요소를 만드는 것보다 이것을 좋아하지만,이 스타일을 인라인으로 설정하는 것을 좋아하지 않습니다 (a !important를 재정의 하도록 강요 ). 더 나은 waayy가 있어야합니다 : \
— Scrimothy

4
아니,를 통해 스타일링 host{}A의 stylesUrl파일은 작동하지 않습니다. 필요합니다 :host.
— phil294

호스트 내부의 컴포넌트 변수에 어떻게 접근 할 수 있습니까? 배경색을 동적으로 결정하려면? ': host {배경색 : this.bgColor; } '
— Pratap AK

@ PratapA.K 안녕하세요, 당신은 HostBinding derorator를 사용할 수 있습니다. 예를 들면 다음과 같습니다. @HostBinding('style.background-color') private color = 'lime'; Google은 많은 예와 기사를 찾습니다.
— prespic

11

이 문제를 확인하십시오 . 새로운 템플릿 사전 컴파일 로직 이 구현 되면 버그가 해결 될 것이라고 생각합니다 . 지금은 템플릿을 래핑 <div class="root">하고 스타일 을 지정하는 것이 최선이라고 생각합니다 div.

@Component({ ... })
@View({
  template: `
    <div class="root">
      <h2>Hello Angular2!</h2>
      <p>here is your template</p>
    </div>
  `,
  styles: [`
    .root {
      background: blue;
    }
  `],
   ...
})
class SomeComponent {}

참조 이 plunker을


9

적용하려는 일반적인 스타일이 있다면 Component에서 .class를 호스트 요소에 추가 할 수 있습니다.

export class MyComponent{
     @HostBinding('class') classes = 'classA classB';

6

:host여기에 자식 요소의 스타일을 지정하려는 사람에게는 사용 방법의 예가 있습니다.::ng-deep

:host::ng-deep <child element>

예 : :host::ng-deep span { color: red; }

다른 사람들이 말했듯 /deep/이 더 이상 사용되지 않습니다.


4

: host> / deep / :을 사용해보십시오

parent.component.less 파일에 다음을 추가하십시오

:host {
    /deep/ app-child-component {
       //your child style
    }
}

자식 선택기로 app-child-component를 교체하십시오.


단일 스타일 대신 부트 스트랩과 같은 스타일 시트를 원한다면 어떻게해야합니까?
— Aditya Vikas Devarapalli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.