27.06.2024UTVIKLINGCSS

Klippe hjørner med CSS

Hvordan få pixel-hjørner på knapper med én enkel button og clip-path — uten å sette sammen tre elementer.

Photo by Markus Winkler on Unsplash
Photo by Markus Winkler on Unsplash

Figma ≠ kode

Noen ganger dukker det opp uventede utfordringer i leveransen fra designer til utvikler. I 321 har vi vårt eget design-system, som spiller på en retro pixel-effekt. Ikonene vi benytter har denne effekten, og da ønsket vi å legge til pixel-hjørner på knappene våre. I Figma ble dette enkelt løst ved å sette sammen 3 biter, som til sammen utgjorde hele knappen.

Knapp bestående av 3 biter fra Figma
Knapp bestående av 3 biter fra Figma

Denne tilnærmingen er ikke like enkel i kode. Ved å sette sammen 3 elementer, får vi plutselig en unødvendig kompleks komponent, som skalerer dårlig og byr på utfordringer med f.eks. hover-effekt. Så, hvordan kan vi kun ha et HTML-element (button) men også ivareta pixel-effekten? Løsningen ble clip-path i CSS!

clip-path

clip-path lar oss “klippe” et element slik vi ønsker. CSS har en rekke innebygde former vi kan benytte oss av, som f.eks. circle() og rect(). For å få til den ønskede effekten med pixel-hjørner, kan vi bruke polygon(). Her kan vi sende inn koordinater for å lage den ønskede formen vi vil klippe knappen til. Koordinatene består av en x- og en y-komponent. For å få til et pixel-hjørne kan vi dermed definere punktene:

x- og y-koordinater for punktene i et pixel-hjørne
x- og y-koordinater for punktene i et pixel-hjørne

Ved å definere alle hjørnene med samme logikk, ender vi opp med et fullstendig polygon vi kan bruke som clip-path:

--pixel-clip-path: polygon(
    0px calc(100% - 8px),
    4px calc(100% - 8px),
    4px calc(100% - 4px),
    8px calc(100% - 4px),
    8px 100%,
    calc(100% - 8px) 100%,
    calc(100% - 8px) calc(100% - 4px),
    calc(100% - 4px) calc(100% - 4px),
    calc(100% - 4px) calc(100% - 8px),
    100% calc(100% - 8px),
    100% 8px,
    calc(100% - 4px) 8px,
    calc(100% - 4px) 4px,
    calc(100% - 8px) 4px,
    calc(100% - 8px) 0px,
    8px 0px,
    8px 4px,
    4px 4px,
    4px 8px,
    0px 8px
  );

.pixel-corners {
  clip-path: var(--pixel-clip-path);
}

Denne teknikken gjør at vi kan bruke en helt vanlig knapp i HTML, og unngå kompleksiteten med å holde 3 elementer i sync. Kanskje ønsker du å kun klippe ett av hjørnene? Nå kan du teknikken, så det er bare å klippe i vei!

← Alle innlegg