cefet_web

CSS parte 2

Especificidade, propriedade display e posicionamento


Na última aula… (1/3)

descend./filho ~ p strong: todo <strong> descendente de <p> (filho, neto etc.) ~ p > strong: todo <strong> filho direto de <p>

atributo ~ img[alt]: toda <img> que tem atributo alt="..." ~ a[href$=".html"]: todo <a> apontando para um .html etc.

estado do link ~ a:link, a:visited, a:hover, a:active

negação ~ img:not([alt]): <img> sem o atributo alt


Hoje veremos

  1. Especificidade de seletores
  2. A propriedade display
  3. Posicionamento
    1. Estático
    2. Relativo
    3. Absoluto
    4. Fixo
    5. Grudento (sticky)

Especificidade de seletores

Aplicando regras


Motivação


Mais Difícil…

<style>
  .destaque { color: red; }
  #titulo   { color: green; }
  h4        { color: blue; }
</style>

<h4 id="titulo" class="destaque">Ford Prefect</h4>

Regras gerais de especificidade

Regra 1 ~ Cada seletor tem uma pontuação de especificidade

Regra 2 ~ Se dois seletores selecionam o mesmo elemento, mas com pontuações diferentes, ganha aquele com pontuação maior

Regra 3 ~ Se dois seletores selecionam o mesmo elemento e têm a mesma pontuação, ganha o que foi declarado por último

Regra 4 ~ Estilo Inline >> Arquivo Externo >> Incorporado

Regra 5 ~ ID >> classe >> atributo >> tag


Cálculo da pontuação de especificidade

A ~ Contar o número de IDs no seletor

B ~ Contar o número de classes, atributos e pseudo-classes no seletor

C ~ Contar o número de tags e pseudo-elementos no seletor

. ~ Concatenar os três números (ABC)


Exemplos e Exercício

  1. Exemplos:
    /* seletor { propriedades }  abc */
    li { }                    /* 001 */
    .destaque { }             /* 010 */
    li.destaque { }           /* 011 */
    
    #rodape { }               /* 100 */
    #rodape #logo { }         /* 200 */
    
    a[href^="www"] { }        /* 011 */
    tr:hover { }              /* 011 */
    .curiosidade::before { }  /* 011 */
    
    ul li { }                 /* 002 */
    ul > li { }               /* 002 */
    h1, h2 { }           /* 001, 001 */
    

CoutoSan™ Specificity

0
(a) IDs
0
(b) Classes, atributos e pseudo-classes
0
(c) Elementos, pseudo-elementos

A propriedade display

e seus diversos valores


A propriedade display (na MDN)


A propriedade display (cont.)


Display: inline-block


Resultado do display inline-block


Display: table-*

Hoje em dia: preferimos flex ou grid ;)


Display: flex e inline-flex Logomarca do CSS

flex-direction ~ row (padrão), column, row-reverse, column-reverse ~ dispõe filhos na horizontal (se row) ou vertical (column)

justify-content ~ flex-start (padrão), center, space-around, space-between… ~ define como distribuir o espaço que sobrou

align-items ~ stretch (padrão), flex-start, center… ~ define posição dos elementos no “contraeixo”


Exemplo com flexbox: lista horizontal

ul.horizontal {
  display: flex;
  justify-content: space-around;

  /* tirar coisas que vem na <ul> */
  list-style-type: none;
  padding-left: 0;
}

ul.horizontal > li {
  flex: 1; /* crescer com peso 1 */
  
  /* espacinho e centralização */
  margin-right: 4px;
  text-align: center;
}

Display: grid e inline-grid Logomarca do CSS

grid-template-rows
grid-template-columns ~ determina os tamanhos das linhas ou colunas ~ ex: auto 1fr auto (3 partes, do meio ocupando o que sobrar) ~ ex: 200px 10% 1fr (3 partes, 1ª fixa, 2ª fluida e 3ª restante) ~ ex: 1fr 3fr (2 partes, 1ª ocupando 1/4 e 2ª 3/4 do espaço)

grid-row
grid-column ~ propriedade de cada filho, define onde ficar nas linhas e colunas, ex: 1 / 3, 1 / 2


Exemplo usando grid

  1. CSS (dos filhos)
    header {
      grid-column: 1 / 3;
    }
    
    nav {
      grid-column: 1 / 2;
      grid-row: 2 / 3;
    }
    section {
      grid-column: 2 / 3;
      grid-row: 2 / 3;
    }
    footer {
      grid-column: 1 / 3;
      grid-row: 3 / 4;
    }
    

    ::: result .full-width height: 250px; display: grid; grid-template-rows: 60px 1fr auto; grid-template-columns: 90px 1fr;

    :::


Posicionamento

Diferentes fluxos de layout


Relembrando o fluxo padrão

Elementos block ~ Ocupam toda a largura disponível ~ Dispostos de cima para baixo ~ Quebram linha

Elementos inline ~ Ocupam o espaço necessário (não mais) ~ Dispostos da esquerda para direita


Alterando o fluxo com float e clear


Limitações do fluxo padrão


A propriedade position


Posicionamento (1) estático

::: result .full-width.no-margin

Conteúdo

:::


Posicionamento (2) relativo

Comporta-se como static...
...Mas pode ter um deslocamento.
Mais uma divzinha

:::


Detalhes sobre (2) position: relative

  1. O elemento continua no fluxo normal, a menos que tenha suas propriedades top :arrow_up:, right :arrow_right:, bottom :arrow_down: e left :arrow_left: ajustadas
    • Mais recentemente foi proposta propriedade inset que é um atalho:
      .item {
        position: relative;
        top: 10px; right: 20px;
        bottom: 30px; left: 20px; 
      }
      .item {
        position: relative;
        inset: 10px 20px 30px; 🤯
      }
      
      
  2. A posição do elemento será ajustada com relação à sua posição original (caso ele fosse static)
  3. Os elementos posteriores a um elemento com position: relative não são ajustados para ocupar eventuais “buracos” na página

Utilidade do (2) position: relative (1/2)


Utilidade do (2) position: relative (2/2)

Também utilizamos position: relative para definir um “plano de referência” para os filhos que estiverem com position: absolute (veremos mais adiante)


Posicionamento (3) absoluto


Exemplo de posição (3) absoluta


Utilidades do (3) position: absolute

  1. Criar “drop-downs” de opções que não “empurram” a página pra baixo (porque não ocupam espaço)

  2. Colocar elementos “um em cima do outro
  3. Posicionar elementos em qualquer lugar na página

Detalhes do (3) position: absolute


Posicionamento (3) fixo

  1. <div class="fixo">Este é um elemento fixo.</div>
    
    .fixo { position: fixed; right: 0; bottom: 10px; }
    

Utilidade do position: fixed


position – Exemplo com todos


position Descrição Exemplos de uso top, right, bottom, left z-index
static Fluxo normal Elementos que não requerem posicionamento especial ignorados ignorado
relative Fluxo normal, deslocado Elementos que podem se deslocar um pouco; elementos contextos para outros absolutamente posicionados deslocamentos nas 4 direções determina ordem
absolute Removido do fluxo, posicionado em um (x,y) relativo a um contexto Elementos que queremos determinar os valores (x,y) para posicioná-los exatamente em algum lugar posições referentes às 4 direções determina ordem
fixed Removido do fluxo, posicionado em um (x,y) relativo à janela Idem ao absolute, mas a posição é fixa na janela (e não na página) posições referentes às 4 direções determina ordem

z-index

::: result .flex-align-center

z-index=1
z-index=2
z-index=3

:::


Referências