Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida sobre o efeito cascata do CSS e a necessidade de utilizar o seletor universal

E que tal um desafio? Que tal aplicar o que você já viu aqui, de novo na nossa página inicia? Para começar, tente importar o nosso cabeçalho e rodapé para a página inicial, alguns conflitos vão aparecer e a melhor forma de aprender é lidando com eles.

Eu topei o desafio e a minha estratégia para não quebrar a página inicial foi simples.

  • No arquivo index.html, dentro do body:

    • agrupei todo conteúdo existente dentro de um elemento main (apenas removi o elemento <header></header>, mas mantive o h1 que estava dentro).
    • inseri o conteúdo do header, copiado do arquivo produtos.html, acima de <main>.
    • inseri o conteúdo do footer, copiado do arquivo produtos.html, abaixo de </main>.
  • No arquivo index.html, dentro do head, eu incluí as referências aos arquivos reset.css e produtos.css, para a formatação do cabeçalho e do rodapé. Além disso, eu movi a referência ao arquivo CSS específico da Home (o arquivo style.css) para que ficasse por último, logo abaixo das referências aos outros dois arquivos CSS citados. Levando-se em consideração que a ordem importa, o último arquivo referenciado, style.css, que é específico da Home, poderia sobrescrever o que fosse necessário.

  • Para desabilitar as alterações impostas pelo reset.css e pelo produtos.css apenas no conteúdo principal, ou seja, no conteúdo do <main>, eu fui ao style.css, usei um seletor para o elemento main e incluí uma regra para reverter toda alteração que eventualmente pudesse ter sido herdada dos outros arquivos CSS – reset.css produtos.css – como, por exemplo, o tamanho da fonte no elemento <h1>.

main { 
    all: revert;
}

Achei que tudo funcionaria, mas o conteúdo dentro do main permaneceu quebrado, diferente da formatação original provida apenas pelo arquivo style.css. Percebi que o all: revert não funcionou.Então, pesquisei um pouco mais e quando usei um seletor com * em conjunto com main, consegui resolver o problema: a formatação original dos elementos foi restabelecida (o par propriedade/valor all: revert foi aplicado, funcionou) e a formatação do conteúdo do main foi dada apenas pelas regras contidas no style.css.

main * {
    all: revert;
}

A minha dúvida é: se o CSS tem efeito cascata, os elementos dentro da tag main (os elementos filhos) não deveriam ter seus estilos revertidos ao original apenas com o seletor main {}? Por que foi necessário o seletor main * {} para que isso ocorresse?

O meu index.html (funcionando) ficou assim:

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <title>Barbearia Alura</title>
    <link rel="stylesheet" href="reset.css">
    <link rel="stylesheet" href="produtos.css">
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>
        <div class="caixa">
            <h1><img src="logo.png"></h1>

            <nav>
                <ul>
                    <li><a href="index.html">Home</a></li>
                    <li><a href="produtos.html">Produtos</a></li>
                    <li><a href="contato.html">Contato</a></li>
                </ul>
            </nav>
        </div>
    </header>
    <main>
        <h1 class="titulo-principal">Barbearia Alura</h1>

        <img id="banner" src="banner.jpg">
        <div class="principal">
            <h2 class="titulo-centralizado">Sobre a Barbearia Alura</h2>

            <p>Localizada no coração da cidade a <strong>Barbearia Alura</strong> traz para o mercado o que há de melhor
                para o seu cabelo e barba. Fundada em 2019, a Barbearia Alura já é destaque na cidade e conquista novos
                clientes a cada dia.</p>

            <p id="missao"><em>Nossa missão é: <strong>"Proporcionar auto-estima e qualidade de vida aos
                        clientes"</strong>.</em></p>

            <p>Oferecemos profissionais experientes e antenados às mudanças no mundo da moda. O atendimento possui
                padrão de excelência e agilidade, garantindo qualidade e satisfação dos nossos clientes.</p>
        </div>

        <div class="beneficios">
            <h3 class="titulo-centralizado">Benefícios</h3>

            <ul>
                <li class="itens">Atendimento aos Clientes</li>
                <li class="itens">Espaço diferenciado</li>
                <li class="itens">Localização</li>
                <li class="itens">Profissionais Qualificados</li>
            </ul>

            <img src="beneficios.jpg" class="imagembeneficios">
        </div>
    </main>
    <footer>
        <img src="logo-branco.png">
        <p class="copyright">© Copyright Barbearia Alura - 2019</p>
    </footer>
