1

CSS se stále zlepšuje
– využijme toho!


Lukáš Trumm

pro Quanti

No notes for this slide

2

tldr;


  • CSS jde použít a je to skvělý jazyk


  • Mnoho lidí mu nerozumí a/nebo ho nechce používat

No notes for this slide

3

O čem to bude

  • Architektura stylování bez preprocesorů nebo frameworků
  • Techniky, které takový styl umožňují
  • Mylné představy a špatná srovnávání

A o čem moc ne

  • Detaily nových vlastností v CSS

No notes for this slide

4

Mám rád nové technologie, ale je tohle nutné?

  • za 2 roky přepsat
  • použít novou, "daleko lepší" knihovnu
  • jít all-in přístupem (Tailwind; některé knihovny komponent)
  • použít alespoň 1x za hodinu !important
  • používat syntaktické workaroundy (BEM)
  • podporovat pouze 2 poslední verze prohlížečů
  • bojovat proti kaskádě a specificitě

No notes for this slide

5

Požadavky na stylovací systém

  • trvanlivost
  • jednodušší předání od designéra
  • konzistentnost
  • responzivita od hodinek po ultra-wide
  • ze základu umožnit poskládat různé projekty (jako lego)
  • funkční i když minimální v základu, možnost později cokoliv změnit
  • adaptivnost - připravenost na RTL, dark mode a další

No notes for this slide

6

Řešení: omezit možnosti

No notes for this slide

7

Omezit možnosti

libovolné hodnoty

#f9fbe7
#e8ed9c
#d2df4e
#c2ce34
#b5bb2e
#a7a827
#999621
#8c851c
#7e7416
#6d6414
#5d5411
#4d460e
#36300a

fyzické hodnoty

--gray-0: #f8f9fa;
--gray-1: #f1f3f5;
--gray-2: #e9ecef;
--gray-3: #dee2e6;
--gray-4: #ced4da;
--gray-5: #adb5bd;
--gray-6: #868e96;
--gray-7: #495057;
--gray-8: #343a40;
--gray-9: #212529;
--gray-10: #16191d;

sémantické hodnoty

(design tokens)

--text-color-1: var(--gray-12);
--surface-1: var(--gray-1);
--surface-2: var(--gray-2);
--surface-3: var(--gray-3);
--accent-color: var(--brand-color);
--focus-color: var(--brand-color);
--link-color: var(--blue-8);
--error-alert-color: var(--red-11);

No notes for this slide

8

Nedostatky CSS


Zanořování pravidel a media queries → nesting

.parent {
  /* parent rules */
  .child {
    /* child of parent rules */
  }
}

@media (min-width: 768px) {
  .parent {
    /* some rules */
  }
}

.parent {
  @media (min-width: 768px) {
    /* some rules */
  }
}

No notes for this slide

9

Nedostatky CSS


Omezení CSS pravidel na komponentu → scoping

<div class="list">
  <div class="item">
    <slot class="slot"></slot>
  </div>
</div>

<style>
  @scope (.list) to (.slot) {
    /* Scoped styles target only inside `.card` but not inside `.slot` */
    :scope {
    }

    .item {
    }
  }
</style>

No notes for this slide

10

Nedostatky CSS


Proměnné → custom properties

:root {
  --brand-color: var(--blue-7);
}

.stack {
  --stack-space: var(--space-5);
}

@container style(--theme-x) {
}

@media (--mobile) {
}

@property --accent-color {
  syntax: "<color>";
  inherits: true;
  initial-value: rebeccapurple;
}

No notes for this slide

11

Nedostatky CSS


Nedosažitelné a špatně se chovající barvy → color spaces, oklab()

