CSS Cheatsheet#
#
Introduction#
External stylesheet#
<link href="./path/to/stylesheet/style.css" rel="stylesheet" type="text/css" />
Internal stylesheet#
<style>
body {
background-color: linen;
}
</style>
Inline styles#
<h2 style="text-align: center;">Centered text</h2>
<p style="color: blue; font-size: 18px;">Blue, 18-point text</p>
Add class#
<div class="classname"></div>
<div class="class1 classn ..."></div>
Support multiple classes on one element.
!important#
.post-title { color: blue !important; }
Overrides all previous styling rules.
### Selector
h1 {
}
#job-title {
}
div.hero {
}
div > p {
}
See: Selectors
Text color#
color: #2a2aff; color: green; color: rgb(34, 12, 64, 0.6); color: hsla(30 100% 50% / 0.6);
See: [Colors](#css-colors)
### Background
background-color: blue;
background-image: url('nyan-cat.gif');
background-image: url('../image.png');
See: Backgrounds
Font#
.page-title { font-weight: bold; font-size: 30px; font-family: ‘Courier New’; }
See: [Fonts](#css-fonts)
### Position
.box {
position: relative;
top: 20px;
left: 20px;
}
See also: Position
Animation#
animation: 300ms linear 0s infinite;
animation: bounce 300ms linear infinite;
See: [Animation](#css-animation)
### Comment
/* This is a single line comment */
/* This is a
multi-line comment */
Flex layout#
div { display: flex; justify-content: center; } div { display: flex; justify-content: flex-start; }
See: [Flexbox](#css-flexbox) | [Flex Tricks](#css-flexbox-tricks)
### Grid layout
#container {
display: grid;
grid: repeat(2, 60px) / auto-flow 80px;
}
#container > div {
background-color: #8ca0ff;
width: 50px;
height: 50px;
}
See: Grid Layout
Variable & Counter#
counter-set: subsection; counter-increment: subsection; counter-reset: subsection 0;
:root { –bg-color: brown; } element { background-color: var(–bg-color); }
See: [Dynamic content](#css-dynamic-content)
## CSS Selectors
### Examples
#### Groups Selector
h1,
h2 {
color: red;
}
Chaining Selector#
h3.section-heading { color: blue; }
#### Attribute Selector
div[attribute='SomeValue'] {
background-color: red;
}
First Child Selector#
p:first-child { font-weight: bold; }
#### No Children Selector
.box:empty {
background: lime;
height: 80px;
width: 80px;
}
Basic#
|
All elements |
|
All div tags |
|
All elements with class |
|
Element with ID |
|
All divs and paragraphs |
|
All elements inside #idname |
Combinators#
Selector |
Description |
|---|---|
|
Div with certain classname |
|
Div with certain ID |
|
Paragraphs inside divs |
|
All p tags |
|
P tags immediately after div |
|
P tags preceded by div |
Attribute selectors#
| | |
| ——————– | ———————————- | —————————- |
| a[target] | With a a[target="_blank"] | Open in new tab |
| a[href^="/index"] | Starts with [class | ="chair"] | Starts with [class*="chair"] | containing [title~="chair"] | Contains the word a[href$=".doc"] | Ends with [type="button"] | Specified type |
See also: Attribute selectors
User action pseudo classes#
|
Link in normal state |
|
Link in clicked state |
|
Link with mouse over it |
|
Visited link |
Pseudo classes#
|
Add content after p |
|
Add content before p |
|
First letter in p |
|
First line in p |
|
Selected by user |
|
Placeholder attribute |
|
Documents root element |
|
Highlight active anchor |
|
Element with no children |
|
P with en language attribute |
|
Element that’s not a span |
Input pseudo classes#
|
Checked inputs |
|
Disabled inputs |
|
Enabled inputs |
|
Input has focus |
|
Value in range |
|
Input value out of range |
|
Input with valid value |
|
Input with invalid value |
|
No required attribute |
|
Input with required attribute |
|
With readonly attribute |
|
No readonly attribute |
|
With indeterminate state |
Structural pseudo classes#
|
First child |
|
Last child |
|
First of some type |
|
Last of some type |
|
Second child of its parent |
|
Nth-child (an + b) formula |
|
Second child from behind |
|
Second p of its parent |
|
…from behind |
|
Unique of its parent |
|
Only child of its parent |
CSS Fonts#
Properties#
Property |
Description |
|---|---|
|
<font> |
|
<size> |
|
<size> |
|
<number> |
| font-weight: | <number> / bold / normal | | font-style: | italic / normal | | text-decoration: | underline /
none |
| text-align: | left / right
center / justify | | text-transform: | capitalize / uppercase / lowercase |
See also: Font
Shorthand#
style |
weight |
size (required) |
line-height |
family |
||
|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
style |
weight |
size (required) |
line-height |
family (required) |
Example#
font-family: Arial, sans-serif; font-size: 12pt; letter-spacing: 0.02em;
### Case
/* Hello */
text-transform: capitalize;
/* HELLO */
text-transform: uppercase;
/* hello */
text-transform: lowercase;
@font-face#
@font-face { font-family: ‘Glegoo’; src: url(‘../Glegoo.woff’); }
## CSS Colors
### Named color
color: red;
color: orange;
color: tan;
color: rebeccapurple;
Hexadecimal color#
color: #090; color: #009900; color: #090a; color: #009900aa;
### rgb() Colors
color: rgb(34, 12, 64, 0.6);
color: rgba(34, 12, 64, 0.6);
color: rgb(34 12 64 / 0.6);
color: rgba(34 12 64 / 0.3);
color: rgb(34 12 64 / 60%);
color: rgba(34.6 12 64 / 30%);
HSL Colors#
color: hsl(30, 100%, 50%, 0.6); color: hsla(30, 100%, 50%, 0.6); color: hsl(30 100% 50% / 0.6); color: hsla(30 100% 50% / 0.6); color: hsl(30 100% 50% / 60%); color: hsla(30.2 100% 50% / 60%);
### Other
color: inherit;
color: initial;
color: unset;
color: transparent;
color: currentcolor; /* keyword */
CSS Backgrounds#
Properties#
Property |
Description |
|---|---|
|
(Shorthand) |
| background-color: | See: Colors | | background-image: | url(…) | | background-position: |
left/center/right
top/center/bottom | | background-size: | cover X Y | | background-clip: |
border-box
padding-box
content-box | | background-repeat: | no-repeat
repeat-x
repeat-y | |
background-attachment: | scroll/fixed/local |
Shorthand#
color |
image |
positionX |
positionY |
size |
repeat |
attachment |
||
|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
color |
image |
posX |
posY |
size |
repeat |
attach.. |
Examples#
background: url(img_man.jpg) no-repeat center;
background: url(img_flwr.gif) right bottom no-repeat, url(paper.gif) left top repeat;
background: rgb(2, 0, 36); background: linear-gradient( 90deg, rgba(2, 0, 36, 1) 0%, rgba(13, 232, 230, 1) 35%, rgba(0, 212, 255, 1) 100% );
## CSS The Box Model
### Maximums/Minimums
.column {
max-width: 200px;
width: 500px;
}
See also: max-width / min-width / max-height / min-height
Margin / Padding#
.block-one { margin: 20px; padding: 10px; }
See also: [Margin](https://developer.mozilla.org/en-US/docs/Web/CSS/margin) /
[Padding](https://developer.mozilla.org/en-US/docs/Web/CSS/padding)
### Box-sizing
.container {
box-sizing: border-box;
}
See also: Box-sizing
Visibility#
.invisible-elements { visibility: hidden; }
See also: [Visibility](https://developer.mozilla.org/en-US/docs/Web/CSS/visibility)
### Auto keyword
div {
margin: auto;
}
See also: Margin
Overflow#
.small-block { overflow: scroll; }
See also: [Overflow](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow)
## CSS Animation
### Shorthand
| | name | duration | timing-function | delay | count | direction | fill-mode | play-state |
| ------------ | -------- | -------- | --------------- | ------- | ---------- | ------------------- | --------- | ---------- |
| `animation:` | `bounce` | `300ms` | `linear` | `100ms` | `infinite` | `alternate-reverse` | `both` | `reverse` |
| | name | duration | timing-function | delay | count | direction | fill-mode | play-state |
### Properties
| Property | Value |
| ---------------------------- | ------------------------------------------------------ |
| `animation:` | _(shorthand)_ |
| `animation-name:` | \<name> |
| `animation-duration:` | \<time>ms |
| `animation-timing-function:` | ease / linear / ease-in / ease-out / ease-in-out |
| `animation-delay:` | \<time>ms |
| `animation-iteration-count:` | infinite / \<number> |
| `animation-direction:` | normal / reverse / alternate / alternate-reverse |
| `animation-fill-mode:` | none / forwards / backwards / both / initial / inherit |
| `animation-play-state:` | normal / reverse / alternate / alternate-reverse |
See also: [Animation](https://developer.mozilla.org/en-US/docs/Web/CSS/animation)
### Example
/* @keyframes duration | timing-function | delay |
iteration-count | direction | fill-mode | play-state | name */
animation: 3s ease-in 1s 2 reverse both paused slidein;
/* @keyframes duration | timing-function | delay | name */
animation: 3s linear 1s slidein;
/* @keyframes duration | name */
animation: 3s slidein;
animation: 4s linear 0s infinite alternate move_eye;
animation: bounce 300ms linear 0s infinite normal;
animation: bounce 300ms linear infinite;
animation: bounce 300ms linear infinite alternate-reverse;
animation: bounce 300ms linear 2s infinite alternate-reverse forwards normal;
Javascript Event#
.one('webkitAnimationEnd oanimationend msAnimationEnd animationend')
CSS Flexbox#
Simple example#
.container { display: flex; }
.container > div {
flex: 1 1 auto;
}
Container#
.container {
display: flex; display: inline-flex;
flex-direction: row; /* ltr - default */
flex-direction: row-reverse; /* rtl */
flex-direction: column; /* top-bottom */
flex-direction: column-reverse; /* bottom-top */
flex-wrap: nowrap; /* one-line / flex-wrap: wrap; / multi-line */
align-items: flex-start; /* vertical-align to top */
align-items: flex-end; /* vertical-align to bottom */
align-items: center; /* vertical-align to center */
align-items: stretch; /* same height on all (default) */
justify-content: flex-start; /* [xxx ] / justify-content: center; / [ xxx ] / justify-content: flex-end; / [ xxx] / justify-content: space-between; / [x x x] / justify-content: space-around; / [ x x x ] / justify-content: space-evenly; / [ x x x ] */
}
### Child
.container > div {
/* This: */
flex: 1 0 auto;
/* Is equivalent to this: */
flex-grow: 1;
flex-shrink: 0;
flex-basis: auto;
order: 1;
align-self: flex-start; /* left */
margin-left: auto; /* right */
}
CSS Flexbox Tricks#
Vertical center#
.container { display: flex; }
.container > div { width: 100px; height: 100px; margin: auto; }
### Vertical center (2)
.container {
display: flex;
/* vertical */
align-items: center;
/* horizontal */
justify-content: center;
}
Reordering#
.container > .top { order: 1; }
.container > .bottom { order: 2; }
### Mobile layout
.container {
display: flex;
flex-direction: column;
}
.container > .top {
flex: 0 0 100px;
}
.container > .content {
flex: 1 0 auto;
}
A fixed-height top bar and a dynamic-height content area.
Table-like#
.container { display: flex; }
/* the ‘px’ values here are just suggested percentages */ .container > .checkbox { flex: 1 0 20px; } .container > .subject { flex: 1 0 400px; } .container > .date { flex: 1 0 120px; }
This creates columns that have different widths, but size accordingly according to the circumstances.
### Vertical
.container {
align-items: center;
}
Vertically-center all items.
Left and right#
.menu > .left { align-self: flex-start; } .menu > .right { align-self: flex-end; }
## CSS Grid Layout
### Grid Template Columns
#grid-container {
display: grid;
width: 100px;
grid-template-columns: 20px 20% 60%;
}
fr Relative Unit#
.grid { display: grid; width: 100px; grid-template-columns: 1fr 60px 1fr; }
### Grid Gap
/*The distance between rows is 20px*/
/*The distance between columns is 10px*/
#grid-container {
display: grid;
grid-gap: 20px 10px;
}
CSS Block Level Grid#
#grid-container { display: block; }
### CSS grid-row
CSS syntax:
- grid-row: grid-row-start / grid-row-end;
#### Example
.item {
grid-row: 1 / span 2;
}
CSS Inline Level Grid#
#grid-container { display: inline-grid; }
### minmax() Function
.grid {
display: grid;
grid-template-columns: 100px minmax(100px, 500px) 100px;
}
grid-row-start & grid-row-end#
CSS syntax:
grid-row-start: auto|row-line;
grid-row-end: auto|row-line|span n;
Example#
grid-row-start: 2; grid-row-end: span 2;
### CSS grid-row-gap
grid-row-gap: length;
Any legal length value, like px or %. 0 is the default value
CSS grid-area#
.item1 { grid-area: 2 / 1 / span 2 / span 3; }
### Justify Items
#container {
display: grid;
justify-items: center;
grid-template-columns: 1fr;
grid-template-rows: 1fr 1fr 1fr;
grid-gap: 10px;
}
CSS grid-template-areas#
.item { grid-area: nav; } .grid-container { display: grid; grid-template-areas: ‘nav nav . .’ ‘nav nav . .’; }
### Justify Self
#grid-container {
display: grid;
justify-items: start;
}
.grid-items {
justify-self: end;
}
The grid items are positioned to the right (end) of the row.
Align Items#
#container { display: grid; align-items: start; grid-template-columns: 1fr; grid-template-rows: 1fr 1fr 1fr; grid-gap: 10px; }
## CSS Dynamic Content
### Variable
Define CSS Variable
:root {
--first-color: #16f;
--second-color: #ff7;
}
Variable Usage
#firstParagraph { background-color: var(–first-color); color: var(–second-color); }
See also: [CSS Variable](https://developer.mozilla.org/en-US/docs/Web/CSS/--*)
### Counter
/* Set "my-counter" to 0 */
counter-set: my-counter;
/* Increment “my-counter” by 1 */ counter-increment: my-counter;
/* Decrement "my-counter" by 1 */
counter-increment: my-counter -1;
/* Reset “my-counter” to 0 */ counter-reset: my-counter;
See also: [Counter set](https://developer.mozilla.org/en-US/docs/Web/CSS/counter-set)
### Using counters
body {
counter-reset: section;
}
h3::before {
counter-increment: section;
content: 'Section.' counter(section);
}
ol { counter-reset: section; list-marker-type: none; }
li::before { counter-increment: section; content: counters(section, ‘.’) ‘ ‘; }
## Css 3 tricks
### Scrollbar smooth
html {
scroll-behavior: smooth;
}
Click me, the page will scroll smoothly to Getting started
Modern CSS#
container queries(size)#
.element-wrap { container: element / inline-size; } @container element (min-inline-size: 300px) { .element { display: flex; gap: 1rem; } }
### container qeries(style)
.container {
--variant: 1;
&.variant2 {
--variant: 2;
}
}
@container style(--variant: 1) {
button {
} /* You can't style .container, but can select inside it */
.other-things {
}
}
@container style(--variant: 2) {
button {
}
.whatever {
}
}
container units#
The units are cqw (“container query width”),
cqh (“container query height”),
cqi (“container query inline”),
cqb (“container query block”),
cqmin (smaller of cqi and cqb),
and cqmax (larger of cqi and cqb)
.card { padding: 5cqi; font-size: 4cqi; border: 1cqi solid brown; height: 100%; }
h2 { font-size: 10cqi; margin-block: 0 3cqi; }
### the :has() pseudo selector
figure:has(figcaption) {
border: 1px solid black;
padding: 0.5rem;
}
nesting#
.cards { .card { & .card-description { color: blue; } & .card-title { color: red; } } }
###
### scoping
@scope {
:scope {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
padding: 1rem;
border: 1px solid black;
}
.card {
padding: 1rem;
border: 1px solid black;
background: lightgray;
h2 {
margin: 0 0 1rem 0;
}
}
}
cascade layers#
/* Specify the order to apply styles in cascade */ @layer legacyCard, newCard;
/* Imagine you have a lot of styles */ @layer newCard { .card { background-color: red; } } @layer legacyCard { .card { background-color: green; } }
### logical properties
button {
background-color: #4caf50;
border: none;
color: white;
padding: 0.5rem 1.5rem;
text-decoration: none;
font: inherit;
border-radius: 4px;
.icon {
position: relative;
top: 0.125em;
fill: white;
width: 1em;
aspect-ratio: 1;
margin-inline-end: 0.25rem;
}
}
p3 colors#
<div class="container">
<div class="swatch">
<style contenteditable>
@scope {
:scope {
background-color: color(display-p3 1 0.5 0);
}
}
</style>
</div>
<div class="swatch">
<style contenteditable>
@scope {
:scope {
background-color: oklch(61.88% 0.286 342.4);
}
}
</style>
</div>
<div class="swatch">
<style contenteditable>
@scope {
:scope {
background-color: oklab(0.73 0.15 0.16);
}
}
</style>
</div>
<div class="swatch">
<style contenteditable>
@scope {
:scope {
background-image: linear-gradient(to right in oklch, red, blue);
}
}
</style>
</div>
<div class="swatch">
<style contenteditable>
@scope {
:scope {
background-image: linear-gradient(to right in oklab, red, blue);
}
}
</style>
</div>
<div class="swatch">
<style contenteditable>
@scope {
:scope {
background-image: linear-gradient(to right in srgb, red, blue);
}
}
</style>
</div>
</div>
color mixing#
.swatch { color: white; width: 100px; aspect-ratio: 1; display: grid; place-items: center; text-align: center;
&:nth-child(1) { background-color: var(–bg); } &:nth-child(2) { background-color: color-mix(in oklch, var(–bg), black 30%); } &:nth-child(3) { background-color: color-mix(in oklch, var(–bg), white 30%); } }
### margin trim
.container {
/* prevent "extra" margin at the end of the element */
margin-trim: block-end;
/* an element like this might be the culprit, but it could be anything */
> p {
margin-block-end: 1rem;
}
}
text wrapping#
.balance { text-wrap: balance; } .pretty { text-wrap: pretty; }
html { font-family: system-ui, sans-serif; }
main { max-inline-size: 60ch; margin-inline: auto; }
### subgrid
.grid {
display: grid;
grid-template-columns: repeat(9, 1fr);
grid-template-rows: repeat(4, minmax(100px, auto));
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid;
grid-template-rows: repeat(3, 80px);
}
.subitem {
grid-column: 3 / 6;
grid-row: 1 / 3;
}