Cascading Style Sheets, most of the time abbreviated as CSS, is a stylesheet language used to describe the presentation of a document written in HTML or XML (including various XML languages like SVG or XHTML). CSS describes how the structured element must be rendered on screen, on paper, in speech, or on other media.
- MDN
CSS provides structure and style
But if I'm not going to be a designer I don't really need to know CSS, right?
You can apply CSS in multiple ways.
<head>
<title>My Awesome Page</title>
<style>
/* CSS goes here! */
</style>
</head>
<p style="[ put your styles here ]">Hi!</p>
<head>
<title>My Awesome Page</title>
<link rel="stylesheet" href="/path/to/css">
</head>
CSS allows you to describe the look and layout of the elements on your page
Hello, CSS!
color: red;
Hello, CSS!
Hello, CSS!
font-weight: bold;
Hello, CSS!
width: 200px;
border: 3px solid blue;
selector {
rule: value;
}
h1 {
color: red;
}
h1#heading {
color: orange;
}
h1 #heading {
color: yellow;
}
a:hover {
color: blue;
}
a:active, a:visited {
color: green;
}
a, a:active, a:visited, a:hover {
text-decoration: none;
}
p {
font-size: 24px;
}
div.success {
border: 1px solid blue;
}
We can apply CSS to all elements of a page.
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
span {
/* ... */
}
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
p span {
/* ... */
}
We can specify the selection as well.
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
p {
/* ... */
}
Selections will cover all sub-elements.
If there are two competing rules, the last one applies.
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
span {}
span {}
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
With different selections, we can create complex styling.
p {}
span {}
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
<body>
<p>Hello, <span>CSS!</span></p>
<span>You're perfect!</span>
</body>
It can also get a bit confusing.
p {}
span {}
p span {}
By attaching style to specific elements or a specific sequence of elements, our CSS becomes tightly coupled with our HTML.
<body>
<p class="yellow">
Hello,
<span class="red">
CSS!
</span>
</p>
<span class="blue">
You're perfect!
</span>
</body>
.blue {}
.yellow {}
.red {}
Instead, it's better to use classes.
<body>
<p class="yellow">
Hello,
<span class="red">
CSS!
</span>
</p>
<span class="blue">
You're perfect!
</span>
</body>
Classes are more descriptive and aren't tied to HTML structure, but that doesn't mean they won't cascade.
<body>
<p class="yellow">
Hello,
<span class="red">
CSS!
</span>
</p>
<span class="blue">
You're perfect!
</span>
</body>
.blue {}
.yellow {}
.red {}
<body>
<p class="yellow red">
Hello,
<span class="red blue">
CSS!
</span>
</p>
<span class="yellow blue red">
You're perfect!
</span>
</body>
What color will each element be?
Cascading Style Sheets
By cascading, we mean that multiple styles can be applied, from the most general to the most specific
CSS specificity is determined by the following*:
id
class
inline
element
!important
* for the most part
CSS specificity is determined by the following, in order*:
element
class
id
inline
!important
* for the most part
So, when in doubt, just use !important then?
Specificity for any given selector is an aggregate number.
p {
/* ... */
}
p span {
/* ... */
}
p .red {
/* ... */
}
#red {
/* ... */
}
0 0 1
0 0 2
0 1 1
1 0 0
p.red {
/* ... */
}
article #new {
/* ... */
}
ul li a.current {
/* ... */
}
#slides .show {
/* ... */
}
0 1 1
1 0 1
0 1 3
1 1 0
this is the most specific
selector {
rule: value;
}
h1 {
color: red;
}
h1#heading {
color: orange;
}
h1 #heading {
color: yellow;
}
a:hover {
color: blue;
}
a:active, a:visited {
color: green;
}
a, a:active, a:visited, a:hover {
text-decoration: none;
}
p {
font-size: 24px;
}
div.success {
border: 1px solid blue;
}
selector {
rule: value;
}
p span {
/* some rules */
}
<p>Visit my <span>Shop</span></p>
<selector>This is selected.</selector>
div.warning a {
/* some rules */
}
<div class="warning">
<a href="#">My Link</a>
</div>
.errors .msg {
/* some rules */
}
<div class="errors">
<div class="msg">A Message</div>
</div>
form input[type="checkbox"] {
/* some rules */
}
<form>
<input type="checkbox">
</form>
p {
display: none;
}
ul.sub-menu li {
display: inline-block;
}
div.warning div.message p {
opacity: 0;
}
img {
margin: 10px 0 15px;
}
p::before {
content: "-";
}
img + p {
border: 1px dashed blue;
border-bottom: none;
}
div.success > p:nth-child(2n+2) {
text-transform: uppercase;
}
* {
margin: 0;
padding: 0;
}
.box {
height: 50px;
width: 75px;
}
.box {
margin: 10px;
height: 50px;
width: 75px;
}
css
css
.box {
margin: 10px;
padding: 5px;
height: 50px;
width: 75px;
}
css
.box {
border: 3px solid red;
margin: 10px;
padding: 5px;
height: 50px;
width: 75px;
}
css
But what's the width of all of these boxes?
Most people are choosing border-box these days.
Some elements are blocks. That is, each one takes up a new line on the page regardless of their width.
actual width
actual width
actual width
actual width
Other elements are, by default, inline. That is, they sit next to each other as they can fit. Inline elements can't have a width or a height.
inline element
inline
inline element
element
inline element
inline element
inline element
We can also change the display to inline-block which allows inline elements to have a width and height.
actual width
actual width
actual width
actual width
It will also allow block elements to appear next to one another.
display: block;
display: inline;
aside
article
nav
section
form
p
ul
li
a
img
span
label
input
em
b
And many more!
Between block elements, margin collapsing occurs.
image
img {
display: block;
margin: 50px 0;
}
<div>
<img src="images/cat.png">
<img src="images/dog.png">
</div>
image
image
image
Inline-block elements are not meant for layout. Instead, we use floating which allows for content to flow around the floated element.
block
block
block, floating right
block
Floating can be tricky. The process is something like:
block
block
block, floating right
block
block, floating right
block
the right block is removed from the normal flow
the left block goes up to replace the removed item
Floated elements will float up to the next block element. Many elements can be floated near each other -- and we do so in order to create interesting layouts.
The best way to learn is to try it. So let's do it!
Floating is great until we want to stop floating. We'd expect for it to be something like this:
floating left
block
floating right
floating left
ah fuck
floating right
Instead:
It's actually not that mysterious. Floating removes the element from the normal flow. Other elements must take their place. What's actually happening is this:
floating left
oh okay
floating right
the element non-floating element moves up
We can add clear: both to the block element to make it "clear" the floating elements.
floating left
cleared element
floating right
Give it a try on your own with the following exercise.