Fundo e Bordas em CSS: Técnicas Avançadas

Evitando que o Fundo Invada a Borda

Por padrão, a propriedade background-clip assume o valor border-box. Isso significa que a cor ou imagem de fundo se estende por toda a área da borda. Para restringir o fundo à área de preenchimento (padding), utilize o valor padding-box.

.elemento {
    background-clip: padding-box;
}

As opções de valor para background-clip são content-box, padding-box, border-box e text.

Criando Bordas Múltiplas

Usando Sombra (box-shadow)

A propriedade box-shadow permite simular bordas extras sem alterar o fluxo do layout. Um ponto importante é que ela não afeta o tamanho do elemento nem interações do mouse.

.elemento {
    background: #3a86a8;
    box-shadow: 0 0 0 8px #2a6d8b, 0 0 0 12px #47a0c5;
}

Para projetar a sombra para dentro do elemento, utilize a palavra-chave inset.

.elemento-interno {
    background: #3a86a8;
    box-shadow: inset 0 0 0 5px #47a0c5, inset 0 0 0 12px #2a6d8b;
}

Combinando Borda e Contorno (outline)

A combinação de border e outline é outra abordagem para bordas duplas. O outline suporta estilos tracejados e pode ser deslocado com outline-offset. Versões modernas dos navegadores já suportam outline em elementos com cantos arredondados.

.elemento-dupla-borda {
    background: #3a86a8;
    border: 8px solid #2a6d8b;
    outline: 4px dashed #47a0c5;
}

Posicionamento Preciso do Fundo

Quando se deseja posicionar o fundo relativo a um lado específico do elemento, dentro da área de conteúdo, existem algumas técnicas.

Posicionamento por Palavras-chave

.caixa {
    padding-right: 20px;
    padding-bottom: 10px;
    background-position: right 20px bottom 10px;
}

Origem do Fundo (background-origin)

Alterar a origem do fundo para content-box faz com que o posicionamento seja sempre relativo à caixa de conteúdo, independentemente do preenchimento.

.caixa {
    background-origin: content-box;
}

Usando a Função calc()

.caixa {
    background-position: calc(100% - 20px) calc(100% - 10px);
}

Cantos Arredondados com Contorno Interno

Para criar um efeito de contorno (outline) que respeite os cantos arredondados (border-radius), podemos combinar outline com box-shadow. A expansão da sombra deve ser suficiente para cobrir o espaço entre o contorno e o arredondamento.

.elemento-arredondado {
    background: #d2b48c;
    border-radius: 0.8em;
    outline: 0.4em solid #111;
    box-shadow: 0 0 0 0.35em #111;
}

Fundos Listrados

Listras Horizontais

.listra-horizontal {
    background-image: linear-gradient(#ff5555 50%, #ffcc00 80%);
}

Listras Verticais

.listra-vertical {
    background-image: linear-gradient(90deg, #ff5555 50%, #ffcc00 80%);
}

Listras Diagonais

.listra-diagonal {
    background-image: linear-gradient(60deg, #ff5555 20%, #ffcc00 50%, #228b22 90%);
    background-size: 30px 100%;
}

Padrão Repetitivo de Listras Diagonais

Para listras diagonais que se repetem de forma contínua, use repeating-linear-gradient.

.listra-repetida {
    background-image: repeating-linear-gradient(60deg, #fb3 0, #fb3 15px, #58a 0, #58a 30px);
}

O valor 0 é interpretado como o valor de parada do seletor de cor anterior, simplificando o código.

Padrões Monocromáticos

Crie variações sutis de uma mesma cor usando camadas de gradiente com transparência.

.padrao-monocromatico {
    background: #58a;
    background-image: repeating-linear-gradient(30deg, transparent 0, transparent 15px, hsla(0, 0%, 100%, 0.1) 0, hsla(0, 0%, 100%, 0.1) 30px);
}

Padrões de Fundo Complexos

Grade (Grid)

.grade {
    background-color: #d2b48c;
    background-image:
        linear-gradient(white 1px, transparent 0),
        linear-gradient(90deg, white 1px, transparent 0);
    background-size: 30px 30px;
}

Pontos (Polka Dots)

.pontos {
    background-color: #655;
    background-image:
        radial-gradient(#d2b48c 30%, transparent 0),
        radial-gradient(#d2b48c 30%, transparent 0);
    background-size: 20px 20px;
    background-position: 0 0, 10px 10px;
}

Xadrez (Checkerboard)

.xadrez {
    background-color: white;
    background-image:
        linear-gradient(45deg, black 25%, transparent 0, transparent 75%, black 0),
        linear-gradient(45deg, black 25%, transparent 0, transparent 75%, black 0);
    background-size: 20px 20px;
    background-position: 0 0, 10px 10px;
}

Fundos Pseudo-Aleatórios

Utilize tamanhos de fundo com números primos para criar padrões que parecem aleatórios e não se repetem de forma óbvia.

.padrao-aleatorio {
    background-color: hsl(20, 40%, 90%);
    background-image:
        linear-gradient(90deg, #fb3 10px, transparent 0),
        linear-gradient(90deg, #ab4 20px, transparent 0),
        linear-gradient(90deg, #655 20px, transparent 0);
    background-size: 41px 100%, 61px 100%, 83px 100%;
}

Bordas com Imagem Contínua

Borda Imagem Adaptável

Crie o efeito de uma borda com imagem usando camadas de fundo. A camada inferior (com a imagem) é dimensionada para preencher toda a área, incluindo a borda.

.borda-imagem {
    border: 5px solid transparent;
    background:
        linear-gradient(white, white) padding-box,
        url('imagem.jpg') border-box center / cover;
}

Envelope Clássico

Simule listras diagonais decorativas como borda usando um gradiente repetitivo.

.envelope {
    border: 5px solid transparent;
    background:
        linear-gradient(white, white) padding-box,
        repeating-linear-gradient(-45deg, red 0, red 12.5%, transparent 0, transparent 25%, blue 0, blue 37.5%, transparent 0, transparent 50%) 0 / 1em 1em;
}

Efeito Formiga Marchando (Marching Ants)

Uma técnica popular para seleções ou bordas ativas.

.formiga {
    border: 1px solid transparent;
    background:
        linear-gradient(white, white) padding-box,
        repeating-linear-gradient(-45deg, black 0, black 25%, white 0, white 50%) 0 / 0.6em 0.6em;
    animation: marcha 12s linear infinite;
}

@keyframes marcha {
    to {
        background-position: 100%;
    }
}

Tags: CSS background-clip box-shadow outline background-position

Publicado em 6-25 02:20