🧩 Exercícios: Encapsulamento de CSS e Projeção de Conteúdo (ng-content)
Spec Frontend Com Angular • Trilha Progressiva em 4 Níveis
🧭 Navegação Pedagógica
-
📖 Teoria do Capítulo 💻 Exemplos 📊 Slides 🧠 Quiz
🎯 Nível 1: Fundamentos
Problema 08.1 — Projeção de Conteúdo Simples com
Contexto: Projeção de Conteúdo Simples com
Requisitos de Execução:
- Criar componente
CardBoxComponentcom<ng-content>projetando o corpo fornecido pelo pai.
Resultado Esperado
Conteúdo filho projetado no slot do componente pai.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_1_SeuNome - Envie na tarefa:
Atividade Cap 08 - Encapsulamento de CSS e Projeção de Conteúdo (ng-content)
🔑 Gabarito de Código & Solução Comentada
// card-box.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-card-box',
standalone: true,
template: `
<div class="box-wrapper">
<ng-content></ng-content>
</div>
`
})
export class CardBoxComponent {}
🔍 Nível 2: Prática
Problema 08.2 — Projeção Múltipla com Seletores (ng-content select=’[card-header]’)
Contexto: Projeção Múltipla com Seletores (ng-content select=’[card-header]’) no contexto de Encapsulamento de CSS e Projeção de Conteúdo (ng-content).
Requisitos de Execução:
- Criar slots nomeados com
<ng-content select='[header]'>e<ng-content select='[footer]'>.
Resultado Esperado
Elementos projetados nos slots correspondentes via atributos seletores.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_2_SeuNome - Envie na tarefa:
Atividade Cap 08 - Encapsulamento de CSS e Projeção de Conteúdo (ng-content)
🔑 Gabarito de Código & Solução Comentada
// modal-slot.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-modal-slot',
standalone: true,
template: `
<header><ng-content select="[header]"></ng-content></header>
<main><ng-content></ng-content></main>
<footer><ng-content select="[footer]"></ng-content></footer>
`
})
export class ModalSlotComponent {}
⚡ Nível 3: Integração
Problema 08.3 — Encapsulamento de Estilos com ViewEncapsulation (Emulated vs ShadowDom)
Contexto: Encapsulamento de Estilos com ViewEncapsulation (Emulated vs ShadowDom) no contexto de Encapsulamento de CSS e Projeção de Conteúdo (ng-content).
Requisitos de Execução:
- Configurar
@Component({ encapsulation: ViewEncapsulation.ShadowDom })para isolamento total com Web Components nativos.
Resultado Esperado
Estilos encapsulados em Shadow Root isolados de CSS global.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_3_SeuNome - Envie na tarefa:
Atividade Cap 08 - Encapsulamento de CSS e Projeção de Conteúdo (ng-content)
🔑 Gabarito de Código & Solução Comentada
// shadow-dom.component.ts
import { Component, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'app-shadow-card',
standalone: true,
encapsulation: ViewEncapsulation.ShadowDom,
template: `<h2>Texto Isolado em Shadow DOM</h2>`,
styles: [`h2 { color: #2563eb; }`]
})
export class ShadowCardComponent {}
🏆 Nível 4: Desafio Corporativo
Problema 08.4 — Projeção Dinâmica de Templates com NgTemplateOutlet e Contexto
Contexto: Projeção Dinâmica de Templates com NgTemplateOutlet e Contexto no contexto de Encapsulamento de CSS e Projeção de Conteúdo (ng-content).
Requisitos de Execução:
- Criar componente aceitando
TemplateRefe renderizando dinamicamente com<ng-container *ngTemplateOutlet='template; context: ctx'>.
Resultado Esperado
Template flexível renderizado com passagem dinâmica de variáveis de contexto.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_4_SeuNome - Envie na tarefa:
Atividade Cap 08 - Encapsulamento de CSS e Projeção de Conteúdo (ng-content)
🔑 Gabarito de Código & Solução Comentada
// dynamic-template.component.ts
import { Component, input, TemplateRef } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-dynamic-list',
standalone: true,
imports: [CommonModule],
template: `
@for (item of items(); track item) {
<ng-container *ngTemplateOutlet="customTemplate(); context: { $implicit: item }"></ng-container>
}
`
})
export class DynamicListComponent {
items = input.required<string[]>();
customTemplate = input.required<TemplateRef<any>>();
}
| ⬅️ Voltar ao Índice de Exercícios | 📚 Sumário de Tópicos |