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.