Scoped og inline stylesheet uten noe rammeverk

  • CSS
  • HTML
  • React

Det er vanlig å bruke inline style for å gi komponenter litt styling, spesielt hvis du skal ha gjenbrukbare komponenter der du ikke ønsker å bundle med en css fil i tillegg. Noe som bare kan flyttes og importers rett inn i en kodebase.

export function FancyButton({ children }) {
  return (
    <button
      style={{
        width: "200px",
        fontWeight: "bold",
      }}
    >
      {children}
    </button>
  );
}

En klar begrensing med dette er at du ikke kan i bruk media queries for et responsivt design eller lage animations da dette bare støttes i ren CSS

Men viste du at du ikke trenger å bundle med en css fil? Du kan faktisk bundle med en <style> tag som inneholder CSS’en du ønsker.

JSX i react støtter ikke å kode innhold i style tags, men du kan komme rundt ved å ta i bruk dangerouslySetInnerHTML

⚠️
OBS: Pass på og hold tunga rett i munn, ikke putt noe som kommer fra bruker input inn her eller så risikerer du XSS i applikasjonen din!
export function FancyButton({ children }) {
  const styleClassName = `fancy-button-something-unique`;
  return (
    <>
      <style
        dangerouslySetInnerHTML={{
          __html: `
           .${styleClassName} {
             width: 200px;
             font-weight: "bold";
           }`,
        }}
      />
      <button className={styleClassName}>{children}</button>
    </>
  );
}

Denne metoden vil også fungere for andre rammeverk, eller ren html + javascript. Bruker man Svelte og Vue så løses dette av rammeverket, men fram til dette blir normen så er fint å vite at man ikke er 100% bundet til begrensingen.