Criatividade com as Funções de Forma CSS
Você quer uma seta decorativa que recorte sua imagem hero. Você recorre ao clip-path: path(), escreve as coordenadas SVG e funciona—até o container redimensionar. A seta permanece fixa em suas dimensões originais em pixels enquanto todo o resto escala. Esta é a limitação central que a função CSS shape() resolve.
Pontos-Chave
- A função CSS
shape()cria caminhos de recorte responsivos usando unidades CSS nativas como porcentagens ecalc(), ao contrário depath()que usa valores fixos em pixels shape()funciona comclip-pathpara recorte visual eoffset-pathpara animações de movimento, mas não comshape-outsidepara quebra de texto- O suporte dos navegadores inclui Safari 18.4+ e navegadores baseados em Chromium, mas o Firefox não tem suporte—sempre use fallbacks de
polygon()para produção - Combine
shape()com propriedades customizadas CSS e unidades de consulta de container para formas que se adaptam em múltiplos contextos sem JavaScript
O Que a Função CSS shape() Realmente Faz
A função shape() é uma maneira nativa do CSS de definir formas complexas usando unidades CSS familiares como porcentagens, calc() e unidades de consulta de container. Ao contrário de path(), que empresta sintaxe SVG e interpreta todos os valores como pixels, shape() permite construir formas CSS responsivas que se adaptam ao seu elemento contenedor.
Aqui está a diferença-chave. Com path():
clip-path: path("M0 0 L 100 0 L 150 50 L 100 100 L 0 100 z");
Esses números são pixels fixos. Redimensione o elemento e a forma permanece do mesmo tamanho.
Com shape():
clip-path: shape(from 0% 0%,
line to calc(100% - 50px) 0%,
line to 100% 50%,
line to calc(100% - 50px) 100%,
line to 0% 100%,
close);
Agora a forma escala com o elemento. Porcentagens são resolvidas em relação às dimensões do elemento. Você pode misturar valores fixos com relativos, criando formas que mantêm proporções ou preservam ângulos específicos conforme os containers mudam de tamanho.
Onde shape() Funciona: clip-path e offset-path
A função CSS shape() atualmente se aplica a duas propriedades com propósitos distintos.
CSS clip-path shape() define quais porções de um elemento permanecem visíveis. Tudo fora da forma é recortado. Isso é puramente visual—o box model do elemento permanece retangular, e os cálculos de layout ignoram o recorte completamente.
CSS offset-path shape() define um caminho de movimento para animações. Combinado com offset-distance, você pode mover elementos ao longo de curvas e linhas customizadas. A forma descreve a trajetória, não a visibilidade.
Estes são fundamentalmente diferentes de shape-outside, que afeta o fluxo de texto ao redor de elementos flutuantes. Essa propriedade pertence ao CSS Shapes Level 1 e atualmente não suporta a função shape()—apenas formas básicas como circle(), ellipse() e polygon().
Suporte dos Navegadores: A Realidade no Final de 2025
A função shape() foi lançada no Safari 18.4 e chegou aos navegadores baseados em Chromium. O Firefox ainda não a suporta. Isso significa que você não pode tratá-la como CSS baseline.
A detecção de recursos é direta:
@supports (clip-path: shape(from 0% 0%, line to 100% 0%)) {
/* shape() suportado */
}
Para uso em produção, o aprimoramento progressivo é essencial. Comece com um fallback de polygon() que aproxime sua forma sem curvas, depois adicione a versão shape() para navegadores compatíveis:
.element {
clip-path: polygon(0 0, 80% 0, 100% 50%, 80% 100%, 0 100%);
clip-path: shape(from 0% 0%,
line to 80% 0%,
line to 100% 50%,
line to 80% 100%,
line to 0% 100%,
close);
}
A segunda declaração sobrescreve a primeira apenas em navegadores que a compreendem.
Discover how at OpenReplay.com.
Casos de Uso Criativos Que Vale a Pena Explorar
Recorte decorativo torna-se mais prático quando as formas respondem ao layout. Um divisor de seção diagonal pode manter seu ângulo independentemente da largura da viewport. Um canto recortado de card pode permanecer proporcional conforme os tamanhos dos cards mudam em uma grade.
Máscaras responsivas para imagens se beneficiam da mistura de unidades. Mantenha um recorte curvo em um raio fixo enquanto a forma geral escala com o container da imagem.
Caminhos de movimento ganham flexibilidade quando você pode expressar pontos de referência em porcentagens. Um elemento pode orbitar o centro de um container independentemente das dimensões reais desse container.
O verdadeiro poder emerge quando você combina shape() com propriedades customizadas CSS e unidades de consulta de container. Uma única definição de forma pode se adaptar a múltiplos contextos sem recálculo JavaScript.
Conclusão
A função CSS shape() resolve um problema específico: tornar caminhos de recorte complexos e caminhos de movimento responsivos sem sair do CSS. Ela usa sintaxe nativa, suporta calc() e funciona com coordenadas baseadas em porcentagem.
Ela não substitui path() para formas de dimensão fixa onde a precisão em pixels importa. Ela não funciona com shape-outside para quebra de texto. E requer fallbacks até que o suporte do Firefox chegue.
Para efeitos visuais criativos que precisam escalar, shape() é a ferramenta que estava faltando. Use-a com estratégias claras de fallback, e seu recorte decorativo finalmente se comportará como o resto do seu layout responsivo.
Perguntas Frequentes
Sim, você pode animar entre valores de shape() se ambas as formas tiverem o mesmo número e tipo de comandos. O navegador interpola entre os valores de coordenadas correspondentes. Se as estruturas de comando diferirem, a animação não funcionará suavemente e pode saltar entre estados em vez de fazer transição.
polygon() suporta apenas linhas retas entre pontos e usa uma sintaxe mais simples. shape() suporta curvas através de comandos arc e curve, permite expressões calc() dentro de coordenadas e fornece mais controle sobre formas complexas. Use polygon() para formas angulares simples e como fallbacks para suporte mais amplo dos navegadores.
Não. A função shape() com clip-path é puramente visual. A caixa delimitadora retangular do elemento permanece inalterada para eventos de ponteiro, contornos de foco e cálculos da árvore de acessibilidade. Os usuários ainda podem clicar em áreas visualmente recortadas, o que pode exigir tratamento adicional para interações intuitivas.
Sim, propriedades customizadas CSS funcionam dentro das coordenadas de shape(). Você pode definir variáveis para valores repetidos ou criar formas configuráveis. Combine-as com calc() para ajustes dinâmicos. Isso torna as definições de forma reutilizáveis e mais fáceis de manter em diferentes componentes ou breakpoints responsivos.
Truly understand users experience
See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..