</body>

</html>

O meu style.css (funcionando) ficou assim:

main * { 
    all: revert;
}

#banner {
    width:100%;
}

.principal{
    background: #CCCCCC;
    padding: 30px;
}

.titulo-principal {
    padding-left: 20px;
}

.titulo-centralizado {
    text-align: center
}

p {
    text-align: center;
}

#missao {
    font-size: 20px
}

em strong {
    color: #FF0000;
}

.itens {
    font-style: italic
}

.beneficios {
    background: #FFFFFF;
    padding: 20px;
}

ul {
    display: inline-block;
    vertical-align: top;
    width: 20%;
    margin-right: 15%;
}

.imagembeneficios {
    width: 50%;
}
4 respostas

Olá Gabriel, tudo bem?

Você precisa usar o seletor universal ( * ), porque a tag <main> tem filhos dentro dela, sendo (<div>, <p>, <h1>). Então você precisa indicar se quer reverter todos elementos dentro dela ou somente a <main>. Colocando só o seletor "main", você só altera ela mesma como por exemplo o background. Faz o teste ai por favor, coloca um background de qualquer cor na main com o seletor universal ( * ) depois faz o teste sem o seletor universal para ver a diferença, vai perceber que utilizando só o seletor main altera só a cor de fundo dela, e usando o seletor universal altera a cor de todas as tags filhas, (<div>, <p>, <h1>) etc.

No teste fiz assim:

Exemplo com o seletor universal( * )

main * { 
  background-color: red;
}

Exemplo sem o seletor universal ( * )

main { 
  background-color: red;
}

Dúvida respondida Gabriel? Espero que sim. Mas fique a vontade para perguntar mais!

Oi, Renan! Agradeço a resposta.

Na verdade, eu já tinha feito um teste semelhante, mudando a cor do background rs...

Para o background-color, o teste funciona perfeitamente como você demonstrou – se usarmos o seletor main {}, o background-color: red afeta somente a main. Para background-color: red atingir os elementos filhos, teríamos que usar main junto com o seletor universal "*" – main * {}.

Porém, se usarmos o mesmo seletor main {}, e incluirmos um par propriedade/valor como font-size: 25px, essa formatação da fonte serve tanto para textos incluídos diretamente dentro da main, como para os textos contidos em um elemento descendente da main, ou seja, não precisamos utilizar o "*" para afetar os filhos da main no que diz respeito ao tamanho da fonte ("filhos da main" é uma expressão ótima, né? rsrs).

Se a gente fizer o mesmo teste que você propôs, apenas adicionando a propriedade font-size, o background-color: red de fato só funciona para os filhos no primeiro exemplo, mas o font-size: 30px funciona para os filhos em ambos (com ou sem seletor universal).

Com seletor universal (*)

main * { 
  background-color: red;
  font-size: 30px;
}

Sem seletor universal (*)

main { 
  background-color: red;
  font-size: 30px;
}

Confuso, né?

Estou percebendo que algumas propriedades são herdadas (ou aplicadas em cascata) e outras não.

Complementando a minha última mensagem.

Percebi que há mais uma coisa interessante: o seletor main * {} remove a formatação para o texto incluído diretamente na main.

Faz o teste aí, incluindo um texto na main.

Em resumo:

Regrafont-size texto da mainfont-size texto dos descendentes da mainbackground-color da mainbackground-color dos descendentes da main
main { background-color: red; font-size: 30px; }AlteraAlteraAlteraNão altera
main * { background-color: red; font-size: 30px; } }Não alteraAlteraAlteraAltera

Diante disso, concluo que preciso me aprofundar nos estudos de CSS para entender esses detalhes hehe.

Vou marcar a sua resposta como solução, ok?

Obrigado!

solução!

Ai sim Gabriel, que top!! É isso ai, tem que testar mesmo para ter certeza.

No caso do font-size acontece isso mesmo! Quando adicionado na tag pai, consequentemente muda os filhos também, não só com o font-size mas isso acontece com outras propriedades também como: color, width, height, margin, padding entre outros, nesse caso só usando seletor como classe, id ou outro.

Olha esse artigo sobre esse assunto, achei legal...

https://tableless.com.br/efeito-cascata-e-especificidade-do-css/

Legal o seu feedback Gabriel, qualquer coisa manda aqui, estamos juntos, valeu!