What’s new in CSS?

A presentation at Pixel Pioneers in June 2022 in Bristol, UK by Rachel Andrew

Slide 1

Slide 1

What’s new in CSS Pixel Pioneers 2022

Slide 2

Slide 2

Rachel Andrew Technical writer for Chrome. Content lead web.dev and developer.chrome.com. CSS Working Group member.

Slide 3

Slide 3

CSS is amazing right now!

Slide 4

Slide 4

Slide 5

Slide 5

Use your brand color in form inputs. accent-color

Slide 6

Slide 6

input { accent-color: var(—blue-sapphire); }

Slide 7

Slide 7

Use accent-color now! • Chrome ✅ • Edge ✅ • Firefox ✅ • Safari ✅

Slide 8

Slide 8

New color functions color-mix() and color-contrast()

Slide 9

Slide 9

li { background-color: color-mix(in lch, white 10%, darkblue); }

Slide 10

Slide 10

Try out color-mix() In Safari Technology Preview enable CSS color-mix() in the develop menu In Firefox, in about:config enable layout.css.color-mix.enabled

Slide 11

Slide 11

li { color: color-contrast(var(—background) vs #000, #fff); }

Slide 12

Slide 12

Try out color-contrast() In Safari Technology Preview enable CSS color-contrast() in the develop menu

Slide 13

Slide 13

Solving font layout shifts size-adjust, ascent-override, descent-override, line-gap-override

Slide 14

Slide 14

@font-face { font-family: “fallback”; src: local(Arial); size-adjust: 90%; ascent-override: 110%; descent-override: 110%; line-gap-override: 99%; } @font-face { font-family: “Webfont”; src: url(/path/to/webfont.woff2) format(‘woff2’); } html { font-family: “Webfont”, “fallback”; }

Slide 15

Slide 15

Use size-adjust, ascent-override, descent-override, and line-gap-override now! • Chrome ✅ • Edge ✅ • Firefox ✅

Slide 16

Slide 16

Controlling specificity @layer

Slide 17

Slide 17

@layer base special @layer special { .item { color: rebeccapurple; } } @layer base { .item { color: green; } }

Slide 18

Slide 18

Use Cascade Layers now! • Chrome ✅ • Edge ✅ • Firefox ✅ • Safari ✅

Slide 19

Slide 19

Aspect Ratios aspect-ratio

Slide 20

Slide 20

The “padding hack” https://css-tricks.com/aspect-ratio-boxes/

Slide 21

Slide 21

aspect-ratio: 16/9;

Slide 22

Slide 22

Slide 23

Slide 23

.wrapper { display: grid; grid-template-columns: 200px 350px; } .box16x9 { aspect-ratio: 16/9; } .box4x3 { aspect-ratio: 4/3; }

Slide 24

Slide 24

Slide 25

Slide 25

1fr 1fr 1fr

Slide 26

Slide 26

Use aspect-ratio now! • Chrome ✅ • Edge ✅ • Firefox ✅ • Safari ✅

Slide 27

Slide 27

CSS Containment This box and children are independent from the rest of the layout.

Slide 28

Slide 28

.sidebar { contain: layout; }

Slide 29

Slide 29

Use the contain property now! • Chrome ✅ • Edge ✅ • Firefox ✅ • Safari ✅

Slide 30

Slide 30

Subgrid Allow nested grids to inherit the track sizing from the parent.

Slide 31

Slide 31

.container { display: grid; grid-template-columns: 1fr 1fr 1fr; } .container .item { grid-column: 1 / 3; display: grid; grid-template-columns: subgrid; }

Slide 32

Slide 32

.container figure { display: grid; grid-template-rows: subgrid; } .caption { grid-row: 2; }

Slide 33

Slide 33

wpt.fyi/interop-2022 - June 2022

Slide 34

Slide 34

Container Queries Design components that can react to the available space in their container.

Slide 35

Slide 35

Slide 36

Slide 36

Try out Container Queries In chrome://flags enable “CSS Container Queries” or use Safari 16 beta, or Safari Technology Preview.

Slide 37

Slide 37

.sidebar { container-type: inline-size; }

Slide 38

Slide 38

Using container-type creates a containment context. This also turns on layout, style, and inline-size containment, in the same way as using the contain property does.

Slide 39

Slide 39

.sidebar { container-type: inline-size; container-name: sidebar; }

Slide 40

Slide 40

@container (min-width: 400px) { .card { display: grid; grid-template-columns: 1fr 2fr; } }

Slide 41

Slide 41

@container sidebar (min-width: 400px) { .card { display: grid; grid-template-columns: 1fr 2fr; } }

Slide 42

Slide 42

Slide 43

Slide 43

.wrapper > div { container-type: inline-size; } @container (min-width: 220px) { .box { background-color: var(—blue-sapphire); } }

Slide 44

Slide 44

.fig-panel { display: grid; grid-template-columns: 1fr 1fr; }

Slide 45

Slide 45

@container (min-width: 700px) { grid-template-columns: repeat(3,1fr); }

Slide 46

Slide 46

This seems so simple! Why did it take so long?

Slide 47

Slide 47

Slide 48

Slide 48

Slide 49

Slide 49

Putting it together Container Queries and subgrid

Slide 50

Slide 50

@container grid (min-width: 600px) { .item { display: grid; grid-template-columns: subgrid; } }

Slide 51

Slide 51

Please try out features behind flags! It’s the best time to offer feedback that can change things.

Slide 52

Slide 52

Thank you! Find me @rachelandrew Slides at: https://noti.st/rachelandrew