.my-gradient {
  --hdr-gradient: linear-gradient(
    to right in oklab,
    oklch(70% 0.5 340) 0%,
    oklch(90% 0.5 200) 100%
  );
  --sdr-gradient: linear-gradient(to right, #ff00fa 0%, #0ff 100%);

  background: var(--hdr-gradient);
}
sdr
hdr

No notes for this slide

12

Nedostatky CSS


Priorita pravidel je moc složitá → cascading layers, :where()

:where(body) {
  background: var(--bg-color-body);
}

@import "./base.css" layer(base);
@import "./theme.css" layer(theme);

No notes for this slide

13

Nedostatky CSS


Lokální responzivita → container queries, clamp()

form {
  container-type: inline-size;
}

@container (10em <= width <= 20em) {
  /* styles */
}

No notes for this slide

14

Nedostatky CSS


Preference uživatelů → prefers-color-scheme, prefers…

@media (prefers-color-scheme: dark) {
  :root {
    --text-color-1: var(--gray-1);
  }
}

@media (prefers-reduced-motion: no-preference) {
  ...
    transition: outline-offset 145ms var(--ease-2);
  ...
}

No notes for this slide

15

Nedostatky CSS


Různorodé jazyky → logical properties

.card {
  margin-inline: var(--space-4);
  margin-block: var(--space-6);
  max-inline-size: var(--size-content-2);
}

No notes for this slide

16

Nástroje - PostCSS

  • @import závislostí
  • de-nesting
  • custom media queries
    @media (--tablet)
  • dark-theme-class
//...
{
  stage: false,
  autoprefixer: true,
  features: {
    "color-function": true, // Baseline: Newly available since 5/2023
    "color-mix": true, // Baseline: Newly available since 5/2023
    "custom-media-queries": true, // Draft standard: Media queries level 5
    "media-query-ranges": true, // Baseline: Newly available since 3/2023
    "nesting-rules": true, // Baseline: Newly available since 12/2023
    "oklab-function": true, // Baseline: Newly available since 5/2023
    "relative-color-syntax": true, // Baseline: Newly available since 9/2024
  }
}

No notes for this slide

17

Nástroje - scoped CSS

Single File Component (SFC)

<template>
  <div class="list">
    <div class="item">
      <slot class="slot"></slot>
    </div>
  </div>
</template>

<style scoped>
.list {
}
.item {
}
</style>

Zkompilovaný výstup

/* ... */

.list[data-v-7ba5bd90] {
}
.item[data-v-7ba5bd90] {
}

No notes for this slide

18

Techniky

  • Open Props
  • Utopia
  • Every Layout
  • ITCSS

No notes for this slide

19

Open Props

No notes for this slide

20

Modulární škály


:root {
  /* 18.0px => 20.0px */
  --space-4: clamp(1.125rem, 1.08rem + 0.22vw, 1.25rem);
  /* 27.0px => 30.0px */
  --space-5: clamp(1.688rem, 1.62rem + 0.33vw, 1.875rem);
}

No notes for this slide

21

Every Layout

No notes for this slide

22

ITCSS

ITCSS

No notes for this slide

23

Ukázka

<div class="card p-flow">
  <h2 class="heading">Project</h2>
  <p class="description">Enter new project name</p>
  <div class="form-field">
    <label class="p-secondary-text-bold">Name</label>
    <input type="text" />
  </div>
  <div class="p-cluster">
    <button>Cancel</button>
    <button>Submit</button>
  </div>
</div>

<style scoped>
  .card {
    border-radius: var(--radius-default);
    padding: var(--space-4);
  }

  .heading {
    font-size: var(--font-size-body);
  }
  /* ... */
</style>

No notes for this slide

24

Ukázka přizpůsobení - TinyCard

<style>
  :root {
    --space-1: 2px;
    --space-2: 0.3rem;
    --space-3: 0.5rem;
    --space-4: 0.7rem;
    --radius-default: 2rem;
    --button-height-default: 1.8rem;
    --font-size--1: 0.8rem;
    --font-size-0: 0.9rem;
  }
</style>

No notes for this slide

25

Knihovna Puleo CSS

No notes for this slide

26

Shrnutí

  • Nativní podpora v prohlížečích se dost posunula
  • Techniky a nástroje nejsou přímočaré nebo standardizované
    (narozdíl třeba od Tailwindu)
  • CSS je mocné a vlastní design je možné tvořit rychle
    (možné nemusí znamenat jednoduché)

No notes for this slide

27

No notes for this slide

27 slides · 26 clicks · 0 words