Cascading Style Sheets (CSS)
Cascading Style Sheets (CSS) are used to style and animate
- ๐ Websites
- ๐ฅ๏ธ Desktop applications (Electron/JavaFX/...)
- ๐ฑ Mobile applications (Android XML layouts/...)
- ...
Where to learn?
- MDN/CSS (๐, Reference)
- W3Schools/CSS (๐ซ, Reference, Default styles)
- css-tricks (๐ฅ, articles)
- cssreference (unmaintained since 2018)
- ...
CSS versions
โ ๏ธ CSS selectors/rules are now modularized, so CSS3 is the last CSS version. You should refer to caniuse to see what properties/... are supported, and "CSS4"/CSSDB for potential new features.
Some CSS tools
- Syntax โ : W3C Validator
- Guidelines โ๐ : cssguidelines or codeguide or Google
- Minifier ๐ฒ: css-minifier or csso/cli/JB
- Lint ๐งน: stylelint and/or unsupported browser features linter
๐ CSS frameworks ๐
As CSS rules can be complex (responsive design, accessibility), many CSS frameworks with predefined rules were created.
- Bootstrap (+160k โญ, see my notes)
- tailwindcss (74.0k โญ)
- semantic (50.9k โญ)
- bulma (47.7k โญ)
- primer (12.3k โญ, GitHub)
- PureCSS (23.2k โญ)
- ...
Based on Material Design (Google UX Guidelines)
- Material Web (7.8k โญ, in-progress)
- Materialize (38.8k โญ, dead, fork)
๐ซ About CSS ๐ซ
CSS files (.css
) are defining rules to apply on a target called selector. A rule is made of a property, and its value.
Example: Links should have the color blue. Every text in bold should have a yellow background.
a {
color: yellow;
}
b {
background: blue;
}
a {
color: yellow;
}
b {
background: blue;
}
- Selector: Links (
a
) and texts in bold (b
) - Rule
- Property:
color
, orbackground
- Value:
yellow
, orblue
- Property:
Notes
- ๐ One rule per line is a good practice
- ๐ The semicolon (
;
) is mandatory (unless there is only one rule)
Specificity
Styles are applied in cascade! There could be many selectors that are defining a rule that could be applied to the same tag.
If there are conflicts (ex: two selectors defining the same property), the Specificity is used to determine which rule is applied. In a nutshell, every selector has a weight (~=how specific the selector is) which is used to determine which rule is more important.
a { color: yellow; }
a:hover { color: red; } /* will override the other */
โก๏ธ You can use !important
to manually force a style to be applied.
a { color: yellow !important; }
a:hover { color: red; } /* won't override the other */
Getting started
There are 3 ways to write CSS for a website.
Inline CSS ๐คฎ | STYLE tag ๐คข | External CSS file ๐ |
---|---|---|
You can use the attribute
|
You can use
|
You can link an external CSS file. This is the proper way to do it (CSP policy+caching, CDNs, SoC...).
โ ๏ธ Note: Modern browsers are usually caching CSS files. If you changed a file, and don't see any changes, reload the page while ignoring the cache: CTRL+SHIFT+R or SHIFT+F5 or CTRL+F5. |
Selectors
A selector is a target, or a set of targets, on which the style will be applied. โก๏ธ To test a selector, we usually change the background. If the background changes, it means that the selector works.
YOUR_SELECTOR_HERE {
background: yellow;
}
Tag selector
The style will be applied to every element having this tag.
<p>xxx</p>
p { /* ... */ }
ID selector
The style will be applied to the tag having the matching ID.
<p id="my-id">xxx</p>
#my-id { /* ... */ }
Class selector
The style will be applied to any tag having this class.
<p class="name ...">xxx</p>
.name { /* ... */ }
Universal selector
The style will be applied to every element.
<p>xxx</p>
* { /* ... */ }
Property/Attribute selector
We can select something based on them having a property.
<p hidden>xxx</p>
[hidden] { /* ... */ }
We can select something based on the value of a property.
<input type="text" />
<path d="16 95 3"/>
[type="text"] { /* ... */ }
[d~="95"] { /* ... */ }
Pseudo-selectors
They are additional selectors based on a state/condition. These are called Pseudo-classes. See the complete list on W3Schools.
:hover { /* mouseover */ }
:not(p) { /* every tag aside from "<p>" */ }
:not(p, a) { /* [...] aside from "<p>" and "<a>" */ }
:is(h1, h2) { /* either h1 or h2 */ }
:first-child { /* [ ... ] */ }
:nth-child(0) { /* [ ... ] */ }
:last-child { /* [ ... ] */ }
โก๏ธ There are also Pseudo-elements providing access to a fake element. They start with ::
such as ::first-line
.
๐ Chain selectors
We can chain any selectors!
<p class="one two">xxx</p>
<input type="text" hidden>xxx</input>
p.one.two { /* ... */ }
input[type="text"][hidden] { /* */ }
โก๏ธ Using .name
is the same as *.name
...
๐ฃ๏ธ Combinators
They can apply a selection based on the structure of the page.
div, a { /* applied on both "div" and "a" */ }
div > a { /* "links" having a "div" as parent */ }
div a { /* "links" having a "div" as ancestor */ }
p + a { /* an adjacent "link" right after a "p" */ }
โก๏ธ Obviously, you can use any selectors instead of a
, p
, and div
.
๐ฅ Properties Values ๐ฅ
Properties (ex: background) are taking values (ex: a color).
Colors
You can use rgb
, rgba
(alpha=transparency), a hexadecimal code...
.x {
background: red; /* alias to a color */
background: rgb(255, 0, 0); /* red */
background: rgba(255, 0, 0, 0.8); /* lighter red */
background: #dd4441; /** hexadecimal code **/
}
Sizes
You must provide a value, and a unit.
.x {
width: 10px; /* px = pixels */
margin: 0; /* no unit needed */
height: 100%; /* a percentage */
}
Calculations
You can only do some calculations inside calc
.
.x {
width: calc(100% - 15px);
}
Variables
:root {
--primary-color: red;
--p1: 10px;
}
p {
color: var(--primary-color);
padding: var(--p1); /* usage */
}
๐ Properties ๐
๐ป I'm not too familiar with CSS, these examples are properties that I used before moving to CSS frameworks. ๐ป
Background
.xxx {
background: yellow; /* change background */
background: url("..."); /** path/URL **/
/* if it's an image, you may use */
background-size: 100% 100%; /* expand */
background-size: auto; /* auto */
background-size: cover; /* cover */
background-repeat: repeat;
/* mix of rules */
background: url("...") no-repeat fixed;
}
Colors
.xxx {
color: #FFDD33; /* text color */
}
Fonts
.xxx {
font-size: 15px; /* font size */
/* the second/... are fallback fonts (if not found) */
font-family: "Open Sans", sans-serif;
font-weight: 400; /* bold, light, lighter, ... */
}
Display
.xxx {
display: block; /* show */
display: none; /* hide */
overflow:hidden; /* hide */
overflow:auto; /* show a scroll bar */
opacity: 1;
position: absolute; /* relative, fixed */
/* set a specific value */
top: 0; left: 0; right: 0; border: 0;
z-index: 1; /* on top = the highest z index */
}
Text utilities
.xxx {
line-height: 50px; /* ... */
text-align: justify; /* center, left, right, ... */
text-decoration: underline #dd4441; /* add underline */
text-decoration: none; /* remove underline */
white-space: pre-line; /* multiline */
}
Size, Margins, Padding
.xxx {
width: 5px; /* width */
height: 5px; /* height */
padding: 15px; /* all */
padding: 15px 5px; /* y=15, x=5 */
/* top, right, bottom, left */
padding: 15px 5px 15px 5px;
padding-bottom: 15px; /* one by one */
/* you can use the 4 above with margin */
/* and, you have this "new" value */
margin: auto;
}
Alignment
.xxx {
justify-content: center;
align-self: center;
align-items: center;
float: left;
float: right;
}
Borders
.xxx {
/* add border, size=1px, type=solid and black */
border: 1px solid #202735;
border-radius: 4px; /* round corners */
}
Random
.xxx {
cursor: pointer; /* change cursor */
list-style-type: circle; /* change list style */
list-style-type: none; /* change list style */
}
Responsive design & Accessibility
You should adapt your website according to
- ๐ the browser (browser-specific CSS properties)
- ๐ the screen size (media queries, responsive sizes...)
- ๐ the mode (light/dark) (media queries)
- ...
Adapt to the size of the screen
First, you need to add one of these lines in your head
, to make the website automatically adapt itself to the size of the screen.
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, height=device-height, viewport-fit=cover, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
Then, in your CSS, you can write CSS code that will only be executed when the condition of the media query is fulfilled.
@media screen and (max-width: 950px) {}
@media screen and (max-width: 1100px) and (min-width: 950px) {}
Light/Dark theme
In modern browsers, there is a media query to detect the theme.
<link rel="stylesheet" href="dark.css" media="(prefers-color-scheme: dark)">
<link rel="stylesheet" href="light.css" media="(prefers-color-scheme: light)">
โก๏ธ The CSS files are intended to be used to define variables in :root, which will be used by another CSS file, such as main.css
.
You can add a media query directly inside the CSS too.
@media screen and (prefers-color-scheme: dark) { }
@media screen and (prefers-color-scheme: light) { }
๐ป To-do ๐ป
Stuff that I found, but never read/used yet.
Random
- csscss
- stylecow
- stylable
- ct
- get selector from console
- print.css
-
inherit
- Keeping Up With CSS