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#36300afyzické 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
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
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

