07/08/2025
Quando desenvolvo para a web, sabemso que o HTML e o CSS não trabalham isolados. O HTML é transformado pelo navegador em uma estrutura chamada DOM (Document Object Model), que representa todos os elementos da página na memória. Já o CSS gera outra estrutura chamada CSSOM (CSS Object Model), que contém todas as regras de estilo interpretadas.
O DOM é gerado a partir do HTML, contendo nós que representam cada tag, atributo e texto. O CSSOM é gerado a partir do CSS, estruturando todos os seletores e suas propriedades.
Por exemplo, se tenho o seguinte HTML e CSS:
html
<h1>Título</h1>
<p>Parágrafo</p>
css
CopiarEditar
h1 { color: red; }
p { font-size: 16px; }
O navegador cria:
DOM
css
Document
└── html
└── body
├── h1
│ └── "Título"
└── p
└── "Parágrafo"
CSSOM
css
CSSOM
├── h1
│ └── color: red
└── p
└── font-size: 16px
Depois que o DOM e o CSSOM estão prontos, o navegador combina os dois para criar a Render Tree. Nessa fase, cada nó do DOM recebe os estilos definidos no CSSOM, e elementos que não aparecem visualmente (como <head> ou elementos ocultos com display: none) ficam de fora. Essa árvore é usada para calcular layout e pintar pixels na tela.
O fluxo é assim:
css HTML → DOM CSS → CSSOM DOM + CSSOM → Render Tree → Layout → Pintura
Quando duas ou mais regras CSS afetam o mesmo elemento, a escolha do valor final segue a cascata:
Por isso, entender especificidade é fundamental para evitar estilos sendo sobrescritos sem perceber.
Eu posso interagir com o DOM para alterar conteúdo e também com o CSSOM para mudar estilos dinamicamente:
javascript
// Alterar diretamente no DOM
document.querySelector('h1').style.color = 'blue';
// Alterar na folha de estilos
document.styleSheets[0].cssRules[0].style.color = 'green';
Mexer diretamente no CSSOM é mais raro, mas possível e útil quando preciso mudar várias regras de uma vez.
O DOM contém a estrutura e o conteúdo.
O CSSOM contém a aparência.
A Render Tree é a união de ambos para exibir a página.
Quando entendo essa separação, fica mais fácil otimizar desempenho, reduzir reflows desnecessários e depurar comportamentos estranhos.
Explicação Adicional para o Diagrama
Essa estrutura de árvore permite que o JavaScript (e frameworks como o Angular) acesse, manipule e interaja com qualquer elemento da página. Quando o Angular destrói um componente, como mencionamos no Canvas, ele remove o nó correspondente e todos os seus filhos dessa árvore, liberando a memória e limpando a tela.