Tips & Tricks
Få mere ud af Custom properties
Anvende Pseudo-elementer til at underbygge UI
Forstå, hvordan Scroll-teknikker hjælper med UX
Vide, hvordan Math-funktioner kan hjælpe med layout
Få mere ud af Custom properties
Anvende Pseudo-elementer til at underbygge UI
Forstå, hvordan Scroll-teknikker hjælper med UX
Vide, hvordan Math-funktioner kan hjælpe med layout
Mål: Få mere ud af dem
html {
--primary: #5000ca;
--secondary: #463866;
--accent: #fb28a8;
--space-xxs: 0.25rem;
--space-xs: 0.5rem;
--space-sm: 1rem;
--space-md: 1.5rem;
--space-lg: 2rem;
--space-xl: 3rem;
--space-xxl: 6rem;
}
html {
--space-sm: 1rlh;
--space-lg: 2rlh;
}
.flow {
> * + * {
margin-top: var(--flow-space, var(--space-sm));
}
h2 {
--flow-space: var(--space-lg);
}
}
p {
color: green;
}
#context {
color: red;
}
<div id="context">
<p>Some text</p>
</div>
#test p {
color: blue;
}
p:hover {
color: red;
}
<div id="test">
<p>Lorem, ipsum dolor.</p>
</div>
#test p {
color: var(--c, blue);
}
p:hover {
--c: red;
}
<div id="test">
<p>Lorem, ipsum dolor.</p>
</div>
p {
color: var(--c);
}
#test {
--c: blue;
}
p:hover {
--c: red;
}
<div id="test">
<p>Lorem, ipsum dolor.</p>
</div>
var(--value, 10px)
.grid {
display: grid;
grid-template-columns:
repeat(var(--cols, 3), 1fr);
}
@media (width > 40em) {
.grid {
--cols: 5;
}
}
:root {
--my-color: green;
}
aside {
--my-color: red;
}
p {
color: var(--my-color);
}
aside p {
--my-color: red;
}
p {
color: var(--my-color, green);
}
:root {
--my-color: green;
}
aside {
--my-color: red;
}
p {
color: var(--my-color);
}
aside {
--my-color: red;
}
p {
color: var(--my-color, green);
}
øvelse
Brug custom properties til lettere at organisere hver sektions farvetema
[data-surface="primary"] {
--bg-section: #eee;
--bg-card: #fff;
}
SVG through data URL
:root {
--svg: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">[SVG PATH]</svg>');
}
<!-- icons.svg -->
<svg>
<symbol id="signal" viewBox="0 0 100 100">
<path fill="#324D5B" d="..."></path>
</symbol>
</svg>
<!-- HTML file -->
<svg width="100" height="100">
<use href="icons.svg#signal" style="--sky: blue">
</svg>
<!-- icons.svg -->
<svg>
<symbol id="signal" viewBox="0 0 100 100">
<path fill="var(--sky, #324D5B)" d="..."></path>
</symbol>
</svg>
<!-- HTML file -->
<svg width="100" height="100">
<use href="icons.svg#signal" style="--sky: blue">
</svg>
<!-- icons.svg -->
<svg>
<symbol id="signal" viewBox="0 0 100 100">
<path fill="var(--sky, #324D5B)" d="..."></path>
</symbol>
</svg>
<!-- HTML file -->
<svg width="100" height="100">
<use href="icons.svg#signal" style="--sky: blue">
</svg>
* {
--repeat: repeat(auto-fit, minmax(var(--min-repeat), 1fr));
}
.grid {
--min-repeat: 250px;
grid-template-columns: var(--repeat);
}
figure {
--min-repeat: 100px;
grid-template-columns: var(--repeat);
}
Boolean-ish
.rotate {
--intent: 0;
opacity: var(--intent);
&:hover {
--intent: 1;
}
}
Mål: Anvende dem til at underbygge UI
::before, ::after
a::after {
content: '(opens in new tab)';
}
::before, ::after
a[href^="http"]::after {
content: '(opens in new tab)';
}
::before, ::after
a[href^="http"]::after {
content: '(opens in new tab)';
}
Øvelse
nav.innerHTML += `<a href=${c.link}>${c.name}</a>` + " / ";
Øvelse
nav.innerHTML += `<a href=${c.link}>${c.name}</a>` + " / ";
Øvelse
li + li::before {
content: '/';
}
Øvelse
content: open-quote;
Øvelse
Øvelse
content: attr(data-tooltip);
<span data-tooltip="I'm a tooltip">
vero
</span>
Mål: Forstå, hvordan de hjælper med UX
øvelse
Lad overskrifter følge med ved scroll
UI Challenge
øvelse
Lad sektionerne finde sig til rette i viewporten ved at definere snap points
html {
scroll-snap-type: y mandatory;
}
section {
scroll-snap-align: start;
scroll-snap-stop: always;
}
øvelse
Lad sektionerne finde sig til rette i viewporten ved at definere snap points
html {
scroll-snap-type: x mandatory;
}
body {
display: flex;
overflow-x: auto;
> * {
flex: 1 0 70%;
}
}
section {
scroll-snap-align: center;
scroll-snap-stop: always;
}
Mål: Vide, hvordan de kan hjælpe med layout
calc()
min()
max()
clamp()
.card {
padding: 1rem;
border-radius: calc(1.75rem + 1rem);
.inner {
border-radius: 1.75rem;
}
}
:root {
--size: 20;
}
.box {
width: var(--size)px;
}
eller fra JS
:root {
--size: 20;
}
.box {
width: var(--size) px;
width: var(--size)px;
width: var(--size)+px;
}
:root {
--size: 20;
}
.box {
width: calc(var(--size) * 1px); /* 20 * 1px = 20px */
}
calc()-pattern
Boolean-ish øvelse
.rotate {
--intent: 0;
rotate: /* rotér v/ hover */ ;
&:hover {
--intent: 1;
}
}
Brug calc() til at gange variablen med 45deg
0 * 45deg = 0deg
1 * 45deg = 45deg
øvelse
Brug lineær mapping til at animere en variabel font ved musens bevægelse
.element {
--range: calc(0.6em * var(--p) + 0.2em);
/*
If --p is 0 --range is .2em
If --p is 1 --range .8em
*/
}
Brug den mindste værdi
Brug den mindste værdi
Browseren omregner altid til px
.container {
width: min(100%, 200px);
/*
width: 100%;
max-width: 200px;
*/
}
.container {
width: min(100% - 2rem, 200px);
/*
width: calc(100% - 2rem);
max-width: 200px;
*/
}
65ch
3rem
.container {
max-width: 65ch;
margin-inline: 1rem;
padding: .5rem;
@media (width > 600px) {
padding: 3rem;
margin-inline: auto;
}
}
auto
auto
.container {
max-width: 65ch;
margin-inline: 1rem;
padding: .5rem;
@media (width > 600px) {
padding: 3rem;
margin-inline: auto;
}
}
< 100%
.container {
padding: min(3rem, 5%);
width: min(65ch, 100% - 2rem);
margin-inline: auto;
}
min()-pattern
Kan typisk bruges til padding, margin og gap
Prøv selv
Indholdsbredden
overflow
main {
display: grid;
grid-template-columns:
1fr minmax(0, 1200px) 1fr;
> * {
grid-column: 2;
}
.full {
grid-column: 1 / -1;
}
}
1fr
1fr
minmax(0, 1200px)
main {
display: grid;
grid-template-columns:
1fr minmax(0, 1200px) 1fr;
...
}
.scroller {
padding-inline:
max(1rem, 50% - 1200px / 2);
}
:root {
--content-width: 75rem;
}
main {
grid-template-columns:
1fr minmax(0, var(--content-width)) 1fr;
}
.scroller {
padding-inline:
max(1rem, 50% - var(--content-width) / 2);
}
max()-pattern
max()-pattern
Sæt grænser i hver ende
Sæt grænser i hver ende
calc(), min(), max()
.container {
height: calc(100% - 2rem);
/* --- */
width: calc(var(--number) * 1px);
/* --- */
width: min(65ch, 100% - 2rem);
/* --- */
padding: max(1rem, 50% - 1200px / 2);
}
øvelse
Lav øvelsen, der ligger på git-branch'en "scrolling-container" på GitHub