This is a quick reference cheat sheet for CSS goodness, listing selector syntax, properties, units and other useful bits of information.
CSS is rich in capabilities and is more than simply laying out pages.
<link href="./path/to/stylesheet/style.css" rel="stylesheet" type="text/css" />
<style>
body {
background-color: linen;
}
</style>
<h2 style="text-align: center;">Centered text</h2>
<p style="color: blue; font-size: 18px;">Blue, 18-point text</p>
<div class="classname"></div>
<div class="class1 ... classn"></div>
Support multiple classes on one element.
.post-title {
color: blue !important;
}
Overrides all previous styling rules.
color: #2a2aff;
color: green;
color: rgb(34, 12, 64, 0.6);
color: hsla(30 100% 50% / 0.6);
See: Colors
background-color: blue;
background-image: url("nyan-cat.gif");
background-image: url("../image.png");
See: Backgrounds
animation: 300ms linear 0s infinite;
animation: bounce 300ms linear infinite;
See: Animation
/* This is a single line comment */
/* This is a
multi-line comment */
div {
display: flex;
justify-content: center;
}
div {
display: flex;
justify-content: flex-start;
}
See: Flexbox | Flex Tricks
#container {
display: grid;
grid: repeat(2, 60px) / auto-flow 80px;
}
#container > div {
background-color: #8ca0ff;
width: 50px;
height: 50px;
}
See: Grid Layout
counter-set: subsection;
counter-increment: subsection;
counter-reset: subsection 0;
:root {
--bg-color: brown;
}
element {
background-color: var(--bg-color);
}
See: Dynamic content
h1,
h2 {
color: red;
}
h3.section-heading {
color: blue;
}
div[attribute="SomeValue"] {
background-color: red;
}
p:first-child {
font-weight: bold;
}
.box:empty {
background: lime;
height: 80px;
width: 80px;
}
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
a:link |
Link in normal state |
a:active |
Link in clicked state |
a:hover |
Link with mouse over it |
a:visited |
Visited link |
p::after |
Add content after p |
p::before |
Add content before p |
p::first-letter |
First letter in p |
p::first-line |
First line in p |
::selection |
Selected by user |
::placeholder |
Placeholder attribute |
:root |
Documents root element |
:target |
Highlight active anchor |
div:empty |
Element with no children |
p:lang(en) |
P with en language attribute |
:not(span) |
Element that's not a span |
input:checked |
Checked inputs |
input:disabled |
Disabled inputs |
input:enabled |
Enabled inputs |
input:focus |
Input has focus |
input:in-range |
Value in range |
input:out-of-range |
Input value out of range |
input:valid |
Input with valid value |
input:invalid |
Input with invalid value |
input:optional |
No required attribute |
input:required |
Input with required attribute |
input:read-only |
With readonly attribute |
input:read-write |
No readonly attribute |
input:indeterminate |
With indeterminate state |
p:first-child |
First child |
p:last-child |
Last child |
p:first-of-type |
First of some type |
p:last-of-type |
Last of some type |
p:nth-child(2) |
Second child of its parent |
p:nth-child(3n42) |
Nth-child (an + b) formula |
p:nth-last-child(2) |
Second child from behind |
p:nth-of-type(2) |
Second p of its parent |
p:nth-last-of-type(2) |
...from behind |
p:only-of-type |
Unique of its parent |
p:only-child |
Only child of its parent |
Property | Description |
---|---|
font-family: |
<font> |
font-size: |
<size> |
letter-spacing: |
<size> |
line-height: |
<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
style | weight | size (required) | line-height | family | ||
---|---|---|---|---|---|---|
font: |
italic |
400 |
14px |
/ |
1.5 |
sans-serif |
style | weight | size (required) | line-height | family (required) |
font-family: Arial, sans-serif;
font-size: 12pt;
letter-spacing: 0.02em;
/* Hello */
text-transform: capitalize;
/* HELLO */
text-transform: uppercase;
/* hello */
text-transform: lowercase;
@font-face {
font-family: "Glegoo";
src: url("../Glegoo.woff");
}
color: red;
color: orange;
color: tan;
color: rebeccapurple;
color: #090;
color: #009900;
color: #090a;
color: #009900aa;
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%);
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%);
color: inherit;
color: initial;
color: unset;
color: transparent;
color: currentcolor; /* keyword */
Property | Description |
---|---|
background: |
(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 |
color | image | positionX | positionY | size | repeat | attachment | ||
---|---|---|---|---|---|---|---|---|
background: |
#ff0 |
url(a.jpg) |
left |
top |
/ |
100px auto |
no-repeat |
fixed; |
background: |
#abc |
url(b.png) |
center |
center |
/ |
cover |
repeat-x |
local; |
color | image | posX | posY | size | repeat | attach.. |
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%
);
.column {
max-width: 200px;
width: 500px;
}
See also: max-width / min-width / max-height / min-height
.container {
box-sizing: border-box;
}
See also: Box-sizing
.invisible-elements {
visibility: hidden;
}
See also: Visibility
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 |
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
/* @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;
.one('webkitAnimationEnd oanimationend msAnimationEnd animationend')
.container {
display: flex;
}
.container > div {
flex: 1 1 auto;
}
.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 ] */
}
.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 */
}
.container {
display: flex;
}
.container > div {
width: 100px;
height: 100px;
margin: auto;
}
.container {
display: flex;
/* vertical */
align-items: center;
/* horizontal */
justify-content: center;
}
.container > .top {
order: 1;
}
.container > .bottom {
order: 2;
}
.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.
.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.
.container {
align-items: center;
}
Vertically-center all items.
.menu > .left {
align-self: flex-start;
}
.menu > .right {
align-self: flex-end;
}
#grid-container {
display: grid;
width: 100px;
grid-template-columns: 20px 20% 60%;
}
.grid {
display: grid;
width: 100px;
grid-template-columns: 1fr 60px 1fr;
}
/*The distance between rows is 20px*/
/*The distance between columns is 10px*/
#grid-container {
display: grid;
grid-gap: 20px 10px;
}
#grid-container {
display: block;
}
#grid-container {
display: inline-grid;
}
.grid {
display: grid;
grid-template-columns: 100px minmax(100px, 500px) 100px;
}
CSS syntax:
grid-row-start: 2;
grid-row-end: span 2;
grid-row-gap: length;
Any legal length value, like px or %. 0 is the default value
.item1 {
grid-area: 2 / 1 / span 2 / span 3;
}
#container {
display: grid;
justify-items: center;
grid-template-columns: 1fr;
grid-template-rows: 1fr 1fr 1fr;
grid-gap: 10px;
}
.item {
grid-area: nav;
}
.grid-container {
display: grid;
grid-template-areas:
"nav nav . ."
"nav nav . .";
}
#grid-container {
display: grid;
justify-items: start;
}
.grid-items {
justify-self: end;
}
The grid items are positioned to the right (end) of the row.
#container {
display: grid;
align-items: start;
grid-template-columns: 1fr;
grid-template-rows: 1fr 1fr 1fr;
grid-gap: 10px;
}
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
/* 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
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, ".") " ";
}
.element-wrap {
container: element / inline-size;
}
@container element (min-inline-size: 300px) {
.element {
display: flex;
gap: 1rem;
}
}
.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 {
}
}
.card {
padding: 5cqi;
font-size: 4cqi;
border: 1cqi solid brown;
height: 100%;
}
h2 {
font-size: 10cqi;
margin-block: 0 3cqi;
}
figure:has(figcaption) {
border: 1px solid black;
padding: 0.5rem;
}
.cards {
.card {
& .card-description {
color: blue;
}
& .card-title {
color: red;
}
}
}
@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;
}
}
}
/* 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;
}
}
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;
}
}
<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>
.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%);
}
}
.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;
}
}
.balance {
text-wrap: balance;
}
.pretty {
text-wrap: pretty;
}
html {
font-family: system-ui, sans-serif;
}
main {
max-inline-size: 60ch;
margin-inline: auto;
}
.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;
}