CSSNotes For Professionals
CSSNotes For Professionals
t
r
a
d
e
m
a
r
1
Chapter 1: Getting started with CSS
Version Release Date
1 1996-12-17
2 1998-05-12
3 2015-10-13
The attribute rel of the <link> tag has to be set to "stylesheet", and the href attribute to the relative or absolute
path to the stylesheet. While using relative URL paths is generally considered good practice, absolute paths can
be used, too. In HTML5 the type attribute can be omitted.
It is recommended that the <link> tag be placed in the HTML file's <head> tag so that the styles are loaded
before the elements they style. Otherwise, users will see a flash of unstyled content.
Example
hello-world.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>Hello world!</h1>
<p>I ♥ CSS</p>
</body>
</html>
style.css
h1 {
color: green;
text-decoration: underline;
}
p{
font-size: 25px;
font-family: 'Trebuchet MS', sans-serif;
}
Make sure you include the correct path to your CSS file in the href. If the CSS file is in the same folder as your
HTML file then no path is required (like the example above) but if it's saved in a folder, then specify it like this
href="foldername/style.css".
External stylesheets are considered the best way to handle your CSS. There's a very simple reason for this: when
you're managing a site of, say, 100 pages, all controlled by a single stylesheet, and you want to change your link
colors from blue to green, it's a lot easier to make the change in your CSS file and let the changes "cascade"
throughout all 100 pages than it is to go into 100 separate pages and make the same change 100 times.
Again, if you want to completely change the look of your website, you only need to update this one file.
You can load as many CSS files in your HTML page as needed.
CSS rules are applied with some basic rules, and order does matter. For example, if you have a main.css file with
some code in it:
All your paragraphs with the 'green' class will be written in light green, but you can override this with another
.css file just by including it after main.css. You can have override.css with the following code follow main.css, for
example:
Now all your paragraphs with the 'green' class will be written in darker green rather than light
green. Other principles apply, such as the '!important' rule, specificity, and inheritance.
When someone first visits your website, their browser downloads the HTML of the current page plus the linked
CSS file. Then when they navigate to another page, their browser only needs to download the HTML of that
page; the CSS file is cached, so it does not need to be downloaded again. Since browsers cache the external
stylesheet, your pages load faster.
<head>
<style>
h1 {
color: green;
text-decoration: underline;
}
p{
font-size: 25px;
font-family: 'Trebuchet MS', sans-serif;
}
</style>
</head>
<body>
<h1>Hello world!</h1>
<p>I ♥ CSS</p>
</body>
Section 1.3: CSS @import rule (one of CSS at-rule)
The @import CSS at-rule is used to import style rules from other style sheets. These rules must precede all
other types of rules, except @charset rules; as it is not a nested statement, @import cannot be used inside
conditional group at-rules. @import.
<style>
@import url('/css/styles.css');
</style>
The following line imports a CSS file named additional-styles.css in the root directory into the CSS file in which it appears:
@import '/additional-styles.css';
Importing external CSS is also possible. A common use case are font files.
@import 'https://fonts.googleapis.com/css?family=Lato';
Inline styles override any CSS in a <style> tag or external style sheet. While this can be useful in some
circumstances, this fact more often than not reduces a project's maintainability.
The styles in the following example apply directly to the elements to which they are attached.
Inline styles are generally the safest way to ensure rendering compatibility across various email clients,
programs and devices, but can be time-consuming to write and a bit challenging to manage.
It's possible to add, remove or change CSS property values with JavaScript through an element's style property.
var el = document.getElementById("element"); el.style.opacity = 0.5;
el.style.fontFamily = 'sans-serif';
Note that style properties are named in lower camel case style. In the example you see that the css property font-
family becomes fontFamily in javascript.
As an alternative to working directly on elements, you can create a <style> or <link> element in JavaScript and
append it to the <body> or <head> of the HTML document.
jQuery
$('#element').css('margin', '5px');
jQuery includes two ways to change css rules that have hyphens in them (i.e. font-size). You can put them in quotes
or camel-case the style rule name.
See also
list-style-type defines the shape or type of bullet point used for each list-item.
li {
list-style-type: square;
}
The list-style-image property determines whether the list-item icon is set with an image, and accepts a value of
none or a URL that points to an image.
li {
list-style-image: url(images/bullet.png);
}
The list-style-position property defines where to position the list-item marker, and it accepts one of two values:
"inside" or "outside".
li {
list-style-position: inside;
}
Chapter 2: Structure and Formatting of
a CSS Rule
Section 2.1: Property Lists
Some properties can take multiple values, collectively known as a property list.
/* Alternate Formatting */
span {
text-shadow:
yellow 0 0 3px, green 4px 4px 10px;
}
So the blue color applies to all <div> elements and all <p> elements. Without the comma only <p> elements that
are a child of a <div> would be red.
<p>
elements of the blue class
element with the ID first every
<span> inside of a <div>
h1 {}
Chapter 3: Comments
Section 3.1: Single Line
/* This is a CSS comment */
div {
color: red; /* This is a CSS comment */
}
Note: The value of an ID must be unique in a web page. It is a violation of the HTML standard to use the
value of an ID more than once in the same document tree.
A complete list of selectors can be found in the CSS Selectors Level 3 specification.
Attribute selectors can be used with various types of operators that change the selection criteria accordingly.
They select an element using the presence of a given attribute or attribute value.
Notes:
1. The attribute value can be surrounded by either single-quotes or double-quotes. No quotes at all may
also work, but it's not valid according to the CSS standard, and is discouraged.
2. There is no single, integrated CSS4 specification, because it is split into separate modules. However, there
are "level 4" modules. See browser support.
Details
[attribute]
div[data-color] {
color: red;
}
[attribute="value"]
div[data-color="red"] {
color: red;
}
[attribute*="value"]
Selects elements with the given attribute and value where the given attribute contains the given value anywhere
(as a substring).
[class*="foo"] {
color: red;
}
[attribute~="value"]
Selects elements with the given attribute and value where the given value appears in a whitespace-separated list.
[class~="color-red"] {
color: red;
}
[attribute^="value"]
Selects elements with the given attribute and value where the given attribute begins with the value.
[class^="foo-"] {
color: red;
}
[attribute$="value"]
Selects elements with the given attribute and value where the given attribute ends with the given value.
[class$="file"] {
color: red;
}
[attribute|="value"]
Selects elements with a given attribute and value where the attribute's value is exactly the given value or is
exactly the given value followed by - (U+002D)
[lang|="EN"] {
color: red;
}
[attribute="value" i]
Selects elements with a given attribute and value where the attribute's value can be represented as Value, VALUE,
vAlUe or any other case-insensitive possibility.
[lang="EN" i] {
color: red;
}
*[type=checkbox] // 0-1-0
Note that this means an attribute selector can be used to select an element by its ID at a lower level of
specificity than if it was selected with an ID selector: [id="my-ID"] targets the same element as #my-ID but with
lower specificity.
Note: Sibling selectors target elements that come after them in the source document. CSS, by its
nature (it cascades), cannot target previous or parent elements. However, using the flex order property,
a previous sibling selector can be simulated on visual media.
A descendant combinator, represented by at least one space character (), selects elements that are a descendant
of the defined element. This combinator selects all descendants of the element (from child elements on down).
div p {
color:red;
}
<div>
<p>My text is red</p>
<section>
<p>My text is red</p>
</section>
</div>
In the above example, the first two <p> elements are selected since they are both descendants of the <div>.
The child (>) combinator is used to select elements that are children, or direct descendants, of the specified
element.
div > p {
color:red;
}
<div>
<p>My text is red</p>
<section>
<p>My text is not red</p>
</section>
</div>
The above CSS selects only the first <p> element, as it is the only paragraph directly descended from a
<div>. The second <p> element is not selected because it is not a direct child of the <div>.
The adjacent sibling (+) combinator selects a sibling element that immediate follows a specified element.
p+p{
color:red;
}
The above example selects only those <p> elements which are directly preceded by another <p> element.
The general sibling (~) combinator selects all siblings that follow the specified element.
p~p{
color:red;
}
The above example selects all <p> elements that are preceded by another <p> element, whether or not they are
immediately adjacent.
Syntax
selector:pseudo-class { property: VALUE;
}
List of pseudo-classes:
Name Description
:active Applies to any element being activated (i.e. clicked) by the user.
Allows you to build sets of related selectors by creating groups that the
:any included items will match. This is an alternative to repeating an entire
selector.
Selects the current active #news element (clicked on a
:target URL containing that anchor name)
Applies to radio, checkbox, or option elements that are
:checked checked or toggled into an "on" state.
Represents any user interface element that is the default among a group
:default of similar elements.
:disabled Applies to any UI element which is in a disabled state.
:empty Applies to any element which has no children.
:enabled Applies to any UI element which is in an enabled state.
Used in conjunction with the @page rule, this selects the first page
:first in a printed document.
:first-child Represents any element that is the first child element of its parent.
Applies when an element is the first of the selected element
:first-of-type type inside its parent. This may or may not be the first-child.
Applies to any element which has the user's focus. This can be given by
:focus the user's keyboard, mouse events, or other forms of input.
Can be used to highlight a whole section when one element inside it is focused. It
:focus-within matches any element that the :focus pseudo-class matches or that has a descendant
focused.
Applies to any element displayed in full-screen mode. It selects the whole
:full-screen stack of elements and not just the top level element.
Applies to any element being hovered by the user's pointing device,
:hover but not activated.
Applies radio or checkbox UI elements which are neither checked nor
:indeterminate unchecked, but are in an indeterminate state. This can be due to an
element's attribute or DOM manipulation.
The :in-range CSS pseudo-class matches when an element has
its value attribute inside the specified range limitations for this
:in-range
element. It allows the page to give a feedback that the value
currently defined using the element is inside the range limits.
Applies to <input> elements whose values are invalid according
:invalid to the type specified in the type= attribute.
Applies to any element who's wrapping <body> element has a properly
:lang designated lang= attribute. For the pseudo-class to be valid, it
must contain a valid two or three letter language code.
:last-child Represents any element that is the last child element of its parent.
Applies when an element is the last of the selected element type
:last-of-type inside its parent. This may or may not be the last-child.
Used in conjunction with the @page rule, this selects all the
:left left pages in a printed document.
:link Applies to any links which haven't been visited by the user.
Applies to all elements which do not match the value passed to
:not() (:not(p) or :not(.class-name) for example. It must have a value to be valid and it
can only contain one selector. However, you can chain multiple together. :not selectors
Applies when an element is the n-th element of its parent, where n
can be an integer, a mathematical expression (e.g n+3) or the
keywords odd or even.
:nth-child
Applies when an element is the n-th element of its parent of
the same element type, where n can be an integer, a
mathematical expression (e.g n+3) or the keywords odd or even.
The :only-child CSS pseudo-class represents any element
:nth-of-type which is the only child of its parent. This is the same as
:first-child:last-child or :nth-child(1):nth-last-child(1), but with a lower
specificity.
The :optional CSS pseudo-class represents any element
:only-child that does not have the required attribute set on it. This allows
forms to easily indicate optional fields and to style them accordingly.
The :out-of-range CSS pseudo-class matches when an element has its value
attribute outside the specified range limitations for this element.
:optional It allows the page to give a feedback that the value currently defined using
the element is outside the range limits. A value can be outside of a range if
it is either smaller or larger than maximum and minimum set values.
:out-of-range
:placeholder-shown Experimental. Applies to any form element currently displaying placeholder text.
:read-only Applies to any element which is not editable by the user.
:read-write Applies to any element that is editable by a user, such as <input> elements.
Used in conjunction with the @page rule, this selects all the right pages
:right in a printed document.
:root matches the root element of a tree representing the document.
CSS pseudo-class matches the elements that are a
:scope reference point for selectors to match against.
Selects the current active #news element (clicked on a
:target URL containing that anchor name)
:visited Applies to any links which have has been visited by the user.
The :visited pseudoclass can't be used for most styling in a lot of modern browsers anymore because
it's a security hole. See this link for reference.
pseudo-selector 1 2 3 4 5 6 7 8 9 10
:first-child ✔
:nth-child(3) ✔
:nth-child(n+3) ✔✔✔✔✔✔✔
✔
:nth-child(3n) ✔ ✔ ✔
:nth-child(3n+1) ✔ ✔ ✔ ✔
:nth-child(-n+3) ✔✔✔
:nth-child(odd) ✔ ✔ ✔ ✔ ✔
:nth-child(even) ✔ ✔ ✔ ✔ ✔
:last-child ✔
:nth-last-child(3) ✔
<div class="warning">
<p>This would be some warning copy.</p>
</div>
You can also combine class names to target elements more specifically. Let's build on the example above to
showcase a more complicated class selection.
CSS
.important {
color: orange;
}
.warning {
color: blue;
}
.warning.important {
color: red;
}
HTML
<div class="warning">
<p>This would be some warning copy.</p>
</div>
In this example, all elements with the .warning class will have a blue text color, elements with the .important class
with have an orange text color, and all elements that have both the .important and .warning class name will have a red
text color.
Notice that within the CSS, the .warning.important declaration did not have any spaces between the two class names.
This means it will only find elements which contain both class names warning and important in their class attribute.
Those class names could be in any order on the element.
If a space was included between the two classes in the CSS declaration, it would only select elements that have
parent elements with a .warning class names and child elements with .important class names.
Section 4.7: Select element using its ID without the
high specificity of the ID selector
This trick helps you select an element using the ID as a value for an attribute selector to avoid the high
specificity of the ID selector.
HTML:
<div id="element">...</div>
CSS
p:last-of-type {
background: #C5CAE9;
}
h1:last-of-type {
background: #CDDC39;
}
<div class="container">
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Last paragraph</p>
<h1>Heading 1</h1>
<h2>First heading 2</h2>
<h2>Last heading 2</h2>
</div>
jsFiddle
The :in-range CSS pseudo-class matches when an element has its value attribute inside the specified range
limitations for this element. It allows the page to give a feedback that the value currently defined using the
element is inside the range limits.[1]
The following selector matches all <input> elements in an HTML document that are not disabled and don't have
the class .example:
HTML:
<form>
Phone: <input type="tel" class="example">
E-mail: <input type="email" disabled="disabled"> Password: <input type="password">
</form>
CSS:
input:not([disabled]):not(.example){
background-color: #ccc;
}
input:not([disabled], .example){
background-color: #ccc;
}
The :not() pseudo-class will also support comma-separated selectors in Selectors Level 4:
CSS:
CSS:
div {
height: 80px;
}
input{
margin:30px;
}
div:focus-within {
background-color: #1565C0;
}
To the very beginning of your document, add as much booleans as you want with a unique id and the hidden
attribute set:
<div id="footer">
<!-- ... -->
</div>
Change the boolean's value
You can toggle the boolean by adding a label with the for attribute set:
The normal selector (like .color-red) specifies the default properties. They can be overridden by following true /
false selectors:
/* true: */
<checkbox>:checked ~ [sibling of checkbox & parent of target] <target>
/* false: */
<checkbox>:not(:checked) ~ [sibling of checkbox & parent of target] <target>
Note that <checkbox>, [sibling ...] and <target> should be replaced by the proper selectors. [sibling ...]
can be a specific selector, (often if you're lazy) simply * or nothing if the target is already a sibling of the checkbox.
In action
<div id="exampleID">
<p>Example</p>
</div>
#exampleID {
width: 20px;
}
Note: The HTML specs do not allow multiple elements with the same ID
Section 4.13: How to style a Range input
HTML
<input type="range"></input>
CSS
CSS:
p:only-child {
<div>
color: blue;
<p>This paragraph is the only child of the div, it will have the color blue</p>
}
</div>
<div>
<p>This paragraph is one of the two children of the div</p>
<p>This paragraph is one of the two children of its parent</p>
</div>
The above example selects the <p> element that is the unique child from its parent, in this case a <div>.
Live Demo on JSBin
Chapter 5: Backgrounds
With CSS you can set colors, gradients, and images as the background of an element.
It is possible to specify various combinations of images, colors, and gradients, and adjust the size, positioning, and
repetition (among others) of these.
transparent, specifies that the background color should be transparent. This is default.
inherit, inherits this property from its parent element.
initial, sets this property to its default value.
This can be applied to all elements, and ::first-letter/::first-line pseudo-elements. Colors in CSS
can be specified by different methods.
Color names
CSS
div {
background-color: red;/* red */
}
HTML
The example used above is one of several ways that CSS has to represent a single color.
Hex code is used to denote RGB components of a color in base-16 hexadecimal notation. #ff0000, for example,
is bright red, where the red component of the color is 256 bits (ff) and the corresponding green and blue
portions of the color is 0 (00).
If both values in each of the three RGB pairings (R, G, and B) are the same, then the color code can be
shortened into three characters (the first digit of each pairing). #ff0000 can be shortened to #f00, and #ffffff can
be shortened to #fff.
body {
background-color: #de1205; /* red */
}
.main {
background-color: #00f; /* blue */
}
RGB / RGBa
RGB stands for Red, Green and Blue, and requires of three separate values between 0 and 255, put between
brackets, that correspond with the decimal color values for respectively red, green and blue.
RGBa allows you to add an additional alpha parameter between 0.0 and 1.0 to define opacity.
header {
background-color: rgb(0, 0, 0); /* black */
}
footer {
background-color: rgba(0, 0, 0, 0.5); /* black with 50% opacity */
}
HSL / HSLa
Another way to declare a color is to use HSL or HSLa and is similar to RGB and RGBa.
HSL stands for hue, saturation, and lightness, and is also often called HLS:
Hue is a degree on the color wheel (from 0 to 360).
Saturation is a percentage between 0% and 100%.
Lightness is also a percentage between 0% and 100%.
HSLa allows you to add an additional alpha parameter between 0.0 and 1.0 to define opacity.
li a {
background-color: hsl(120, 100%, 50%); /* green */
}
#p1 {
background-color: hsla(120, 100%, 50%, .3); /* green with 30% opacity */
}
body {
background: red;
background-image: url(partiallytransparentimage.png);
}
body {
background-color: red;
background-image: url(partiallytransparentimage.png);
}
body {
background-image: url(partiallytransparentimage.png);
background-color: red;
}
body {
background: red url(partiallytransparentimage.png);
}
They will all lead to the red color being shown underneath the image, where the parts of the image are
transparent, or the image is not showing (perhaps as a result of background-repeat).
body {
background-image: url(partiallytransparentimage.png);
background: red;
}
There are two types of gradient functions, linear and radial. Each type has a non-repeating variant and a repeating
variant:
linear-gradient()
repeating-linear-gradient() radial-
gradient()
repeating-radial-gradient()
linear-gradient()
Value Meaning
Could be an argument like to top, to bottom, to right or to left; or an angle as 0deg,
<direction> 90deg.........The angle starts from to top and rotates clockwise. Can be specified in deg, grad, rad,
or turn. If omitted, the gradient flows from top to bottom
List of colors, optionally followed each one by a percentage or length to display it at. For
<color-stop-list> example, yellow 10%, rgba(0,0,0,.5) 40px, #fff 100%...
For example, this creates a linear gradient that starts from the right and transitions from red to blue
.linear-gradient {
background: linear-gradient(to left, red, blue); /* you can also use 270deg */
}
You can create a diagonal gradient by declaring both a horizontal and vertical starting position.
.diagonal-linear-gradient {
background: linear-gradient(to left top, red, yellow 10%);
}
It is possible to specify any number of color stops in a gradient by separating them with commas. The following
examples will create a gradient with 8 color stops
.linear-gradient-rainbow {
background: linear-gradient(to left, red, orange, yellow, green, blue, indigo, violet)
}
radial-gradient()
.radial-gradient-simple {
background: radial-gradient(red, blue);
}
.radial-gradient {
background: radial-gradient(circle farthest-corner at top left, red, blue);
}
Value Meaning
circle Shape of gradient. Values are circle or ellipse, default is ellipse.
Keywords describing how big the ending shape must be. Values are closest-side, farthest- side, closest-
farthest-corner corner, farthest-corner
top left Sets the position of the gradient center, in the same way as background-position.
Repeating gradients
Repeating gradient functions take the same arguments as the above examples, but tile the gradient across the
background of the element.
.bullseye {
background: repeating-radial-gradient(red, red 10%, white 10%, white 20%);
}
.warning {
background: repeating-linear-gradient(-45deg, yellow, yellow 10%, black 10%, black 20% );
}
Value Meaning
Angle unit. The angle starts from to top and rotates clockwise. Can be specified in deg, grad,
-45deg rad, or turn.
Direction of gradient, default is to bottom. Syntax: to [y-axis(top OR bottom)] [x-axis(left OR right)] ie to top
to left right
yellow 10% Color, optionally followed by a percentage or length to display it at. Repeated two or more times.
Note that HEX, RGB, RGBa, HSL, and HSLa color codes may be used instead of color names. Color names were used
for the sake of illustration. Also note that the radial-gradient syntax is much more complex than linear-gradient,
and a simplified version is shown here. For a full explanation and specs, see the MDN Docs
.myClass {
background-image: url('/path/to/image.jpg');
}
To use multiple images as background-image, define comma separated url()
.myClass {
background-image: url('/path/to/image.jpg'),
url('/path/to/image2.jpg');
}
The images will stack according to their order with the first declared image on top of the others and so on.
Value Result
Specify background image's path(s) or an image resource specified with data URI schema
url('/path/to/image.jpg') (apostrophes can be omitted), separate multiples by comma
none No background image
initial Default value
inherit Inherit parent's value
This following attributes are very useful and almost essential too.
background-clip How the background is painted relative to the content-box, border-box, or the 3+
padding-box
How the background image behaves, whether it scrolls along with its containing block or
background-attachment has a fixed position within the viewport 1+
initial Sets the property to value to default 3+
inherit Inherits property value from parent 2+
The order of the values does not matter and every value is optional
Syntax
In this example, the background-color of the element would be set to green with pattern.png, if it is available, overlayed
on the colour, repeating as often as necessary to fill the element. If pattern.png includes any transparency then the
green colour will be visible behind it.
In this example we have a black background with an image 'picture.png' on top, the image does not repeat in
either axis and is positioned in the top left corner. The / after the position is to be able to include the size of the
background image which in this case is set as 600px width and auto for the height. This example could work well
with a feature image that can fade into a solid colour.
NOTE: Use of the shorthand background property resets all previously set background property
values, even if a value is not given. If you wish only to modify a background property value previously
set, use a longhand property instead.
The background-size property enables one to control the scaling of the background-image. It takes up to two values,
which determine the scale/size of the resulting image in vertical and and horizontal direction. If the property is
missing, its deemed auto in both width and height.
auto will keep the image's aspect ratio, if it can be determined. The height is optional and can be considered auto.
Therefore, on a 256 px × 256 px image, all the following background-size settings would yield an image with height
and width of 50 px:
background-size: 50px;
background-size: 50px auto; /* same as above */
background-size: auto 50px;
background-size: 50px 50px;
So if we started with the following picture (which has the mentioned size of 256 px × 256 px),
we'll end up with a 50 px × 50 px on the user's screen, contained in the background of our element:
One can also use percentage values to scale the image with respect of the element. The following example would
yield a 200 px × 133 px drawn image:
#withbackground {
background-image: url(to/some/background.png);
width: 200px;
height: 200px;
padding: 0;
margin: 0;
}
The last example in the previos section lost its original aspect ratio. The circle got into an ellipse, the square into a
rectangle, the triangle into another triangle.
The length or percentage approach isn't flexible enough to keep the aspect ratio at all times. auto doesn't help,
since you might not know which dimension of your element will be larger. However, to cover certain areas with
an
image (and correct aspect ratio) completely or to contain an image with correct aspect ratio completely in a
background area, the values, contain and cover provide the additional functionality.
Sorry for the bad pun, but we're going to use a picture of the day by Biswarup Ganguly for demonstration. Lets
say that this is your screen, and the gray area is outside of your visible screen. For demonstration, We're going
to assume a 16 × 9 ratio.
We want to use the aforementioned picture of the day as a background. However, we cropped the image to 4x3
for some reason. We could set the background-size property to some fixed length, but we will focus on contain and
cover. Note that I also assume that we didn't mangle the width and/or height of body.
contain
contain
Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both
its width and its height can fit inside the background positioning area.
This makes sure that the background image is always completely contained in the background positioning area,
however, there could be some empty space filled with your background-color in this case:
cover
cover
Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both
its width and its height can completely cover the background positioning area.
This makes sure that the background image is covering everything. There will be no visible background-color,
however depending on the screen's ratio a great part of your image could be cut off:
<div>
<div class="contain"></div>
<p>Note the grey background. The image does not cover the whole region, but it's fully
<em>contained</em>.
<p>Note the ducks/geese at the bottom of the image. Most of the water is cut, as well as a part of the sky. You don't see the complete image anymore, but n
.myClass {
background-image: url('path/to/image.jpg');
background-position: 50% 50%;
}
The position is set using an X and Y co-ordinate and be set using any of the units used within CSS.
Unit Description
A percentage for the horizontal offset is relative to (width of background positioning area - width of
background image).
value% value% A percentage for the vertical offset is relative to (height of background positioning area - height of
background image)
The size of the image is the size given by background-size.
Offsets background image by a length given in pixels relative to the top left of the background
valuepx valuepx positioning area
Units in CSS can be specified by different methods (see here).
In addition to the shorthand property above, one can also use the longhand background properties background-
position-x and background-position-y. These allow you to control the x or y positions separately.
NOTE: This is supported in all browsers except Firefox (versions 31-48) 2. Firefox 49, to be released
September 2016, will support these properties. Until then, there is a Firefox hack within this Stack
Overflow answer.
Possible values:
CSS
.example {
width: 300px;
border: 20px solid black;
padding: 50px;
background: url(https://static.pexels.com/photos/6440/magazines-desk-work-workspace-medium.jpg);
background-repeat: no-repeat;
}
.example1 {}
HTML
<p>background-origin: border-box:</p>
<div class="example example2">
<h2>Lorem Ipsum Dolor</h2>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna
aliquam erat volutpat.</p>
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
</div>
<p>background-origin: content-box:</p>
<div class="example example3">
<h2>Lorem Ipsum Dolor</h2>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna
aliquam erat volutpat.</p>
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
</div>
Result:
More:
https://www.w3.org/TR/css3-background/#the-background-origin
https://developer.mozilla.org/en-US/docs/Web/CSS/background-origin
#mydiv {
background-image: url(img_1.png), /* top image */
url(img_2.png), /* middle image */
url(img_3.png); /* bottom image */
background-position: right bottom,
left top, right top;
background-repeat: no-repeat,
repeat,
no-repeat;
}
Images will be stacked atop one another with the first background on top and the last background in the back.
img_1 will be on top, the img_2 and img_3 is on bottom.
We can also use background shorthand property for this:
#mydiv {
background: url(img_1.png) right bottom no-repeat, url(img_2.png) left top repeat, url(img_3.png) right top no-repeat;
}
#mydiv {
background: url(image.png) right bottom no-repeat,
linear-gradient(to bottom, #fff 0%,#000 100%);
}
Demo
body {
background-image: url('img.jpg');
background-attachment: fixed;
}
Value Description
scroll The background scrolls along with the element. This is
default. fixed The background is fixed with regard to the
viewport.
local The background scrolls along with the element's
contents. initial Sets this property to its default value.
inherit Inherits this property from its parent element.
Examples
background-attachment: scroll
The default behaviour, when the body is scrolled the background scrolls with it:
body {
background-image: url('image.jpg');
background-attachment: scroll;
}
background-attachment: fixed
The background image will be fixed and will not move when the body is scrolled:
body {
background-image: url('image.jpg');
background-attachment: fixed;
}
background-attachment: local
The background image of the div will scroll when the contents of the div is scrolled.
div {
background-image: url('image.jpg');
background-attachment: local;
}
Values
border-box is the default value. This allows the background to extend all the way to the outside edge of the
element's border.
padding-box clips the background at the outside edge of the element's padding and does not let it extend
into the border;
content-box clips the background at the edge of the content box.
inherit applies the setting of the parent to the selected element.
CSS
.example {
width: 300px;
border: 20px solid black;
padding: 50px;
background: url(https://static.pexels.com/photos/6440/magazines-desk-work-workspace-medium.jpg);
background-repeat: no-repeat;
}
.example1 {}
HTML
<p>background-origin: border-box:</p>
<div class="example example2">
<h2>Lorem Ipsum Dolor</h2>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</p>
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
</div>
<p>background-origin: content-box:</p>
<div class="example example3">
<h2>Lorem Ipsum Dolor</h2>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
</div>
CSS Syntax: background-blend-mode: normal | multiply | screen | overlay | darken | lighten | color-dodge |
saturation | color | luminosity;
/* For IE 8*/
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
Chapter 6: Centering
Section 6.1: Using Flexbox
HTML:
<div class="container">
<img src=/>
</div>
CSS:
View Result
HTML:
<img src=/>
CSS:
html, body {
height: 100%;
}
body {
display: flex;
justify-content: center; /* horizontal center */
align-items: center;/* vertical center */
}
View Result
See Dynamic Vertical and Horizontal Centering under the Flexbox documentation for more details on flexbox and
what the styles mean.
Browser Support
Some recent browser versions, such as Safari 8 and IE10, require vendor prefixes.
For a quick way to generate prefixes there is Autoprefixer, a third-party tool.
For a more detailed look at flexbox browser support, see this answer.
Section 6.2: Using CSS transform
CSS transforms are based on the size of the elements so if you don't know how tall or wide your element is, you
can position it absolutely 50% from the top and left of a relative container and translate it by 50% left and
upwards to center it vertically and horizontally.
Keep in mind that with this technique, the element could end being rendered at a non-integer pixel boundary,
making it look blurry. See this answer in SO for a workaround.
HTML
<div class="container">
<div class="element"></div>
</div>
CSS
.container {
position: relative;
}
.element {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
The transform property needs prefixes to be supported by older browsers. Prefixes are needed for Chrome<=35,
Safari<=8, Opera<=22, Android Browser<=4.4.4, and IE9. CSS transforms are not supported by IE8 and older
versions.
MORE INFORMATION
The element is being positioned according to the first non-static parent ( position: relative, absolute, or
fixed). Explore more in this fiddle and this documentation topic.
For horizontal-only centering, use left: 50% and transform: translateX(-50%). The same goes for vertical- only
centering: center with top: 50% and transform: translateY(-50%).
Using a non-static width/height elements with this method of centering can cause the centered
element to appear squished. This mostly happens with elements containing text, and can be fixed by
adding: margin- right: -50%; and margin-bottom: -50%;. View this fiddle for more information.
Section 6.3: Using margin: 0 auto;
Objects can be centered by using if they are block elements and have a defined width.
margin: 0 auto;
HTML
<div class="containerDiv">
<div id="centeredDiv"></div>
</div>
<div class="containerDiv">
<p id="centeredParagraph">This is a centered paragraph.</p>
</div>
<div class="containerDiv">
<img id="centeredImage"
src="https://i.kinja-img.com/gawker-media/image/upload/s--c7Q9b4Eh--/c_scale,fl_progressive,q_80,w_ 800/qqyvc3bkpyl3mfhr8all.jpg" />
</div>
CSS
Result:
JSFiddle example: Centering objects with margin: 0 auto;
HTML
<p>Lorem ipsum</p>
CSS
p{
text-align: center;
}
This does not work for centering entire block elements. text-align controls only alignment of inline content like text in
its parent block element.
Automatic margins, paired with values of zero for the left and right or top and bottom offsets, will center an
absolutely positioned elements within its parent.
View Result
HTML
<div class="parent">
<img class="center" src=/>
</div>
CSS
.parent {
position: relative;
height: 500px;
}
.center {
position: absolute;
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
Elements that don't have their own implicit width and height like images do, will need those values defined.
Other resources: Absolute Centering in CSS
CSS
.center {
position: absolute; height: 50px; width: 50px; background: red;
top: calc(50% - 50px / 2); /* height divided by 2*/
left: calc(50% - 50px / 2); /* width divided by 2*/
}
HTML
<div class="center"></div>
CSS
div {
height: 200px;
line-height: 200px;
}
That's quite ugly, but can be useful inside an <input /> element. The line-height property works only when the
text to be centered spans a single line. If the text wraps into multiple lines, the resulting output won't be
centered.
CSS
HTML
HTML
<div class="content">
<div class="position-container">
<div class="thumb">
<img src=>
</div>
<div class="details">
<p class="banner-title">text 1</p>
<p class="banner-text">content content content content content content content content content content content content content content</p>
<button class="btn">button</button>
</div>
</div>
</div>
CSS
.content * {
box-sizing: border-box;
}
.content .position-container {
display: table;
}
.content .details { display: table-cell; vertical-align: middle;
width: 33.333333%;
padding: 30px;
font-size: 17px;
text-align: center;
}
.content .thumb {
width: 100%;
}
.content .thumb img {
width: 100%;
}
Link to JSFiddle
The main points are the 3 .thumb, .details and .position-container containers: The .position-
container must have display: table.
The .details must have the real width set width:....................and display: table-cell, vertical-align:
middle.
The .thumb must have width: 100% if you want that it will take all the remaining space and it will be
influenced by the .details width.
The image (if you have an image) inside .thumb should have width: 100%, but it is not necessary if you have
correct proportions.
Set up a "ghost" element inside the container to be centered that is 100% height, then use vertical-align:
middle on both that and the element to be centered.
CSS
y space character rendered. Could be eliminated by nudging .centered (nudge distance depends on font family), or by zeroing font-size i
/* The element to be centered, can also be of any width and height */
.centered {
display: inline-block; vertical-align: middle; width: 300px;
white-space: normal; /* Resetting inherited nowrap behavior */
}
HTML
<div class="block">
<div class="centered"></div>
</div>
Demo
HTML
<div class="outer-container">
<div class="inner-container">
<div class="centered-content"> You can put anything here!
</div>
</div>
</div>
CSS
body {
margin : 0;
}
<div class="wrap">
<img src=/>
</div>
CSS
.wrap {
height: 50px;/* max image height */
width: 100px;
border: 1px solid blue;
text-align: center;
}
.wrap:before {
content:"";
display: inline-block;
height: 100%;
vertical-align: middle;
width: 1px;
}
img {
vertical-align: middle;
}
HTML
<div class="center">
Center vertically and horizontally
</div>
CSS
.center {
position: absolute;
background: #ccc;
left: 50%;
width: 150px;
margin-left: -75px;/* width * -0.5 */
top: 50%;
height: 200px;
margin-top: -100px;/* height * -0.5 */
}
You can center the element horizontally even if you don't know the height of the content:
HTML
<div class="center">
Center only horizontally
</div>
CSS
.center {
position: absolute;
background: #ccc;
left: 50%;
width: 150px;
margin-left: -75px;/* width * -0.5 */
}
You can center the element vertically if you know the element's height:
HTML
CSS
.center {
position: absolute;
background: #ccc;
top: 50%;
height: 200px;
margin-top: -100px;/* width * -0.5 */
}
Section 6.14: Vertically align dynamic height elements
Applying css intuitively doesn't produce the desired results because
HTML
<div class="vcenter--container">
<div class="vcenter--helper">
<div class="vcenter--content">
<!--stuff-->
</div>
</div>
</div>
CSS
.vcenter--container { display: table; height: 100%; position: absolute; overflow: hidden; width: 100%;
}
.vcenter--helper { display: table-cell; vertical-align: middle;
}
.vcenter--content { margin: 0 auto; width: 200px;
}
HTML
<div class="wrapper">
<div class="parent">
<div class="child"></div>
</div>
</div>
CSS
.wrapper {
display: table; vertical-align: center; width: 200px;
height: 200px;
background-color: #9e9e9e;
}
.parent {
display: table-cell; vertical-align: middle; text-align: center;
}
.child {
display: inline-block; vertical-align: middle; text-align: center; width: 100px;
height: 100px;
background-color: teal;
}
Chapter 7: The Box Model
Parameter Detail
content-box Width and height of the element only includes content area.
padding-box Width and height of the element includes content and padding.
border-box Width and height of the element includes content, padding and border.
initial Sets the box model to its default state.
inherit Inherits the box model of the parent element.
The browser creates a rectangle for each element in the HTML document. The Box Model describes how the
padding, border, and margin are added to the content to create this rectangle.
The perimeter of each of the four areas is called an edge. Each edge defines a box.
The innermost rectangle is the content box. The width and height of this depends on the element's
rendered content (text, images and any child elements it may have).
Next is the padding box, as defined by the padding property. If there is no padding width defined, the padding
edge is equal to the content edge.
Then we have the border box, as defined by the border property. If there is no border width defined, the
border edge is equal to the padding edge.
The outermost rectangle is the margin box, as defined by the margin property. If there is no margin width
defined, the margin edge is equal to the border edge.
Example
div {
border: 5px solid red; margin: 50px; padding: 20px;
}
This CSS styles all div elements to have a top, right, bottom and left border of 5px in width; a top, right, bottom
and left margin of 50px; and a top, right, bottom, and left padding of 20px. Ignoring content, our generated box
will look like this:
As there is no content, the content region (the blue box in the middle) has no height or width (0px by 0px).
The padding box by default is the same size as the content box, plus the 20px width on all four edges
we're defining above with the padding property (40px by 40px).
The border box is the same size as the padding box, plus the 5px width we're defining above with the border
property (50px by 50px).
Finally the margin box is the same size as the border box, plus the 50px width we're defining above with the
margin property (giving our element a total size of 150px by 150px).
Now lets give our element a sibling with the same style. The browser looks at the Box Model of both elements to
work out where in relation to the previous element's content the new element should be positioned:
The content of each of element is separated by a 150px gap, but the two elements' boxes touch each other.
If we then modify our first element to have no right margin, the right margin edge would be in the same position
as the right border edge, and our two elements would now look like this:
textarea {
width: 100%;
padding: 3px;
box-sizing: content-box; /* default value */
}
Since the padding will be added to the width of the textarea, the resulting element is a textarea that is wider
than 100%.
Fortunately, CSS allows us to change the box model with the box-sizing property for an element. There are three
different values for the property available:
content-box: The common box model - width and height only includes the content, not the padding or
border
padding-box: Width and height includes the content and the padding, but not the border
border-box: Width and height includes the content, the padding as well as the border
To solve the textarea problem above, you could just change the box-sizing property to padding-box or border- box. border-
box is most commonly used.
textarea {
width: 100%;
padding: 3px;
box-sizing: border-box;
}
To apply a specific box model to every element on the page, use the following snippet:
html {
box-sizing: border-box;
}
*, *:before, *:after {
box-sizing: inherit;
}
In this coding box-sizing:border-box; is not directly applied to *, so you can easily overwrite this property on
individual elements.
Chapter 8: Margins
Parameter Details
0 set margin to none
auto used for centering, by evenly setting values on each
side units (e.g. px) see parameter section in Units for a list of valid
units inherit inherit margin value from parent element
initial restore to initial value
div{
margin: 10px;
}
<div>
some content
</div>
<div>
some more content
</div>
They will be 10px apart since vertical margins collapse over one and other. (The spacing will not be the sum of two
margins.)
span{
margin: 10px;
}
<span>some</span><span>content</span>
They will be 20px apart since horizontal margins don't collapse over one and other. (The spacing will be the sum
of two margins.)
.top{
margin: 10px;
}
.bottom{
margin: 15px;
}
These elements will be spaced 15px apart vertically. The margins overlap as much as they can, but the larger
margin will determine the spacing between the elements.
.outer-top{
margin: 10px;
}
.inner-top{
margin: 15px;
}
.outer-bottom{
margin: 20px;
}
.inner-bottom{
margin: 25px;
}
<div class="outer-top">
<div class="inner-top"> some content
</div>
</div>
<div class="outer-bottom">
<div class="inner-bottom"> some more content
</div>
</div>
What will be the spacing between the two texts? (hover to see answer)
The spacing will be 25px. Since all four margins are touching each other, they will collapse, thus using the
largest margin of the four.
div{
border: 1px solid red;
}
What will be the spacing between the two texts? (hover to see answer)
The spacing will be 59px! Now only the margins of .outer-top and .outer-bottom touch each other,
and are the only collapsed margins. The remaining margins are separated by the borders. So we have
1px + 10px + 1px + 15px + 20px + 1px + 25px + 1px. (The 1px's are the borders...)
HTML:
<h1>Title</h1>
<div>
<p>Paragraph</p>
</div>
CSS
h1 {
margin: 0;
background: #cff;
}
div {
margin: 50px 0 0 0;
background: #cfc;
}
p{
margin: 25px 0 0 0;
background: #cf9;
}
In the example above, only the largest margin applies. You may have expected that the paragraph would be
located 60px from the h1 (since the div element has a margin-top of 40px and the p has a 20px margin-top). This
does not happen because the margins collapse together to form one margin.
CSS allows you to specify a given side to apply margin to. The four properties provided for this purpose are:
margin-left
margin-right
margin-top
margin-bottom
The following code would apply a margin of 30 pixels to the left side of the selected div. View Result
HTML
<div id="myDiv"></div>
CSS
#myDiv {
margin-left: 30px; height: 40px; width: 40px;
background-color: red;
}
Parameter Details
margin-left The direction in which the margin should be
applied. 30px The width of the margin.
Specifying Direction Using Shorthand Property
The standard margin property can be expanded to specify differing widths to each side of the selected elements.
The syntax for doing this is as follows:
margin: <top> <right> <bottom> <left>;
The following example applies a zero-width margin to the top of the div, a 10px margin to the right side, a 50px
margin to the left side, and a 100px margin to the left side. View Result
HTML
<div id="myDiv"></div>
CSS
#myDiv {
margin: 0 10px 50px 100px;
height: 40px;
width: 40px;
background-color: red;
}
/*equals to:*/
margin:1px 1px;
/*equals to:*/
/*equals to:*/
Another exapmle:
p{
margin:10px 15px; /* 10px margin-top & bottom And 15px margin-right & left*/
/*equals to:*/
/*equals to:*/
In the example above we use the shorthand margin declaration to first set 0 to the top and bottom margin values
(although this could be any value) and then we use auto to let the browser allocate the space automatically to
the left and right margin values.
In the example above, the #myDiv element is set to 80% width which leaves use 20% leftover. The browser
distributes this value to the remaining sides so:
.parent {
width : 500px;
height: 300px;
}
.child {
width : 100px;
height: 100px;
margin-left: 10%;/* (parentWidth * 10/100) => 50px */
}
But that is not the case, when comes to margin-top and margin-bottom. Both these properties, in percentages, aren't
relative to the height of the parent container but to the width of the parent container.
So,
.parent {
width : 500px;
height: 300px;
}
.child {
width : 100px;
height: 100px;
margin-left: 10%;/* (parentWidth * 10/100) => 50px*/
margin-top: 20%;/* (parentWidth * 20/100) => 100px */
}
div{
display: inline;
}
#over{
margin-left: -20px;
}
<div>Base div</div>
<div id="over">Overlapping div</div>
Chapter 9: Padding
Section 9.1: Padding Shorthand
The padding property sets the padding space on all sides of an element. The padding area is the space between the
content of the element and its border. Negative values are not allowed.
To save adding padding to each side individually (using padding-top, padding-left etc) can you write it as a shorthand,
as below:
Four values:
<style>
.myDiv {
padding: 25px 50px 75px 100px; /* top right bottom left; */
}
</style>
<div class="myDiv"></div>
Three values:
<style>
.myDiv {
padding: 25px 50px 75px; /* top left/right bottom */
}
</style>
<div class="myDiv"></div>
Two values:
<style>
.myDiv {
padding: 25px 50px; /* top/bottom left/right */
}
</style>
<div class="myDiv"></div>
One value:
<style>
.myDiv {
padding: 25px; /* top/right/bottom/left */
}
</style>
<div class="myDiv"></div>
padding-top
padding-right
padding-bottom
padding-left
The following code would add a padding of 5px to the top of the div:
<style>
.myClass {
padding-top: 5px;
}
</style>
<div class="myClass"></div>
Chapter 10: Border
Section 10.1: border-radius
The border-radius property allows you to change the shape of the basic box model.
Every corner of an element can have up to two values, for the vertical and horizontal radius of that corner (for a
maximum of 8 values).
The first set of values defines the horizontal radius. The optional second set of values, preceded by a ‘/’ , defines the
vertical radius. If only one set of values is supplied, it is used for both the vertical and horizontal radius.
The 10px is the horizontal radius of the top-left-and-bottom-right. And the 5% is the horizontal radius of
the top- right-and-bottom-left. The other four values after '/' are the vertical radii for top-left, top-right,
bottom-right and bottom-left.
As with many CSS properties, shorthands can be used for any or all possible values. You can therefore specify
anything from one to eight values. The following shorthand allows you to set the horizontal and vertical radius
of every corner to the same value:
HTML:
<div class='box'></div>
CSS:
.box {
width: 250px;
height: 250px; background-color: black; border-radius: 10px;
}
Border-radius is most commonly used to convert box elements into circles. By setting the border-radius to half
of the length of a square element, a circular element is created:
.circle {
width: 200px;
height: 200px;
border-radius: 100px;
}
Because border-radius accepts percentages, it is common to use 50% to avoid manually calculating the border-
radius value:
.circle {
width: 150px; height: 150px; border-radius: 50%;
}
-webkit-border-top-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-webkit-border-bottom-left-radius: 0;
-webkit-border-top-left-radius: 0;
-moz-border-radius-topright: 4px;
-moz-border-radius-bottomright: 4px;
-moz-border-radius-bottomleft: 0;
-moz-border-radius-topleft: 0; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 0;
border-top-left-radius: 0;
If the width and height properties are not equal, the resulting shape will be an oval rather than a circle.
Browser specific border-radius example:
Examples:
border-style: dotted;
border-style: dotted solid double dashed;
border-style can also have the values none and hidden. They have the same effect, except hidden works for border
conflict resolution for <table> elements. In a <table> with multiple borders, none has the lowest priority
(meaning in a conflict, the border would show), and hidden has the highest priority (meaning in a conflict, the
border would not show).
Section 10.3: Multiple Borders
Using outline:
.div1{
border: 3px solid black; outline: 6px solid blue; width: 100px;
height: 100px;
margin: 20px;
}
Using box-shadow:
.div2{
border: 5px solid green;
box-shadow: 0px 0px 0px 4px #000;
width: 100px; height: 100px; margin: 20px;
}
.div3 {
position: relative; border: 5px solid #000; width: 100px;
height: 100px;
margin: 20px;
}
.div3:before { content: " "; position: absolute;
border: 5px solid blue;
z-index: -1; top: 5px; left: 5px; right: 5px; bottom: 5px;
}
http://jsfiddle.net/MadalinaTn/bvqpcohm/2/
Instead of writing:
These shorthands are also available for every side of an element: border-top, border-left, border-right and
border-bottom. So you can do:
table {
border-collapse: separate; /* default */
border-spacing: 2px; /* Only works if border-collapse is separate */
}
The image will be split into nine regions with 30x30 pixels. The edges will be used as the corners of the border
while the side will be used in between. If the element is higher / wider than 30px this part of the image will be
stretched. The middle part of the image defaults to be transparent.
HTML
<div class='bordered'>Border on all sides</div>
The above example would produce a border that comprises of 5 different colors. The colors are defined through a
linear-gradient (you can find more information about gradients in the docs). You can find more information about
border-image-slice property in the border-image example in same page.
(Note: Additional properties were added to the element for presentational purpose.)
You'd have noticed that the left border has only a single color (the start color of the gradient) while the right
border also has only a single color (the gradient's end color). This is because of the way that border image
property works. It is as though the gradient is applied to the entire box and then the colors are masked from the
padding and content areas, thus making it look as though only the border has the gradient.
Which border(s) have a single color is dependant on the gradient definition. If the gradient is a to right gradient,
the left border would be the start color of the gradient and right border would be the end color. If it was a to
bottom gradient the top border would be the gradient's start color and bottom border would be end color. Below is
the output of a to bottom 5 colored gradient.
If the border is required only on specific sides of the element then the border-width property can be used just like
with any other normal border. For example, adding the below code would produce a border only on the top of the
element.
Note that, any element that has border-image property won't respect the border-radius (that is the border won't curve). This
is based on the below statement in the spec:
A box's backgrounds, but not its border-image, are clipped to the appropriate curve (as determined by
‘background-clip’).
#element {
border-left: 1px solid black;
}
Chapter 11: Outlines
Parameter Details
dotted dotted outline
dashed dashed outline
solid solid outline
double double outline
groove 3D grooved outline, depends on the outline-color
value ridge 3D ridged outline, depends on the outline-color value
inset 3D inset outline, depends on the outline-color value
outset 3D outset outline, depends on the outline-color value
none no outline
hidden hidden outline
In addition, outlines can be non-rectangular in some browsers. This can happen if outline is applied on a span
element that has text with different font-size properties inside it. Unlike borders, outlines cannot have rounded
corners.
The essential parts of outline are outline-color, outline-style and outline-width. The definition of
an outline is equivalent to the definition of a border:
An outline is a line around an element. It is displayed around the margin of the element. However, it is
different from the border property.
p{
border: 1px solid black;
outline-color:blue; line-height:30px;
}
.p1{
outline-style: dotted;
}
.p2{
outline-style: dashed;
}
.p3{
outline-style: solid;
}
.p4{
outline-style: double;
}
.p5{
outline-style: groove;
}
.p6{
outline-style: ridge;
}
.p7{
outline-style: inset;
}
.p8{
outline-style: outset;
}
HTML
CSS
div {
width:100px;
outline: 1px dashed #bbb;
}
#div1 {
overflow-wrap:normal;
}
#div2 {
overflow-wrap:break-word;
}
HTML
ng>: Small words are displayed normally, but a long word like <span style="red;">supercalifragilisticexpialidocious</span> is too long so it will overflow past
ng>: Small words are displayed normally, but a long word like <span style="red;">supercalifragilisticexpialidocious</span> will be split at the line break and c
overflow-wrap – Value Details
normal Lets a word overflow if it is longer than the line
break-word Will split a word into multiple lines, if necessary
inherit Inherits the parent element's value for this
property
HTML
<div id="div-x">
If this div is too small to display its contents, the content to the left and right will be clipped.
</div>
<div id="div-y">
If this div is too small to display its contents, the content to the top and bottom will be clipped.
</div>
CSS
div {
width: 200px;
height: 200px;
}
#div-x {
overflow-x: hidden;
}
#div-y {
overflow-y: hidden;
}
<div>
This div is too small to display its contents to display the effects of the overflow property.
</div>
CSS
Result
The content above is clipped in a 100px by 100px box, with scrolling available to view overflowing content.
Most desktop browsers will display both horizontal and vertical scrollbars, whether or not any content is
clipped. This can avoid problems with scrollbars appearing and disappearing in a dynamic environment. Printers
may print overflowing content.
<div>
Even if this div is too small to display its contents, the content is not clipped.
</div>
CSS
Result
Content is not clipped and will be rendered outside the content box if it exceeds its container size.
CSS
img {
float:left;
margin-right: 10px;
}
div {
overflow:hidden; /* creates block formatting context */
}
HTML
<img src=>
<div>
<p>Lorem ipsum dolor sit amet, cum no paulo mollis pertinacia.</p>
<p>Ad case omnis nam, mutat deseruisse persequeris eos ad, in tollit debitis sea.</p>
</div>
Result
This example shows how paragraphs within a div with the overflow property set will interact with a floated image.
Chapter 13: Media Queries
Parameter Details
mediatype (Optional) This is the type of media. Could be anything in the range of all to screen.
(Optional) Doesn't apply the CSS for this particular media type and applies for
not everything else.
media feature Logic to identify use case for CSS. Options outlined below.
Media Feature Details
aspect-ratio Describes the aspect ratio of the targeted display area of the output device.
Indicates the number of bits per color component of the output device. If the device is
color not a color device, this value is zero.
color-index Indicates the number of entries in the color look-up table for the output device.
grid Determines whether the output device is a grid device or a bitmap device.
height The height media feature describes the height of the output device's rendering surface.
max-width CSS will not apply on a screen width wider than specified.
min-width CSS will not apply on a screen width narrower than specified.
max-height CSS will not apply on a screen height taller than specified.
min-height CSS will not apply on a screen height shorter than specified.
monochrome Indicates the number of bits per pixel on a monochrome (greyscale) device.
orientation CSS will only display if device is using specified orientation. See remarks for more details.
resolution Indicates the resolution (pixel density) of the output device.
scan Describes the scanning process of television output devices.
The width media feature describes the width of the rendering surface of the output
width device (such as the width of the document window, or the width of the page box on a
printer).
Deprecated Features Details
Deprecated
CSS will only display on devices whose height/width ratio matches the specified
device-aspect-ratio max- ratio. This is adeprecatedfeature and is not guaranteed to work.
Deprecated Same as max-width but measures the physical screen width, rather than the display
width of the browser.
device-width min-device-
Deprecated Same as min-width but measures the physical screen width, rather than the display
width of the browser.
width max-device-height Deprecated Same as max-height but measures the physical screen width, rather than the
display width of the browser.
Deprecated Same as min-height but measures the physical screen width, rather than the
min-device-height display width of the browser.
A Media Query containing a Media Feature (and an implicit Media Type of "all")
@media (orientation: portrait) {
/* One or more CSS rules to apply when the query is satisfied */
}
1. The page must be viewed on a normal screen (not a printed page, projector, etc).
2. The width of the user's view port must be at least 720 pixels.
If these conditions are met, the styles inside the media query will be active, and the background color of the
page will be sky blue.
Media queries are applied dynamically. If on page load the conditions specified in the media query are met, the CSS
will be applied, but will be immediately disabled should the conditions cease to be met. Conversely, if the
conditions are initially not met, the CSS will not be applied until the specified conditions are met.
In our example, if the user's view port width is initially greater than 720 pixels, but the user shrinks the
browser's width, the background color will cease to be sky blue as soon as the user has resized the view port to
less than 720 pixels in width.
The above CSS code will give the DOM HTML element a white background color when being printed.
The mediatype parameter has an optional not or only prefix that will apply the styles to everything except the
specified mediatype or only the specified media type, respectively. For example, the following code example will
apply the style to every media type except print.
And the same way, for just showing it only on the screen, this can be used:
The list of mediatype can be understood better with the following table:
Background Information
There are two types of pixels in the display. One is the logical pixels and the other is the physical pixels. Mostly,
the physical pixels always stay the same, because it is the same for all the display devices. The logical pixels
change based on the resolution of the devices to display higher quality pixels. The device pixel ratio is the ratio
between physical pixels and logical pixels. For instance, the MacBook Pro Retina, iPhone 4 and above report a
device pixel ratio of 2, because the physical linear resolution is double the logical resolution.
The reason why this works only with WebKit based browsers is because of:
The vendor prefix -webkit- before the rule.
This hasn't been implemented in engines other than WebKit and Blink.
The width media feature describes the width of the rendering surface of the output device (such as the
width of the document window, or the width of the page box on a printer).
View-port is the width of the device itself. If your screen resolution says the resolution is 1280 x 720, your
view-port width is "1280px".
More often many devices allocate different pixel amount to display one pixel. For an example iPhone 6 Plus
has 1242 x 2208 resolution. But the actual viewport-width and viewport-height is 414 x 736. That means 3
pixels are used to create 1 pixel.
But if you did not set the meta tag correctly it will try to show your webpage with its native resolution which
results in a zoomed out view (smaller texts and images).
/* Styles in this block are only applied if the screen size is atleast 300px wide, but no more than 767px */
}
/* Styles in this block are only applied if the screen size is atleast 768px wide, but no more than 1023px */
}
/* Styles in this block are only applied if the screen size is over 1024px wide. */
}
This stylesheet is still downloaded but is applied only on devices with screen width larger than 600px.
To add support for IE8, you could use one of several JS solutions. For example, Respond can be added to add
media query support for IE8 only with the following code :
<!--[if lt IE 9]>
<script
src="respond.min.js">
</script>
<![endif]-->
CSS Mediaqueries is another library that does the same thing. The code for adding that library to your HTML
would be identical :
<!--[if lt IE 9]>
<script
src="css3-mediaqueries.js">
</script>
<![endif]-->
The alternative
If you don't like a JS based solution, you should also consider adding an IE<9 only stylesheet where you adjust your
styling specific to IE<9. For that, you should add the following HTML to your code:
<!--[if lt IE 9]>
<link rel="stylesheet" type="text/css" media="all" href="style-ielt9.css"/>
<![endif]-->
Note :
Technically it's one more alternative: using CSS hacks to target IE<9. It has the same impact as an IE<9 only
stylesheet, but you don't need a separate stylesheet for that. I do not recommend this option, though, as they
produce invalid CSS code (which is but one of several reasons why the use of CSS hacks is generally frowned upon
today).
Chapter 14: Floats
Section 14.1: Float an Image Within Text
The most basic use of a float is having text wrap around an image. The below code will produce two
paragraphs and an image, with the second paragraph flowing around the image. Notice that it is always
content after the floated element that flows around the floated element.
HTML:
Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eg
ignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel
CSS:
img {
float:left; margin-right:1rem;
}
p.clear {
clear: both;
}
</style>
</head>
<body>
</body>
</html>
Not to be confused with the clear property, clearfix is a concept (that is also related to floats, thus the possible
confusion). To contain floats, you've to add .cf or .clearfix class on the container (the parent) and style this class
with a few rules described below.
3 versions with slightly different effects (sources :A new micro clearfix hack by N. Gallagher and clearfix reloaded by
T. J. Koblentz):
.cf:after {
clear: both;
}
.cf:after {
clear: both;
}
Clearfix with support of outdated browsers IE6 and IE7
.cf:before,
.cf:after {
content: " ";
display: table;
}
.cf:after {
clear: both;
}
/**
For IE 6/7 only
Include this rule to trigger hasLayout and contain floats.
*/
.cf {
*zoom: 1;
}
Other resource: Everything you know about clearfix is wrong (clearfix and BFC - Block Formatting Context while
hasLayout relates to outdated browsers IE6 maybe 7)
<div>
<p>This is DIV 1</p>
</div>
<div>
<p>This is DIV 2</p>
</div>
<div class="outer-div">
<div class="inner-div1">
<p>This is DIV 1</p>
</div>
<div class="inner-div2">
<p>This is DIV 2</p>
</div>
</div>
CSS
.inner-div1 {
width: 50%; margin-right:0px; float:left;
background : #337ab7;
padding:50px 0px;
}
.inner-div2 {
width: 50%; margin-right:0px; float:left;
background : #dd2c00;
padding:50px 0px;
}
p{
text-align:center;
}
Codepen Link
HTML:
enaeos.
sque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iacul
CSS:
Floated elements don't use any height. Adding "overflow:hidden;" forces the parent element to expand to contain its floated children.
verflow:hidden;
>
CSS:
rapper {
idth:600px; background-color:pink; padding:20px;
Floated elements don't use any height. Adding "overflow:hidden;" forces the parent element to expand to contain its floated children.
verflow:hidden;
ontent {
width:300px;
background-color:yellow; float:left;
}
.right-sidebar {
width:150px;
background-color:green; float:right;
}
Section 14.8: Two-Column Lazy/Greedy Layout
This layout uses one floated column to create a two-column layout with no defined widths. In this example the
left sidebar is "lazy," in that it only takes up as much space as it needs. Another way to say this is that the left
sidebar is "shrink-wrapped." The right content column is "greedy," in that it takes up all the remaining space.
HTML:
iet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. </p>
llentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus,
CSS:
.sidebar {
/* `display:table;` shrink-wraps the column */
display:table; float:left; background-color:blue;
}
.content {
/* `overflow:hidden;` prevents `.content` from flowing under `.sidebar` */
overflow:hidden; background-color:yellow;
}
Fiddle
Chapter 15: Typography
Parameter Details
font-style italics or oblique
font-variant normal or small-caps
font-weight normal, bold or numeric from 100 to 900.
font-size The font size given in %, px, em, or any other valid CSS measurement
line-height The line height given in %, px, em, or any other valid CSS
measurement font-family This is for defining the family's name.
color Any valid CSS color representation, like red, #00FF00, hsl(240, 100%, 50%) etc.
Whether or not to use a confenced or expanded face from font. Valid values are normal, ultra-
font-stretch condensed, extra-condensed, condensed, semi-condensed, semi-expanded, expanded, extra- expanded or ultra-
expanded
text- start, match-parent
end, left, right, center, justify,
align
text-decoration none, underline, overline, line-through, initial, inherit;
element {
font: [font-style] [font-variant] [font-weight] [font-size/line-height] [font-family];
}
You can have all your font-related styles in one declaration with the font shorthand. Simply use the font property,
and put your values in the correct order.
For example, to make all p elements bold with a font size of 20px and using Arial as the font family typically you
would code it as follows:
p{
font-weight: bold;
font-size: 20px;
font-family: Arial, sans-serif;
}
p{
font: bold 20px Arial, sans-serif;
}
Note: that since font-style, font-variant, font-weight and line-height are optional, the three of them are skipped in this
example. It is important to note that using the shortcut resets the other attributes not given.
Another important point is that the two necessary attributes for the font shortcut to work are font-size and font- family.
If they are not both included the shortcut is ignored.
font-style: normal;
font-variant: normal;
font-weight: normal;
font-stretch: normal;
font-size: medium;
line-height: normal;
q{
quotes: "«" "»";
}
CSS:
#element-one {
font-size: 30px;
}
#element-two {
font-size: 10px;
}
The text inside #element-one will be 30px in size, while the text in #element-two will be 10px in size.
The direction property is used to change the horizontal text direction of an element.
Syntax: direction: ltr | rtl | initial | inherit;
The writing-mode property changes the alignment of text so it can be read from top-to-bottom or from left-to-right,
depending on the language.
Syntax: direction: horizontal-tb | vertical-rl | vertical-lr;
The browser will attempt to apply the font face "Segoe UI" to the characters within the elements targeted by
the above property. If this font is not available, or the font does not contain a glyph for the required character,
the browser will fall back to Tahoma, and, if necessary, any sans-serif font on the user's computer. Note that
any font names with more than one word such as "Segoe UI" need to have single or double quotes around them.
The browser will attempt to apply the font face "Consolas" to the characters within the elements targeted by
the above property. If this font is not available, or the font does not contain a glyph for the required character,
the browser will fall back to "Courier New," and, if necessary, any monospace font on the user's computer.
.text {
overflow: hidden;
text-overflow: ellipsis;
}
Unfortunately, text-overflow: ellipsis only works on a single line of text. There is no way to support ellipsis on
the last line in standard CSS, but it can be achieved with non-standard webkit-only implementation of flexboxes.
.giveMeEllipsis {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: N; /* number of lines to show */
line-height: X;/* fallback */
max-height: X*N;/* fallback */
}
https://www.w3.org/TR/2012/WD-css3-ui-20120117/#text-overflow0
h1 {
text-shadow: 2px 2px 10px #0000FF;
}
Multiple Shadows
h1 {
text-shadow: 0 0 3px #FF0000, 0 0 5px #0000FF;
}
CSS
.example1 {
text-transform: uppercase;
}
.example2 {
text-transform: capitalize;
}
.example3 {
text-transform: lowercase;
}
HTML
<p class="example1">
all letters in uppercase<!-- "ALL LETTERS IN UPPERCASE" -->
</p>
<p class="example2">
all letters in capitalize <!-- "All Letters In Capitalize (Sentence Case)" -->
</p>
<p class="example3">
all letters in lowercase<!-- "all letters in lowercase" -->
</p>
The letter-spacing property is used to specify the space between the characters in a text.
p{
letter-spacing: -1px;
}
Resources: https://developer.mozilla.org/en-US/docs/Web/CSS/letter-spacing
The text-indent property specifies how much horizontal space text should be moved before the beginning of the
first line of the text content of an element.
Resources:
h1 { text-decoration: none; }
h2 { text-decoration: overline; }
h3 { text-decoration: line-through; } h4 { text-decoration: underline; }
.title {
text-decoration-style: dotted; text-decoration-line: underline; text-decoration-color: blue;
}
It should be noted that the following properties are only supported in Firefox
text-decoration-color
text-decoration-line
text-decoration-style
text-decoration-skip
Section 15.12: Word Spacing
The word-spacing property specifies the spacing behavior between tags and words.
Possible values
CSS
HTML
<p>
<span class="normal">This is an example, showing the effect of "word-spacing".</span><br>
<span class="narrow">This is an example, showing the effect of "word-spacing".</span><br>
<span class="extensive">This is an example, showing the effect of "word-spacing".</span><br>
</p>
Online-Demo
Try it yourself
Further reading:
word-spacing – MDN
word-spacing – w3.org
normal
small-caps
Sets every letter to uppercase, but makes the lowercase letters(from original text) smaller in size than the
letters that originally uppercase.
CSS:
.smallcaps{
font-variant: small-caps;
}
HTML:
Output:
Note: The font-variant property is a shorthand for the properties: font-variant-caps, font-variant-numeric,
font- variant-alternates, font-variant-ligatures, and font-variant-east-asian.
Chapter 16: Flexible Box Layout (Flexbox)
The Flexible Box module, or just 'flexbox' for short, is a box model designed for user interfaces, and it allows
users to align and distribute space among items in a container such that elements behave predictably when the
page layout must accommodate different, unknown screen sizes. A flex container expands items to fill available
space and shrinks them to prevent overflow.
CSS
.aligner {
display: flex;
align-items: center;
justify-content: center;
}
.aligner-item {
max-width: 50%; /*for demo. Use actual width instead.*/
}
Here is a demo.
Reasoning
Property Value Description
This centers the elements along the axis other than the one specified by flex-direction,
align-items center i.e., vertical centering for a horizontal flexbox and horizontal centering for a vertical
flexbox.
This centers the elements along the axis specified by flex-direction. I.e., for a
justify-content center horizontal (flex-direction: row) flexbox, this centers horizontally, and for a vertical flexbox
(flex-direction: column) flexbox, this centers vertically)
All of the below styles are applied onto this simple layout:
<div id="container">
<div></div>
<div></div>
<div></div>
</div>
CSS:
div#container {
display: flex;
flex-direction: row;
justify-content: center;
}
Outcome:
Here is a demo.
CSS:
div#container {
display: flex;
flex-direction: column;
justify-content: center;
}
Outcome:
Here is a demo.
CSS:
div#container {
display: flex;
flex-direction: row;
align-items: center;
}
Outcome:
Here is a demo.
CSS:
div#container {
display: flex;
flex-direction: column;
align-items: center;
}
Outcome:
Here is a demo.
Outcome:
Here is a demo.
Outcome:
Here is a demo.
HTML:
ulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget
<h4>Footer</h4>
</div>
CSS:
html, body {
height: 100%;
}
body {
display: flex;
flex-direction: column;
}
.content {
/* Include `0 auto` for best browser compatibility. */
flex: 1 0 auto;
}
HTML:
<div class="flex-container">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
<div class="flex-item">4</div>
<div class="flex-item">5</div>
</div>
CSS:
.flex-container {
background-color: #000;
height: 100%;
display:flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start; align-content: stretch; align-items: stretch;
}
.flex-item {
background-color: #ccf;
margin: 0.1em;
flex-grow: 1;
flex-shrink: 0;
flex-basis: 200px; /* or % could be used to ensure a specific layout */
}
Outcome:
HTML Markup:
<div class="container">
<header class="header">Header</header>
<div class="content-body">
<main class="content">Content</main>
<nav class="sidenav">Nav</nav>
<aside class="ads">Ads</aside>
</div>
<footer class="footer">Footer</footer>
</div>
CSS:
body {
margin: 0;
padding: 0;
}
.container {
display: flex;
flex-direction: column;
height: 100vh;
}
.header {
flex: 0 0 50px;
}
.content-body {
flex: 1 1 auto;
display: flex;
flex-direction: row;
}
.content-body .sidenav {
order: -1;
flex: 0 0 100px;
overflow: auto;
}
.footer {
flex: 0 0 50px;
}
Demo
HTML
<div class="cards">
<div class="card">
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim mollit labore dolore voluptate ullamco et ut sed qui minim
<p><button>Action</button></p>
</div>
<div class="card">
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim mollit labore dolore voluptate ullamco et ut sed qui minim
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim mollit labore dolore voluptate ullamco et ut sed qui minim
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim mollit labore dolore voluptate ullamco et ut sed qui minim
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim mollit labore dolore voluptate ullamco et ut sed qui minim
<p><button>Action</button></p>
</div>
</div>
First of all, we use CSS to apply display: flex; to the container. This will create 2 columns equal in height with the
content flowing naturally inside it
CSS
.cards {
display: flex;
}
.card {
border: 1px solid #ccc; margin: 10px 10px; padding: 0 20px;
}
button {
height: 40px; background: #fff; padding: 0 40px; border: 1px solid #000;
}
p:last-child {
text-align: center;
}
Final CSS:
.cards {
display: flex;
}
.card {
border: 1px solid #ccc; margin: 10px 10px; padding: 0 20px; display: flex;
flex-direction: column;
}
button {
height: 40px; background: #fff; padding: 0 40px; border: 1px solid #000;
}
p:last-child {
text-align: center;
margin-top: auto;
}
This effect is achieved due to the property align-items being set to stretch by default.
HTML
<div class="container">
<div style="background-color: red"> Some <br />
data <br />
to make<br />
a height <br />
</div>
<div style="background-color: blue"> Fewer <br />
lines <br />
</div>
</div>
CSS
.container {
display: flex;
align-items: stretch; // Default value
}
The universal selector (*) and combinators (like > and ~) have no specificity.
#foo {
color: blue;
}
.bar {
color: red;
background: black;
}
Here we have an ID selector which declares color as blue, and a class selector which declares color as red and
background as black.
An element with an ID of #foo and a class of .bar will be selected by both declarations. ID selectors have a Group A
specificity and class selectors have a Group B specificity. An ID selector outweighs any number of class selectors.
Because of this, color:blue; from the #foo selector and the background:black; from the .bar selector will be applied to
the element. The higher specificity of the ID selector will cause the browser to ignore the .bar selector's color
declaration.
.bar {
color: red;
background: black;
}
.baz {
background: white;
}
Here we have two class selectors; one of which declares color as red and background as black, and the other declares
background as white.
An element with both the .bar and .baz classes will be affected by both of these declarations, however the problem
we have now is that both .bar and .baz have an identical Group B specificity. The cascading nature of CSS resolves
this for us: as .baz is defined after .bar, our element ends up with the red color from .bar but the white background from
.baz.
The last snippet from Example 2 above can be manipulated to ensure our .bar class selector's color declaration is
used instead of that of the .baz class selector.
The most common way to achieve this would be to find out what other selectors can be applied to the .bar selector
sequence. For example, if the .bar class was only ever applied to span elements, we could modify the .bar selector to
span.bar. This would give it a new Group C specificity, which would override the .baz selector's lack thereof:
However it may not always possible to find another common selector which is shared between any element which
uses the .bar class. Because of this, CSS allows us to duplicate selectors to increase specificity. Instead of just
.bar, we can use .bar.bar instead (See The grammar of Selectors, W3C Recommendation). This still selects any
element with a class of .bar, but now has double the Group B specificity:
The !important flag on a style declaration and styles declared by the HTML style attribute are considered to have a
greater specificity than any selector. If these exist, the style declaration they affect will overrule other
declarations regardless of their specificity. That is, unless you have more than one declaration that contains an !
important flag for the same property that apply to the same element. Then, normal specificity rules will apply to
those properties in reference to each other.
Because they completely override specificity, the use of !important is frowned upon in most use cases. One should
use it as little as possible. To keep CSS code efficient and maintainable in the long run, it's almost always better
to increase the specificity of the surrounding selector than to use !important.
One of those rare exceptions where !important is not frowned upon, is when implementing generic helper classes
like a .hidden or .background-yellow class that are supposed to always override one or more properties wherever they
are encountered. And even then, you need to know what you're doing. The last thing you want, when writing
maintainable CSS, is to have !important flags throughout your CSS.
A final note
A common misconception about CSS specificity is that the Group A, B and c values should be combined with each
other (a=1, b=5, c=1 => 151). This is not the case. If this were the case, having 20 of a Group B or c selector would
be enough to override a single Group A or B selector respectively. The three groups should be regarded as
individual levels of specificity. Specificity cannot be represented by a single value.
When creating your CSS style sheet, you should maintain the lowest specificity as possible. If you need to make
the specificity a little higher to overwrite another method, make it higher but as low as possible to make it
higher. You shouldn't need to have a selector like this:
This makes future changes harder and pollutes that css page.
You can calculate the specificity of your selector here
#mydiv {
font-weight: bold !important;/* This property won't be overridden
by the rule below */
}
#outerdiv #mydiv {
font-weight: normal; /* #mydiv font-weight won't be set to normal even if it has a higher specificity because
of the !important declaration above */
Avoiding the usage of !important is strongly recommended (unless absolutely necessary), because it will disturb
the natural flow of css rules which can bring uncertainty in your style sheet. Also it is important to note that
when multiple !important declarations are applied to the same rule on a certain element, the one with the higher
specificity will be the ona applied.
Here are some examples where using !important declaration can be justified:
If your rules shouldn't be overridden by any inline style of the element which is written inside style
attribute of the html element.
To give the user more control over the web accessibility, like increasing or decreasing size of the font-size, by
overriding the author style using !important.
For testing and debugging using inspect element.
See also:
W3C - 6 Assigning property values, Cascading, and Inheritance -- 6.4.2 !important rules
The browser will lookup the corresponding style(s) when rendering an element.
When only one CSS rule set is trying to set a style for an element, then there is no conflict, and that rule set is used.
When multiple rule sets are found with conflicting settings, first the Specificty rules, and then the Cascading
rules are used to determine what style to use.
answer) blue
First the specificity rules are applied, and the one with the highest specificity "wins".
.class {
background: #FFF;
}
<style>
.class { background: #000;
}
<style>
In this case, where you have identical selectors, the cascade kicks in, and determines that the last one loaded
"wins".
red
After applying the specificity rules, there's still a conflict between blue and red, so the cascading rules are
applied on top of the specificity rules. Cascading looks at the load order of the rules, whether inside the same
.css file or in the collection of style sources. The last one loaded overrides any earlier ones. In this case, the
.otherstyle > div rule "wins".
A final note
#elmnt1 {
font-size: 24px;
border-color: red;
}
.mystyle .myotherstyle { font-size: 16px; background-color: black; color: red;
}
<body class="mystyle">
<div id="elmnt1" class="myotherstyle"> Hello, world!
</div>
</body>
font-size: 24;, since #elmnt1 rule set has the highest specificity for the <div> in question, every
property here is set.
border:
border: 3px dotted red;. The border-color red is taken from #elmnt1 rule set, since it has the highest
specificity. The other properties of the border, border-thickness, and border-style are from the div
rule set.
background-color:
background-color: green;. The background-color is set in the div, body.mystyle > div.myotherstyle, and .mystyle
.myotherstyle rule sets. The specificities are (0, 0, 1) vs. (0, 2, 2) vs. (0, 2, 0), so the middle one "wins".
color:
color: red;. The color is set in both the div and .mystyle .myotherstyle rule sets. The latter has the higher
specificity of (0, 2, 0) and "wins".
Chapter 18: Colors
Section 18.1: currentColor
currentColor returns the computed color value of the current element.
Here currentColor evaluates to red since the color property is set to red:
div {
color: red;
border: 5px solid currentColor;
box-shadow: 0 0 5px currentColor;
}
In this case, specifying currentColor for the border is most likely redundant because omitting it should produce
identical results. Only use currentColor inside the border property within the same element if it would be
overwritten otherwise due to a more specific selector.
Since it's the computed color, the border will be green in the following example due to the second rule overriding
the first:
div {
color: blue;
border: 3px solid currentColor;
color: green;
}
The parent's color is inherited, here currentColor evaluates to 'blue', making the child element's border-color blue.
.parent-class {
color: blue;
}
.parent-class .child-class {
border-color: currentColor;
}
currentColor can also be used by other rules which normally would not inherit from the color property, such
as background-color. The example below shows the children using the color set in the parent as its
background:
.parent-class {
color: blue;
}
.parent-class .child-class {
background-color: currentColor;
}
Possible Result:
Section 18.2: Color Keywords
Most browsers support using color keywords to specify a color. For example, to set the color of an element to
blue, use the blue keyword:
.some-class {
color: blue;
}
CSS keywords are not case sensitive—blue, Blue and BLUE will all result in #0000FF.
Color Keywords
Color name Hex value RGB values Color
In addition to the named colors, there is also the keyword transparent, which represents a fully-transparent black:
rgba(0,0,0,0)
Section 18.3: Hexadecimal Value
Background
CSS colors may also be represented as a hex triplet, where the members represent the red, green and blue
components of a color. Each of these values represents a number in the range of 00 to FF, or 0 to 255 in decimal
notation. Uppercase and/or lowercase Hexadecimal values may be used (i.e. #3fc = #3FC = #33ffCC). The browser
interprets #369 as #336699. If that is not what you intended but rather wanted #306090, you need to specify that
explicitly.
The total number of colors that can be represented with hex notation is 256 ^ 3 or 16,777,216.
Syntax
color: #rrggbb;
color: #rgb
Value Description
rr 00 - FF for the amount of red
gg 00 - FF for the amount of green
bb 00 - FF for the amount of blue
.some-class {
/* This is equivalent to using the color keyword 'blue' */
color: #0000FF;
}
.also-blue {
/* If you want to specify each range value with a single number, you can!
This is equivalent to '#0000FF' (and 'blue') */
color: #00F;
}
Hexadecimal notation is used to specify color values in the RGB color format, per the W3C's 'Numerical color
values'.
There are a lot of tools available on the Internet for looking up hexadecimal (or simply hex) color values.
Search for "hex color palette" or "hex color picker" with your favorite web browser to find a bunch of options!
Hex values always start with a pound sign (#), are up to six "digits" long, and are case-insensitive: that is, they
don't care about capitalization. #FFC125 and #ffc125 are the same color.
.some-class {
/* Scalar RGB, equivalent to 'blue'*/
color: rgb(0, 0, 255);
}
.also-blue {
/* Percentile RGB values*/
color: rgb(0%, 0%, 100%);
}
Syntax
rgb(<red>, <green>, <blue>)
Value Description
<red> an integer from 0 - 255 or percentage from 0 - 100%
<green> an integer from 0 - 255 or percentage from 0 - 100%
<blue> an integer from 0 - 255 or percentage from 0 - 100%
.red {
/* Opaque red */
color: rgba(255, 0, 0, 1);
}
.red-50p {
/* Half-translucent red. */
color: rgba(255, 0, 0, .5);
}
Syntax
rgba(<red>, <green>, <blue>, <alpha>);
Value Description
<red> an integer from 0 - 255 or percentage from 0 - 100%
<green> an integer from 0 - 255 or percentage from 0 - 100%
<blue>an integer from 0 - 255 or percentage from 0 - 100%
<alpha> a number from 0 - 1, where 0.0 is fully transparent and 1.0 is fully opaque
Hue is represented as an angle from 0° to 360° (without units), while saturation and lightness are represented as
percentages.
p{
color: hsl(240, 100%, 50%); /* Blue */
}
Syntax
color: hsl(<hue>, <saturation>%, <lightness>%);
Value Description
specified in degrees around the color wheel (without units), where 0° is red, 60° is yellow,
<hue> 120° is green, 180° is cyan, 240° is blue, 300° is magenta, and 360° is red
specified in percentage where 0% is fully desaturated (grayscale) and 100% is fully saturated (vividly
<saturation> colored)
<lightness> specified in percentage where 0% is fully black and 100% is fully white
Notes
A saturation of 0% always produces a grayscale color; changing the hue has no effect.
A lightness of 0% always produces black, and 100% always produces white; changing the hue or saturation
has no effect.
Value Description
specified in degrees around the color wheel (without units), where 0° is red, 60° is yellow,
<hue> 120° is green, 180° is cyan, 240° is blue, 300° is magenta, and 360° is red
<saturation> percentage where 0% is fully desaturated (grayscale) and 100% is fully saturated (vividly colored)
<lightness> percentage where 0% is fully black and 100% is fully white
<alpha> a number from 0 - 1 where 0 is fully transparent and 1 is fully opaque
Chapter 19: Opacity
Section 19.1: Opacity Property
An element's opacity can be set using the opacity property. Values can be anywhere from 0.0 (transparent) to 1.0
(opaque).
Example Usage
<div style="opacity:0.8;">
This is a partially transparent element
</div>
.transparent-element {
/* for IE 8 & 9 */
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; // IE8
/* works in IE 8 & 9 too, but also 5, 6, 7 */
filter: alpha(opacity=60); // IE 5-7
/* Modern Browsers */
opacity: 0.6;
}
Chapter 20: Length Units
Unit Description
% Define sizes in terms of parent objects or current object dependent on property
em Relative to the font-size of the element (2em means 2 times the size of the current
font) rem Relative to font-size of the root element
vw Relative to 1% of the width of the
viewport* vh Relative to 1% of the height
of the viewport*
vmin Relative to 1% of viewport's* smaller
dimension vmax Relative to 1% of viewport's* larger
dimension cm centimeters
mm millimeters
in inches (1in = 96px =
2.54cm) pxpixels (1px = 1/96th
of 1in) pt points (1pt = 1/72 of
1in)
pc picas (1pc = 12 pt)
s seconds (used for animations and transitions)
ms milliseconds (used for animations and
transitions) ex Relative to the x-height of the
current font
ch Based on the width of the zero (0)
character fr fractional unit (used for CSS
Grid Layout)
A CSS distance measurement is a number immediately followed by a length unit (px, em, pc, in, …)
CSS supports a number of length measurements units. They are absolute or relative.
You can use rem defined by the font-size of your html tag to style elements by setting their font-size to a value of
rem and use em inside the element to create elements that scale with your global font-size.
HTML:
Relevant CSS:
html {
font-size: 16px;
}
input[type="range"] {
font-size: 1rem;
width: 10em;
}
Possible Result:
em: Relative to the font size of the parent. This causes the compounding issue
rem: Relative to the font size of the root or <html> element. This means it's possible to declare a single
font size for the html element and define all rem units to be a percentage of that.
The main issue with using rem for font sizing is that the values are somewhat difficult to use. Here is an example
of some common font sizes expressed in rem units, assuming that the base size is 16px :
10px = 0.625rem
12px = 0.75rem
14px = 0.875rem
16px = 1rem (base)
18px = 1.125rem
20px = 1.25rem
24px = 1.5rem
30px = 1.875rem
32px = 2rem
CODE:
Version ≥ 3
html {
font-size: 16px;
}
h1 {
font-size: 2rem; /* 32px */
}
p{
font-size: 1rem; /* 16px */
}
li {
font-size: 1.5em; /* 24px */
}
vh, which stands for viewport height is relative to 1% of the viewport height
vw, which stands for viewport width is relative to 1% of the viewport width
Version ≥ 3
div {
width: 20vw;
height: 20vh;
}
Above, the size for the div takes up 20% of the width and height of the viewport
Equation:
For Example:
50px. HTML
CSS
<style>
*{
color: #CCC;
}
.parent{
background-color: blue; width: 100px;
}
.child{
background-color: green; width: 50%;
}
</style>
OUTPUT
Chapter 21: Pseudo-Elements
pseudo-element Description
::after Insert content after the content of an element
::before Insert content before the content of an element
::first-letter Selects the first letter of each element
::first-line Selects the first line of each element
::selection Matches the portion of an element that is selected by a user
Used to create a backdrop that hides the underlying document for an element in the top
::backdrop layer's stack
::placeholder Allows you to style the placeholder text of a form element
(Experimental) For applying list-style attributes on a given element
::marker
(Experimental)
::spelling-error Represents a text segment which the browser has flagged as incorrectly spelled (Experimental)
Represents a text segment which the browser has flagged as grammatically incorrect
::grammar-error (Experimental)
Pseudo-elements, just like pseudo-classes, are added to a CSS selectors but instead of describing a special state,
they allow you to scope and style certain parts of an html element.
For example, the ::first-letter pseudo-element targets only the first letter of a block element specified by the
selector.
The content attribute is required for pseudo-elements to render; however, the attribute can have an empty value
(e.g. content: "").
div {
color: black;
border: 1px solid black;
padding: 1px;
}
ul {
list-style-type: none;
}
Then you add the custom styling. In this example, we will create gradient boxes for bullets.
li:before {
content: "";
display: inline-block; margin-right: 10px; height: 10px;
width: 10px;
background: linear-gradient(red, blue);
}
HTML
<ul>
<li>Test I</li>
<li>Test II</li>
</ul>
Result
Chapter 22: Positioning
Parameter Details
Default value. Elements render in order, as they appear in the document flow. The top, right, bottom,
static left and z-index properties do not apply.
The element is positioned relative to its normal position, so left:20px adds 20 pixels to the element's
relative LEFT position
fixed The element is positioned relative to the browser window
absolute The element is positioned relative to its first positioned (not static) ancestor
element initial Sets this property to its default value.
inherit Inherits this property from its parent element.
Experimental feature. It behaves like position: static within its parent until a given offset threshold
sticky is reached, then it acts as position: fixed.
unset Combination of initial and inherit. More info here.
The higher the z-index, the higher up in the stacking context (on the z-axis) it is placed.
Example
In the example below, a z-index value of 3 puts green on top, a z-index of 2 puts red just under it, and a z-index
of 1 puts blue under that.
HTML
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
CSS
div {
position: absolute; height: 200px; width: 200px;
}
div#div1 {
z-index: 1; left: 0px; top: 0px;
background-color: blue;
}
div#div2 {
z-index: 3; left: 100px; top: 100px;
background-color: green;
}
div#div3 {
z-index: 2;
left: 50px;
top: 150px;
background-color: red;
}
Syntax
z-index: [ number ] | auto;
Parameter Details
An integer value. A higher number is higher on the z-index stack. 0 is the default value. Negative
number values are allowed.
auto Gives the element the same stacking context as its parent. (Default)
Remarks
All elements are laid out in a 3D axis in CSS, including a depth axis, measured by the z-index property. z-index only
works on positioned elements: (see: Why does z-index need a defined position to work?). The only value where it
is ignored is the default value, static.
Read about the z-index property and Stacking Contexts in the CSS Specification on layered presentation and at the
Mozilla Developer Network.
1. top
2. left
3. right
4. bottom
specify the element should appear in relation to its next non-static containing element.
.abspos{
position:absolute; top:0px; left:500px;
}
This code will move the box containing element with attribute class="abspos" down 0px and right 500px relative to
its containing element.
#stickyDiv {
position:fixed; top:10px; left:10px;
}
1. top
2. left
3. right
4. bottom
are used to indicate how far to move the element from where it would have been in normal flow.
.relpos{
position:relative; top:20px; left:30px;
}
This code will move the box containing element with attribute class="relpos" 20px down and 30px to the right
from where it would have been in normal flow.
This keyword lets the element use the normal behavior, that is it is laid out in its current position in the
flow. The top, right, bottom, left and z-index properties do not apply.
.element{
position:static;
}
Chapter 23: Layout Control
Value Effect
none Hide the element and prevent it from occupying space.
block Block element, occupy 100% of the available width, break after element.
inline Inline element, occupy no width, no break after element.
inline-block Taking special properties from both inline and block elements, no break, but can have width.
inline-flex Displays an element as an inline-level flex container.
inline-table The element is displayed as an inline-level table.
grid Behaves like a block element and lays out its content according to the grid model.
Behaves like a block element and lays out its content according to the flexbox
flex model.
inherit Inherit the value from the parent element.
Reset the value to the default value taken from behaviors described in the HTML specifications or
initial from the browser/user default stylesheet.
table Behaves like the HTML table element.
table-cell Let the element behave like a <td> element
table-column Let the element behave like a <col> element
table-row Let the element behave like a<tr> element
list-item Let the element behave like a <li> element.
Inline
An inline element occupies only as much width as necessary. It stacks horizontally with other elements of the
same type and may not contain other non-inline elements.
As demonstrated above, two inline elements, <span> and <b>, are in-line (hence the name) and do not break the
flow of the text.
Block
A block element occupies the maximum available width of its' parent element. It starts with a new line and, in
contrast to inline elements, it does not restrict the type of elements it may contain.
The div element is block-level by default, and as shown above, the two block elements are vertically stacked and,
unlike the inline elements, the flow of the text breaks.
Inline Block
The inline-block value gives us the best of both worlds: it blends the element in with the flow of the text while
allowing us to use padding, margin, height and similar properties which have no visible effect on inline elements.
Elements with this display value act as if they were regular text and as a result are affected by rules
controlling the flow of text such as text-align. By default they are also shrunk to the the smallest size possible to
accommodate their content.
<ul>
<li>First Element </li>
<li>Second Element </li>
<li>Third Element </li>
</ul>
<ul>
<li>First Element </li>
<li>Second Element </li>
<li>Third Element </li>
</ul>
<!--Inline-block: unordered list-->
<style>
li {
display : inline-block; background : lightblue; padding:10px;
</style>
<ul>
<li>First Element </li>
<li>Second Element </li>
<li>Third Element </li>
</ul>
none
An element that is given the none value to its display property will not be displayed at
all. For example let's create a div-element that has an id of myDiv:
<div id="myDiv"></div>
This can now be marked as not being displayed by the following CSS rule:
#myDiv {
display: none;
}
When an element has been set to be display:none; the browser ignores every other layout property for that
specific element (both position and float). No box will be rendered for that element and its existence in html does
not affect the position of following elements.
Note that this is different from setting the visibility property to hidden. Setting visibility: hidden; for an element
would not display the element on the page but the element would still take up the space in the rendering process
as if it would be visible. This will therefore affect how following elements are displayed on the page.
The none value for the display property is commonly used along with JavaScript to show or hide elements at will,
eliminating the need to actually delete and re-create them.
<table>
<tr>
<td>
I'm a table
</td>
</tr>
</table>
<div class="table-div">
<div class="table-row-div">
<div class="table-cell-div"> I behave like a table now
</div>
</div>
</div>
Chapter 24: Grid
Grid layout is a new and powerful CSS layout system that allows to divide a web page content into rows and
columns in an easy way.
The CSS Grid is defined as a display property. It applies to a parent element and its immediate children only.
Consider the following markup:
<section class="container">
<div class="item1">item1</div>
<div class="item2">item2</div>
<div class="item3">item3</div>
<div class="item4">item4</div>
</section>
The easiest way to define the markup structure above as a grid is to simply set its display property to grid:
.container {
display: grid;
}
However, doing this will invariably cause all the child elements to collapse on top of one another. This is
because the children do not currently know how to position themselves within the grid. But we can explicitly
tell them.
First we need to tell the grid element .container how many rows and columns will make up its structure and we can
do this using the grid-columns and grid-rows properties (note the pluralisation):
.container {
display: grid;
grid-columns: 50px 50px 50px;
grid-rows: 50px 50px;
}
However, that still doesn't help us much because we need to give an order to each child element. We can do this by
specifying the grid-row and grid-column values which will tell it where it sits in the grid:
.container .item1 {
grid-column: 1;
grid-row: 1;
}
.container .item2 {
grid-column: 2;
grid-row: 1;
}
.container .item3 {
grid-column: 1;
grid-row: 2;
}
.container .item4 {
grid-column: 2;
grid-row: 2;
}
By giving each item a column and row value it identifies the items order within the container.
View a working example on JSFiddle. You'll need to view this in IE10, IE11 or Edge for it to work as these are
currently the only browsers supporting Grid Layout (with vendor prefix -ms-) or enable a flag in Chrome, Opera
and Firefox according to caniuse in order to test with them.
Chapter 25: Tables
Section 25.1: table-layout
The table-layout property changes the algorithm that is used for the layout of a table.
Below an example of two tables both set to width: 150px:
The table on the left has table-layout: auto while the one on the right has table-layout: fixed. The former is
wider than the specified width (210px instead of 150px) but the contents fit. The latter takes the defined
width of 150px, regardless if the contents overflow or not.
Value Description
auto This is the default value. It defines the layout of the table to be determined by the contents of its' cells.
This value sets the table layout to be determined by the width property provided to the table. If the
fixed content of a cell exceeds this width, the cell will not resize but instead, let the content overflow.
Below an example with two tables with different values set to the empty-cells property:
The table on the left has empty-cells: show while the one on the right has empty-cells: hide. The former does
display the empty cells whereas the latter does not.
Value Description
show This is the default value. It shows cells even if they are empty.
hide This value hides a cell altogether if there are no contents in the cell.
More Information:
https://www.w3.org/TR/CSS21/tables.html#empty-cells
https://developer.mozilla.org/en-US/docs/Web/CSS/empty-cells
http://codepen.io/SitePoint/pen/yfhtq
https://css-tricks.com/almanac/properties/e/empty-cells/
The table on the left has border-collapse: separate while the one on the right has border-collapse: collapse.
Value Description
separate This is the default value. It makes the borders of the table separate from each other.
collapse This value sets the borders of the table to merge together, rather than being distinct.
Below an example of two tables with different values to the border-spacing property:
The table on the left has border-spacing: 2px (default) while the one on the right has border-spacing: 8px.
Value Description
<length> This is the default behavior, though the exact value can vary between browsers.
<length> <length> This syntax allows specifying separate horizontal and vertical values respectively.
Below an example with two tables with different values set to the caption-side property:
The table on the left has caption-side: top while the one on the right has caption-side: bottom.
Value Description
top This is the default value. It places the caption above the
table. bottom This value places the caption below the table.
Chapter 26: Transitions
Parameter Details
The specific CSS property whose value change needs to be transitioned (or) all, if all the
transition-property transitionable properties need to be transitioned.
The duration (or period) in seconds (s) or milliseconds (ms) over which the
transition-duration
must take
place.
transition A function that describes how the intermediate values during the
transition are
calculated. Commonly used values are ease, ease-in, ease-out, ease-in-out, linear,
transition-timing-function cubic-bezier(), steps(). More information about the various timing functions can be found in
the W3C specs.
The amount of time that must have elapsed before the transition can start. Can be
transition-delay specified in seconds (s) or milliseconds (ms)
div{
width: 150px; height:150px; background-color: red;
transition: background-color 1s;
}
div:hover{
background-color: green;
}
HTML
<div></div>
This example will change the background color when the div is hovered the background-color change will last 1
second.
For CSS Bézier Curves, P0 and P3 are always in the same spot. P0 is at (0,0) and P3 is at (1,1), which menas that the
parameters passed to the cubic-bezier function can only be between 0 and 1.
If you pass parameters which aren't in this interval the function will default to a linear transition.
Since cubic-bezier is the most flexible transition in CSS, you can translate all other transition timing
function to cubic-bezier functions:
linear: cubic-bezier(0,0,1,1)
HTML
<div></div>
transition-property: Specifies the CSS properties the transition effect is for. In this case, the div will
expand both horizontally and vertically when hovered.
transition-duration: Specifies the length of time a transition takes to complete. In the above example, the
height and width transitions will take 1 second and 500 milliseconds respectively.
transition-timing-function: Specifies the speed curve of the transition effect. A linear value indicates the
transition will have the same speed from start to finish.
transition-delay: Specifies the amount of time needed to wait before the transition effect starts. In this
case, the height will start transitioning immediately, whereas the width will wait 1 second.
Chapter 27: Animations
Transition
Parameter Details
Either the CSS property to transition on, or all, which specifies all transition-able
property properties.
duration Transition time, either in seconds or milliseconds.
Specifies a function to define how intermediate values for properties are computed.
timing-function Common values are ease, linear, and step-end. Check out the easing function cheat- sheet
for more.
delay Amount of time, in seconds or milliseconds, to wait before playing the animation.
@keyframes
You can either specify a set time with a percentage value, or two percentage values, ie
[ from | to | <percentage>
10%, 20%, for a period of time where the keyframe's set attributes are set.
]
block Any amount of CSS attributes for the keyframe.
Basic Example
In this example, we'll make a basic background animation that cycles between all colors.
0% rainbow-background
@keyframes { background-color:
{ #ff0000; }
8.333% { background-color: #ff8000; }
16.667% { background-color: #ffff00; }
25.000% { background-color: #80ff00; }
33.333% { background-color: #00ff00; }
41.667% { background-color: #00ff80; }
50.000% { background-color: #00ffff; }
58.333% { background-color: #0080ff; }
66.667% { background-color: #0000ff; }
75.000% { background-color: #8000ff; }
83.333% { background-color: #ff00ff; }
91.667% { background-color: #ff0080; }
100.00% { background-color: #ff0000; }
}
.RainbowBackground {
animation: rainbow-background 5s infinite;
View Result
}
There's a few different things to note here. First, the actual @keyframes syntax.
@keyframes rainbow-background{
This is the definition for a keyframe within the animation. The first part, the 0% in the case, defines where the
keyframe is during the animation. The 0% implies it is 0% of the total animation time from the beginning.
The animation will automatically transition between keyframes. So, by setting the next background color at
8.333%, the animation will smoothly take 8.333% of the time to transition between those keyframes.
.RainbowBackground {
animation: rainbow-background 5s infinite;
}
This code attaches our animation to all elements which have the .RainbowBackground class. The
actual animation property takes the following arguments.
In this particular example, both the 0% and 100% keyframes specify { background-color: #ff0000; }. Wherever two
or more keyframes share a state, one may specify them in a single statement. In this case, the two 0% and 100%
lines could be replaced with this single line:
Cross-browser compatibility
For older WebKit-based browsers, you'll need to use the vendor prefix on both the @keyframes declaration and the
animation property, like so:
@-webkit-keyframes{}
-webkit-animation: ...
Example
.Example{
height: 100px;
background: #fff;
}
.Example:hover{
height: 120px;
background: #ff0000;
}
View Result
By default, hovering over an element with the .Example class would immediately cause the element's height to
jump to 120px and its background color to red (#ff0000).
By adding the transition property, we can cause these changes to occur over time:
.Example{
...
transition: all 400ms ease;
}
View Result
The all value applies the transition to all compatible (numbers-based) properties. Any compatible property name
(such as height or top) can be substituted for this keyword.
400ms specifies the amount of time the transition takes. In this case, the element's change in height will take 400
milliseconds to complete.
Finally, the value ease is the animation function, which determines how the animation is played. ease means start
slow, speed up, then end slow again. Other values are linear, ease-out, and ease-in.
Cross-Browser Compatibility
The transition property is generally well-supported across all major browsers, excepting IE 9. For earlier versions
of Firefox and Webkit-based browsers, use vendor prefixes like so:
.Example{
transition: all 400ms ease;
-moz-transition: all 400ms ease;
-webkit-transition: all 400ms ease;
}
Note: The transition property can animate changes between any two numerical values, regardless of unit. It can also
transition between units, such as 100px to 50vh. However, it cannot transition between a number and a default or
automatic value, such as transitioning an element's height from 100px to auto.
Our second example is a little more simple, and shows that some properties can be omitted:
animation: 3s slidein;
/*duration | name */
It's also worth mentioning that when using the animation shorthand the order of the properties makes a difference.
Obviously the browser may confuse your duration with your delay.
If brevity isn't your thing, you can also skip the shorthand property and write out each property individually:
ion: 3s;
g-function: ease-in;
1s; animation-iteration-count: 2; animation-direction: reverse; animation-fill-mode: both; animation-play-state: paused; anima
Both CSS keyframes and the transition property use GPU acceleration. Performance is increased by offloading
calculations to the device's GPU. This is done by creating paint layers (parts of the page that are individually
rendered) that are offloaded to the GPU to be calculated. The will-change property tells the browser what will
animate, allowing the browser to create smaller paint areas, thus increasing performance.
The will-change property accepts a comma-separated list of properties to be animated. For example, if you plan
on transforming an object and changing its opacity, you would specify:
.Example{
...
will-change: transform, opacity;
}
Note: Use will-change sparingly. Setting will-change for every element on a page can cause performance problems, as
the browser may attempt to create paint layers for every element, significantly increasing the amount of
processing done by the GPU.
Chapter 28: 2D Transforms
Function/Parameter Details
rotate(x) Defines a transformation that moves the element around a fixed point on the Z axis
translate(x,y) Moves the position of the element on the X and Y
axis Moves the position of the element on the X axis
translateX(x)
translateY(y) Moves the position of the element on the Y axis
scale(x,y) Modifies the size of the element on the X and Y axis
scaleX(x) Modifies the size of the element on the X axis
scaleY(y) Modifies the size of the element on the Y axis
Shear mapping, or transvection, distorting each point of an element by a certain angle
skew(x,y) in each direction
Horizontal shear mapping distorting each point of an element by a certain angle in
skewX(x) the horizontal direction
Vertical shear mapping distorting each point of an element by a certain angle in the
skewY(y) vertical direction
matrix() Defines a 2D transformation in the form of a transformation matrix.
The angle by which the element should be rotated or skewed (depending on the function
angle with which it is used). Angle can be provided in degrees (deg), gradians (grad), radians (rad)
or turns (turn). In skew() function, the second angle is optional. If not provided, there will be
no (0) skew in Y-axis.
The distance expressed as a length or a percentage by which the element should be
length-or-percentage translated. In translate() function, the second length-or-percentage is optional. If not
provided, then there would be no (0) translation in Y-axis.
A number which defines how many times the element should be scaled in the specified axis.
scale-factor In scale() function, the second scale-factor is optional. If not provided, the first scale-factor
will be applied for Y-axis also.
<div class="rotate"></div>
CSS
.rotate {
width: 100px; height: 100px; background: teal;
transform: rotate(45deg);
}
This example will rotate the div by 45 degrees clockwise. The center of rotation is in the center of the div, 50%
from left and 50% from top. You can change the center of rotation by setting the transform-origin property.
The above example will set the center of rotation to the middle of the right side end.
Section 28.2: Scale
HTML
<div class="scale"></div>
CSS
.scale {
width: 100px; height: 100px; background: teal;
transform: scale(0.5, 1.3);
}
This example will scale the div to 100px * 0.5 = 50px on the X axis and to 100px * 1.3 = 130px on the Y axis. The
center of the transform is in the center of the div, 50% from left and 50% from top.
<div class="skew"></div>
CSS
.skew {
width: 100px; height: 100px; background: teal;
transform: skew(20deg, -30deg);
}
This example will skew the div by 20 degrees on the X axis and by - 30 degrees on the Y
axis. The center of the transform is in the center of the div, 50% from left and 50% from
top.
This will rotate the element 15 degrees clockwise and then translate it 200px to the right.
In chained transforms, the coordinate system moves with the element. This means that the translation won't be
horizontal but on an axis rotate 15 degrees clockwise as shown in the following image:
Changing the order of the transforms will change the output. The first example will be different to
<div class="translate"></div>
CSS
.translate {
width: 100px; height: 100px; background: teal;
transform: translate(200px, 50%);
}
This example will move the div by 200px on the X axis and by 100px * 50% = 50px on the Y axis.
You can also specify translations on a single axis.
On the X axis:
.translate {
transform: translateX(200px);
}
On the Y axis:
.translate {
transform: translateY(50%);
}
HTML:
<div class="transform originl"></div>
<div class="transform origin2"></div>
CSS:
.transform {
display: inline-block;
width: 200px; height: 100px; background: teal;
transition: transform 1s;
}
.origin1 {
transform-origin: 0 0;
}
.origin2 {
transform-origin: 100% 0;
}
.transform:hover {
transform: rotate(30deg);
}
The default value for the transform-origin property is 50% 50% which is the center of the element.
Chapter 29: 3D Transforms
Section 29.1: Compass pointer or needle shape using 3D
transforms
CSS
div.needle { margin: 100px; height: 150px; width: 150px;
transform: rotateY(85deg) rotateZ(45deg);
/* presentational */
background-image: linear-gradient(to top left, #555 0%, #555 40%, #444 50%, #333 97%);
box-shadow: inset 6px 6px 22px 8px #272727;
}
HTML
<div class='needle'></div>
In the above example, a needle or compass pointer shape is created using 3D transforms. Generally when we apply
the rotate transform on an element, the rotation happens only in the Z-axis and at best we will end up with
diamond shapes only. But when a rotateY transform is added on top of it, the element gets squeezed in the Y-axis
and thus ends up looking like a needle. The more the rotation of the Y-axis the more squeezed the element looks.
The output of the above example would be a needle resting on its tip. For creating a needle that is resting on its
base, the rotation should be along the X-axis instead of along Y-axis. So the transform property's value would have
to be something like rotateX(85deg) rotateZ(45deg);.
This pen uses a similar approach to create something that resembles the Safari logo or a compass dial.
<div id="title">
<h1 data-content="HOVER">HOVER</h1>
</div>
CSS:
In this example, the text is transformed to make it look like it is going into the screen away from the user.
The shadow is transformed accordingly so it follows the text. As it is made with a pseudo element and the data
attribute, it inherits the transforms form it's parent (the H1 tag).
The white "light" is made with a pseudo element on the #title element. It is skewed and uses border-radius for the
rounded corner.
With 3D transforms and the backface-visibility property, you're able to rotate an element such that the original
front of an element no longer faces the screen.
For example, this would flip an element away from the screen:
JSFIDDLE
.flip.back {
-webkit-backface-visibility: hidden;
-moz-backface-visibility:hidden;
-ms-backface-visibility:hidden;
}
Firefox 10+ and IE 10+ support backface-visibility without a prefix. Opera, Chrome, Safari, iOS, and Android all need
-webkit-backface-visibility.
It has 4 values:
2. visible (default) - the element will always be visible even when not facing the screen.
3. hidden - the element is not visible when not facing the screen.
4. inherit - the property will gets its value from the its parent element
5. initial - sets the property to its default, which is visible
HTML:
<div class="cube">
<div class="cubeFace"></div>
<div class="cubeFace face2"></div>
</div>
CSS:
body {
perspective-origin: 50% 100%; perspective: 1500px; overflow: hidden;
}
.cube {
position: relative;
padding-bottom: 20%; transform-style: preserve-3d; transform-origin: 50% 100%;
transform: rotateY(45deg) rotateX(0);
}
.cubeFace {
position: absolute;
top: 0;
left: 40%;
width: 20%;
height: 100%;
margin: 0 auto;
transform-style: inherit;
background: #C52329;
box-shadow: inset 0 0 0 5px #333;
transform-origin: 50% 50%; transform: rotateX(90deg); backface-visibility: hidden;
}
.face2 {
transform-origin: 50% 50%;
transform: rotatez(90deg) translateX(100%) rotateY(90deg);
}
.cubeFace:before, .cubeFace:after {
content: ''; position: absolute; width: 100%;
height: 100%;
transform-origin: 0 0; background: inherit; box-shadow: inherit;
backface-visibility: inherit;
}
.cubeFace:before {
top: 100%;
left: 0;
transform: rotateX(-90deg);
}
.cubeFace:after {
top: 0;
left: 100%;
transform: rotateY(90deg);
}
CSS
img {
-webkit-filter: blur(1px);
filter: blur(1px);
}
Result
CSS
p{
-webkit-filter: drop-shadow(10px 10px 1px green);
filter: drop-shadow(10px 10px 1px green);
}
Result
CSS
img {
-webkit-filter: hue-rotate(120deg);
filter: hue-rotate(120deg);
}
Result
HTML
<img src='donald-duck.png' alt='Donald Duck' title='Donald Duck' />
CSS
img {
-webkit-filter: brightness(200%) grayscale(100%) sepia(100%) invert(100%);
filter: brightness(200%) grayscale(100%) sepia(100%) invert(100%);
}
Result
<div></div>
CSS
div {
width: 100px;
height: 100px;
background-color: white;
-webkit-filter: invert(100%);
filter: invert(100%);
}
Result
Examples:
Value Description
none No cursor is rendered for the
element auto Default. The browser sets
a cursor
help The cursor indicates that help is available
wait The cursor indicates that the program is
busy
move The cursor indicates something is to be
moved pointer The cursor is a pointer and indicates a
link
.disabled {
pointer-events: none;
}
In this example,
'none' prevents all click, state and cursor options on the specified HTML element [[1]]
auto;
inherit.
1. https://css-tricks.com/almanac/properties/p/pointer-events/
Other resources:
https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events
https://davidwalsh.name/pointer-events
HTML
CSS
#example {
caret-color: red;
}
Resources:
https://developer.mozilla.org/en-US/docs/Web/CSS/caret-color
Chapter 32: box-shadow
Parameters Details
by default, the shadow is treated as a drop shadow. the inset keyword draws the shadow inside the
inset frame/border.
offset-x the horizontal distance
offset-y the vertical distance
0 by default. value cannot be negative. the bigger the value, the bigger and lighter the shadow
blur-radius becomes.
0 by default. positive values will cause the shadow to expand. negative values will cause the
spread-radius
to
shadow color can be of various notations: a color keyword, hexadecimal, rgb(), rgba(), hsl(), hsla()
shrink.
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
background-color: #1C90F3;
width: 200px; height: 100px; margin: 50px;
}
.box_shadow:after { content: ""; width: 190px; height: 1px; margin-top: 98px; margin-left: 5px; display: block;
position: absolute;
z-index: -1;
-webkit-box-shadow: 0px 0px 8px 2px #444444;
-moz-box-shadow: 0px 0px 8px 2px #444444;
box-shadow: 0px 0px 8px 2px #444444;
}
Section 32.2: drop shadow
JSFiddle: https://jsfiddle.net/UnsungHero97/80qod7aL/
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
-webkit-box-shadow: 0px 0px 10px -1px #444444;
-moz-box-shadow: 0px 0px 10px -1px #444444;
box-shadow: 0px 0px 10px -1px #444444;
}
<div class="box_shadow"></div>
CSS
.box_shadow {
background-color: #1C90F3;
width: 200px; height: 100px; margin: 50px;
-webkit-box-shadow: inset 0px 0px 10px 0px #444444;
-moz-box-shadow: inset 0px 0px 10px 0px #444444;
box-shadow: inset 0px 0px 10px 0px #444444;
}
Result:
JSFiddle: https://jsfiddle.net/UnsungHero97/80qod7aL/1/
HTML
<div class="box_shadow"></div>
CSS
CSS
img:nth-of-type(1) {
shape-outside: circle(80px at 50% 50%);
float: left;
width: 200px;
}
img:nth-of-type(2) {
shape-outside: circle(80px at 50% 50%);
float: right;
width: 200px;
}
p{
text-align: center;
line-height: 30px; /* purely for demo */
}
HTML
content is required to be wrapped such that it follows the curve of the circle on either side. And then there is some filler text just to make the text long enough. Lorem
In the above example, both the images are actually square images and when the text is placed without the shape-
outside property, it will not flow around the circle on either side. It will flow around the containing box of the
image only. With shape-outside the float area is re-defined as a circle and the content is made to flow around this
imaginary circle that is created using shape-outside.
The imaginary circle that is used to re-define the float area is a circle with radius of 80px drawn from the center-
mid point of the image's reference box.
Below are a couple of screenshots to illustrate how the content would be wrapped around when shape-outside is
used and when it is not used.
CSS
img:nth-of-type(1) {
shape-outside: circle(80px at 50% 50%);
shape-margin: 10px; float: left; width: 200px;
}
img:nth-of-type(2) {
shape-outside: circle(80px at 50% 50%);
shape-margin: 10px; float: right; width: 200px;
}
p{
text-align: center;
line-height: 30px; /* purely for demo */
}
HTML
content is required to be wrapped such that it follows the curve of the circle on either side. And then there is some filler text just to make the text long enough. Lorem
In this example, a 10px margin is added around the shape using shape-margin. This creates a bit more space between
the imaginary circle that defines the float area and the actual content that is flowing around.
Output:
Chapter 34: List Styles
Value Description
list-style-type the type of list-item marker.
list-style-position specifies where to place the
marker list-style-image specifies the type of list-
item marker initialsets this property to its default
value
inherit inherits this property from its parent element
Each list item gets a 'marker box', which contains the bullet marker. This box can either be placed inside or
outside of the list item box.
list-style-position: inside;
places the bullet within the <li> element, pushing the content to the right as needed.
list-style-position: outside;
places the bullet left of the <li> element. If there is not enough space in the padding of the containing element, the
marker box will extend to the left even if it would fall off the page.
<ul>
<li>first item</li>
<li>second item</li>
</ul>
CSS
ul {
list-style-type: none;
}
li {
margin: 0;
padding: 0;
}
Non-specific:
counter-style
This represents the string that must be placed between the values of two different counter
levels (like the "." in "2.1.1").
connector-string
.item {
counter-increment: item-counter;
}
.item:before {
content: counter(item-counter, upper-roman) ". "; /* by specifying the upper-roman as style the output would be in roman numbers */
}
HTML
<div class='item'>Item No: 1</div>
<div class='item'>Item No: 2</div>
<div class='item'>Item No: 3</div>
In the above example, the counter's output would be displayed as I, II, III (roman numbers) instead of the usual 1,
2, 3 as the developer has explicitly specified the counter's style.
.item {
border: 1px solid; height: 100px; margin-bottom: 10px;
}
.item-header {
border-bottom: 1px solid;
height: 40px;
line-height: 40px;
padding: 5px;
}
.item-content {
padding: 8px;
}
HTML
<div class='item'>
<div class='item-header'>Item 1 Header</div>
<div class='item-content'>Lorem Ipsum Dolor Sit Amet.</div>
</div>
<div class='item'>
<div class='item-header'>Item 2 Header</div>
<div class='item-content'>Lorem Ipsum Dolor Sit Amet.</div>
</div>
<div class='item'>
<div class='item-header'>Item 3 Header</div>
<div class='item-content'>Lorem Ipsum Dolor Sit Amet.</div>
</div>
The above example numbers every "item" in the page and adds the item's number before its header (using content
property of .item-header element's :before pseudo). A live demo of this code is available here.
-style: none;
ter-reset: list-item-number; /* self nesting counter as name is same for all levels */
ter-increment: list-item-number;
re {
ent: counters(list-item-number, ".") " "; /* usage of counters() function means value of counters at all higher levels are combined before print
HTML
<ul>
<li>Level 1
<ul>
<li>Level 1.1
<ul>
<li>Level 1.1.1</li>
</ul>
</li>
</ul>
</li>
<li>Level 2
<ul>
<li>Level 2.1
<ul>
<li>Level 2.1.1</li>
<li>Level 2.1.2</li>
</ul>
</li>
</ul>
</li>
<li>Level 3</li>
</ul>
The above is an example of multi-level numbering using CSS counters. It makes use of the self-nesting concept of
counters. Self nesting is a concept where if an element already has a counter with the given name but is having
to create another then it creates it as a child of the existing counter. Here, the second level ul already inherits
the list-item-number counter from its parent but then has to create its own list-item-number (for its children li) and so
creates list-item-number[1] (counter for second level) and nests it under list-item-number[0] (counter for first level).
Thus it achieves the multi-level numbering.
The output is printed using the counters() function instead of the counter() function because the counters()
function is designed to prefix the value of all higher level counters (parent) when printing the output.
Chapter 36: Functions
Section 36.1: calc() function
Accepts a mathematical expression and returns a numerical value.
It is especially useful when working with different types of units (e.g. subtracting a px value from a percentage) to
calculate the value of an attribute.
+, -, /, and * operators can all be used, and parentheses can be added to specify the order of operations if
necessary.
#div1 {
position: absolute;
left: 50px;
width: calc(100% - 100px); border: 1px solid black; background-color: yellow; padding: 5px;
text-align: center;
}
Below is a blockquote element which contains a character inside a data-* attribute which CSS can use (e.g. inside
the ::before and ::after pseudo-element) using this function.
<blockquote data-mark='"'></blockquote>
In the following CSS block, the character is appended before and after the text inside the element:
blockquote[data-mark]::before, blockquote[data-mark]::after {
content: attr(data-mark);
}
/* set a variable */
:root {
--primary-color: blue;
}
/* access variable */
selector {
color: var(--primary-color);
}
This feature is currently under development. Check caniuse.com for the latest browser support.
red, orange, yellow) /*A gradient coming out from the middle of the gradient, red at the center, then orange, until it is finally yellow at
This creates a gradient going from bottom to top, with colors starting at red, then yellow at 50%, and finishing
in blue.
Chapter 37: Custom Properties (Variables)
CSS Variables allow authors to create reusable values which can be used throughout a CSS document.
For example, it's common in CSS to reuse a single color throughout a document. Prior to CSS Variables this would
mean reusing the same color value many times throughout a document. With CSS Variables the color value can be
assigned to a variable and referenced in multiple places. This makes changing values easier and is more semantic
than using traditional CSS values.
You can define variables multiple times and only the definition with the highest specificity will apply to the element
selected.
.button {
--color: green;
padding: .5rem;
border: 1px solid var(--color);
color: var(--color);
}
.button:hover {
--color: blue;
}
.button_red {
--color: red;
}
Empty Vs Space
/* Invalid */
--color:;
/* Valid */
--color: ; /* space is assigned */
Concatenations
/* Invalid */
--width: 10;
width: var(--width)px;
/* Valid */
--width: 10px;
width: var(--width);
/* Valid */
--width: 10;
width: calc(1px * var(--width)); /* multiply by 1 unit to convert */
width: calc(1em * var(--width));
Here, a media query changes the variables used to set up a very simple grid:
HTML
<div></div>
<div></div>
<div></div>
<div></div>
CSS
:root{
--width: 25%;
--content: 'This is desktop';
}
@media only screen and (max-width: 767px){
:root{
--width:50%;
--content: 'This is mobile';
}
}
@media only screen and (max-width: 480px){
:root{
--width:100%;
}
}
div{
width: calc(var(--width) - 20px);
height: 100px;
}
div:before{
content: var(--content);
}
/* Other Styles */
body {
padding: 10px;
}
div{
display: flex;
align-items: center; justify-content: center; font-weight:bold; float:left;
margin: 10px;
border: 4px solid black;
background: red;
}
HTML:
<div class="trapezoid"></div>
CSS:
.trapezoid {
width: 50px;
height: 0;
border-left: 50px solid transparent; border-right: 50px solid transparent; border-bottom: 100px solid black;
}
With changing the border sides, the orientation of the trapezoid can be adjusted.
By setting some borders to transparent, and others to a color we can create various triangles. For example, in
the Up triangle, we set the bottom border to the desired color, then set the left and right borders to
transparent. Here's an image with the left and right borders shaded slightly to show how the triangle is being
formed.
The dimensions of the triangle can be altered by changing the different border widths - taller, shorter, lopsided,
etc. The examples below all show a 50x50 pixel triangle.
Triangle - Pointing Up
<div class="triangle-up"></div>
.triangle-up {
width: 0;
height: 0;
border-left: 25px solid transparent;
border-right: 25px solid transparent;
border-bottom: 50px solid rgb(246, 156, 85);
}
<div class="triangle-down"></div>
.triangle-down {
width: 0;
height: 0;
border-left: 25px solid transparent; border-right: 25px solid transparent; border-top: 50px solid rgb(246, 156, 85);
}
<div class="triangle-left"></div>
.triangle-left {
width: 0;
height: 0;
border-top: 25px solid transparent;
border-bottom: 25px solid transparent;
border-right: 50px solid rgb(246, 156, 85);
}
<div class="triangle-up-right"></div>
.triangle-up-right {
width: 0;
height: 0;
border-top: 50px solid rgb(246, 156, 85);
border-left: 50px solid transparent;
}
<div class="triangle-up-left"></div>
.triangle-up-left {
width: 0;
height: 0;
border-top: 50px solid rgb(246, 156, 85);
border-right: 50px solid transparent;
}
<div class="triangle-down-right"></div>
.triangle-down-right {
width: 0;
height: 0;
border-bottom: 50px solid rgb(246, 156, 85);
border-left: 50px solid transparent;
}
<div class="triangle-down-left"></div>
.triangle-down-left {
width: 0;
height: 0;
border-bottom: 50px solid rgb(246, 156, 85);
border-right: 50px solid transparent;
}
To create a circle, define an element with an equal width and height (a square) and then set the border-radius
property of this element to 50%.
HTML
<div class="circle"></div>
CSS
.circle {
width: 50px;
height: 50px;
background: rgb(246, 156, 85);
border-radius: 50%;
}
Ellipse
An ellipse is similar to a circle, but with different values for width and height.
HTML
<div class="oval"></div>
CSS
.oval {
width: 50px;
height: 80px;
background: rgb(246, 156, 85);
border-radius: 50%;
}
The additional squares are created using the ::before and ::after psuedo-elements.
8 Point Burst
An 8 point burst are 2 layered squares. The bottom square is the element itself, the additional square is created
using the :before pseudo-element. The bottom is rotated 20°, the top square is rotated 135°.
<div class="burst-8"></div>
.burst-8 {
background: rgb(246, 156, 85); width: 40px;
height: 40px; position: relative; text-align: center;
-ms-transform: rotate(20deg); transform: rotate(20eg);
}
12 Point Burst
An 12 point burst are 3 layered squares. The bottom square is the element itself, the additional squares are
created using the :before and :after pseudo-elements. The bottom is rotated 0°, the next square is rotated 30°, and
the top is rotated 60°.
<div class="burst-12"></div>
.burst-12::before {
-ms-transform: rotate(30deg); transform: rotate(30deg);
}
.burst-12::after {
-ms-transform: rotate(60deg); transform: rotate(60deg);
}
<div class="square"></div>
.square {
width: 100px;
height: 100px;
background: rgb(246, 156, 85);
}
HTML:
<div class="cube"></div>
CSS:
.cube {
background: #dc2e2e; width: 100px; height: 100px; position: relative; margin: 50px;
}
.cube::before {
content: '';
display: inline-block; background: #f15757; width: 100px;
height: 20px;
transform: skewX(-40deg);
position: absolute;
top: -20px;
left: 8px;
}
.cube::after {
content: '';
display: inline-block; background: #9e1515; width: 16px;
height: 100px;
transform: skewY(-50deg);
position: absolute;
top: -10px;
left: 100%;
}
See demo
HTML:
<div class="pyramid"></div>
CSS:
.pyramid::before,.pyramid::after {
content: '';
display: inline-block;
width: 0;
height: 0;
border: 50px solid;
position: absolute;
}
.pyramid::before {
border-color: transparent transparent #ff5656 transparent;
transform: scaleY(2) skewY(-40deg) rotate(45deg);
}
.pyramid::after {
border-color: transparent transparent #d64444 transparent;
transform: scaleY(2) skewY(40deg) rotate(-45deg);
}
Chapter 39: Columns
Section 39.1: Simple Example (column-count)
The CSS multi-column layout makes it easy to create multiple columns of text.
Code
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit ess
Result
Code:
minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum d
</div>
.multi-columns {
-moz-column-width: 100px;
-webkit-column-width: 100px;
column-width: 100px;
}
Result
Chapter 40: Multiple columns
CSS allows to define that element contents wrap into multiple columns with gaps and rules between them.
CSS
.content {
-webkit-column-count: 3; /* Chrome, Safari, Opera */
-moz-column-count: 3; /* Firefox */
column-count: 3;
}
et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.</p>
met, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo
et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem
With the following CSS applied the content is split into three columns separated by a gray column rule of two pixels.
section {
columns: 3;
column-gap: 40px;
column-rule: 2px solid gray;
}
HTML
<nav>
<ul>
<li>abc</li>
<li>abcdefghijkl</li>
<li>abcdef</li>
</ul>
</nav>
CSS
nav {
width: 100%;
line-height: 1.4em;
}
ul {
list-style: none; display: block; width: 100%;
margin: 0;
padding: 0;
text-align: justify;
margin-bottom: -1.4em;
}
ul:after {
content: "";
display: inline-block;
width: 100%;
}
li {
display: inline-block;
}
Notes
The nav, ul and li tags were chosen for their semantic meaning of 'a list of navigation (menu) items'. Other
tags may also be used of course.
The :after pseudo-element causes an extra 'line' in the ul and thus an extra, empty height of this block, pushing
other content down. This is solved by the negative margin-bottom, which has to have the same magnitude as the
line-height (but negative).
If the page becomes too narrow for all the items to fit, the items will break to a new line (starting from the
right) and be justified on this line. The total height of the menu will grow as needed.
Chapter 42: Inheritance
Section 42.1: Automatic inheritance
Inheritance the a fundamental mechanism of CSS by which the computed values of some properties of an element
are applied to its' children. This is particularly useful when you want to set a global style to your elements
rather than having to set said properties to each and every element in your markup.
Common properties that are automatically inherited are: font, color, text-align, line-height. Assume the
following stylesheet:
This will apply color: red not only to the <div> element but also to the <h3> and <p> elements. However, due to
the nature of padding its value will not be inherited to those elements.
<div id="myContainer">
<h3>Some header</h3>
<p>Some paragraph</p>
</div>
However, sometimes inheritance is desired anyway. To achieve this, we can apply the inherit value to the property
that should be inherited. The inherit value can be appied to any CSS property and any HTML element.
This will apply color: red to both the <h3> and <p> elements due to the inheritance nature of the color property.
However, the <p> element will also inherit the padding value from its' parent because this was specified.
<div id="myContainer">
<h3>Some header</h3>
<p>Some paragraph</p>
</div>
Chapter 43: CSS Image Sprites
Section 43.1: A Basic Implementation
What's an image sprite?
An image sprite is a single asset located within an image sprite sheet. An image sprite sheet is an image file that
contains more than one asset that can be extracted from it.
For example:
The image above is an image sprite sheet, and each one of those stars is a sprite within the sprite sheet. These
sprite sheets are useful because they improve performance by reducing the number of HTTP requests a browser
might have to make.
HTML
CSS
.icon {
background: url(“icons-sprite.png”);
display: inline-block;
height: 20px;
width: 20px;
}
.icon1 {
background-position: 0px 0px;
}
.icon2 {
background-position: -20px 0px;
}
.icon3 {
background-position: -40px 0px;
}
By using setting the sprite's width and height and by using the background-position property in CSS (with an x and y
value) you can easily extract sprites from a sprite sheet using CSS.
Chapter 44: Clipping and Masking
Parameter Details
A URL which can point to an inline SVG element (or) an SVG element in an external file that
clip-source contains the clip path's definition.
Refers to one among inset(), circle(), ellipse() or polygon(). Using one of these
basic-shape functions the clipping path is defined. These shape functions work exactly the same way
as they do in Shapes for Floats
This can have one among content-box, padding-box, border-box, margin-box, fill-box, stroke-box, view-box
as values. When this is provided without any value for <basic-shape>, the edges of the
clip-geometry-box corresponding box is used as the path for clipping. When used with a
<basic-shape>, this acts as the reference box for the shape.
mask-reference This can be none or an image or a reference URL to a mask image source.
This specifies how the mask should be repeated or tiled in the X and Y axes. The supported
repeat-style values are repeat-x, repeat-y, repeat, space, round, no-repeat.
Can be alpha or luminance or auto and indicates whether the mask should be treated as a
mask-mode alpha mask or a luminance mask. If no value is provided and the mask-reference is a
direct image then it would be considered as alpha mask (or) if the mask-reference is a
URL then it would be considered as luminance mask.
position This specifies the position of each mask layer and is similar in behavior to the background-
position property. The value can be provided in 1 value syntax (like top, 10%) or in 2 value
syntax (like top right, 50% 50%).
This specifies the box to which the mask should be clipped (mask painting area) or the
box which should be used as reference for the mask's origin (mask positioning area)
geometry-box depending on the property. The list of possible values are content-box, padding-box, border-
box, margin-box, fill-box, stroke-box, view-box. Detailed explanation of how each of those values
work is available in the W3C Spec.
bg-size This represents the size of each mask-image layer and has the same syntax as background-
size. The value can be length or percentage or auto or cover or contain. Length, percentage
and auto can either be provided as a single value or as one for each axis.
This can be any one among add, subtract, exclude, multiply per layer and defines the type
compositing-operator of compositing operation that should be used for this layer with those below it. Detailed
explanation about each value is available in the W3C Specs.
Clipping
Clips are vector paths. Outside of this path the element will be transparent, inside it's opaque. Therefore you
can define a clip-path property on elements. Every graphical element that also exists in SVG you can use here as a
function to define the path. Examples are circle(), polygon() or ellipse().
Example
clip-path: circle(100px at center);
The element will be only visible inside of this circle, which is positioned at the center of the element and has
a radius of 100px.
Masking
Masks are similar to Clips, but instead of defining a path you define a mask what layers over the element. You can
imagine this mask as an image what consist of mainly two colors: black and white.
Luminance Mask: Black means the region is opaque, and white that it's transparent, but there is also a grey area
which is semi-transparent, so you are able to make smooth transitions.
Alpha Mask: Only on the transparent areas of the mask the element will be opaque.
This image for example can be used as a luminance mask to make for an element a very smooth transition from
right to left and from opaque to transparent.
The mask property let you specify the the mask type and an image to be used as layer.
Example
HTML
<div></div>
In the above example there is an element with an image as its background. The mask that is applied on the image
(using CSS) makes it look as though it is fading out from left to right.
The masking is achieved by using a linear-gradient that goes from white (on the left) to transparent (on the right) as
the mask. As it is an alpha mask, image becomes transparent where the mask is transparent.
Note: As mentioned in remarks, the above example would work in Chrome, Safari and Opera only when used with
the -webkit prefix. This example (with a linear-gradient as mask image) is not yet supported in Firefox.
}
HTML
<div></div>
This example shows how to clip a div to a circle. The element is clipped into a circle whose radius is 30% based
on the dimensions of the reference box with its center point at the center of the reference box. Here since no
<clip- geometry-box> (in other words, reference box) is provided, the border-box of the element will be used as
the reference box.
The circle shape needs to have a radius and a center with (x,y) coordinates:
circle(radius at x y)
View Example
Output:
HTML:
<div></div>
In the above example, a polygonal clipping path is used to clip the square (200 x 200) element into a triangle
shape. The output shape is a triangle because the path starts at (that is, first coordinates are at) 0 0 - which is
the top-left
corner of the box, then goes to 0 100% - which is bottom-left corner of the box and then finally to 100% 50% which is
nothing but the right-middle point of the box. These paths are self closing (that is, the starting point will be
the ending point) and so the final shape is that of a triangle.
View Example
Output:
HTML
In the above example, a transparent circle is created at the center using radial-gradient and this is then used as a
mask to produce the effect of a circle being cut out from the center of an image.
HTML
<div></div>
In the above example, three linear-gradient images (which when placed in their appropriate positions would cover
100% x 100% of the container's size) are used as masks to produce a transparent triangular shaped cut at the
bottom of the image.
it prevents a page break inside any p tags, meaning a paragraph will never be broken in two pages, if
possible.
it forces a page-break-before in all h1 headings, meaning that before every h1 occurrence, there will
be a page break.
it prevents page-breaks right after any h2
Chapter 46: CSS Object Model (CSSOM)
Section 46.1: Adding a background-image rule via the CSSOM
To add a background-image rule via the CSSOM, first get a reference to the rules of the first stylesheet:
Finally, insert a background-image rule for the body element at the end of the stylesheet:
1. The web browser examines your HTML and builds the DOM (Document Object Model).
2. The web browser examines your CSS and builds the CSSOM (CSS Object Model).
3. The web browser combines the DOM and the CSSOM to create a render tree. The web browser
displays your webpage.
Chapter 47: Feature Queries
Parameter Details
Evaluates true if the browser can handle the CSS rule. The parenthesis around the rule are
(property: value) required.
and Returns true only if both the previous and next conditions are true.
not Negates the next condition
or Returns true if either the previous or next condition is true.
(...) Groups conditions
In terms of syntax, @supports is very similar to @media, but instead of detecting screen size and orientation,
@supports will detect whether the browser can handle a given CSS rule.
Rather than doing something like @supports (flex), notice that the rule is @supports (display: flex).
For the ultimate @supports experience, try grouping logical expressions with parenthesis:
@supports ((display: block) and (zoom: 1)) or ((display: flex) and (not (display: table-cell))) or (transform: translateX(1px)) {
/* ... */
}
Root
DIV #1
DIV #2
DIV #3
DIV #4
DIV #5
DIV #6
It is important to note that DIV #4, DIV #5 and DIV #6 are children of DIV #3, so stacking of those
elements is completely resolved within DIV#3. Once stacking and rendering within DIV #3 is completed,
the whole DIV #3 element is passed for stacking in the root element with respect to its sibling's DIV.
HTML:
<div id="div1">
<h1>Division Element #1</h1>
<code>position: relative;<br/> z-index: 5;</code>
</div>
<div id="div2">
<h1>Division Element #2</h1>
<code>position: relative;<br/> z-index: 2;</code>
</div>
<div id="div3">
<div id="div4">
<h1>Division Element #4</h1>
<code>position: relative;<br/> z-index: 6;</code>
</div>
<h1>Division Element #3</h1>
<code>position: absolute;<br/> z-index: 4;</code>
<div id="div5">
<h1>Division Element #5</h1>
<code>position: relative;<br/> z-index: 1;</code>
</div>
<div id="div6">
<h1>Division Element #6</h1>
<code>position: absolute;<br/> z-index: 3;</code>
</div>
</div>
CSS:
*{
margin: 0;
}
html {
padding: 20px;
font: 12px/20px Arial, sans-serif;
}
div {
opacity: 0.7;
position: relative;
}
h1 {
font: inherit;
font-weight: bold;
}
#div1,
#div2 {
border: 1px dashed #696;
padding: 10px; background-
color: #cfc;
}
#div1 {
z-index: 5;
margin-bottom: 190px;
}
#div2 {
z-index: 2;
}
#div3 {
z-index: 4;
opacity: 1; position:
absolute; top: 40px;
left: 180px;
width: 330px;
border: 1px dashed #900;
background-color: #fdd;
padding: 40px 20px 20px;
}
#div4,
#div5 {
border: 1px dashed #996;
background-color: #ffc;
}
#div4 {
z-index: 6;
margin-bottom: 15px;
padding: 25px 10px 5px;
}
#div5 {
z-index: 1;
margin-top: 15px;
padding: 5px 10px;
}
#div6 {
z-index: 3; position: absolute; top: 20px;
left: 180px; width: 150px; height: 125px;
border: 1px dashed #009; padding-top: 125px; background-color: #ddf; text-align: center;
}
Result:
Source:
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context.
Chapter 49: Block Formatting Contexts
Section 49.1: Using the overflow property with a
value dierent to visible
img{
float:left; width:100px; margin:0 10px;
}
.div1{
background:#f1f1f1;
/* does not create block formatting context */
}
.div2{
background:#f1f1f1; overflow:hidden;
/* creates block formatting context */
}
https://jsfiddle.net/MadalinaTn/qkwwmu6m/2/
Using the overflow property with a value different to visible (its default) will create a new block
formatting context. This is technically necessary — if a float intersected with the scrolling element it would
forcibly rewrap the content.
This example that show how a number of paragraphs will interact with a floated image is similar to this example,
on css-tricks.com.
2: https://developer.mozilla.org/en-US/docs/Web/CSS/overflow MDN
Chapter 50: Vertical Centering
Section 50.1: Centering with display: table
HTML:
<div class="wrapper">
<div class="outer">
<div class="inner"> centered
</div>
</div>
</div>
CSS:
.wrapper {
height: 600px;
text-align: center;
}
.outer { display: table; height: 100%;
width: 100%;
}
.outer .inner { display: table-cell; text-align: center;
vertical-align: middle;
}
<div class="container">
<div class="child"></div>
</div>
CSS:
// Use Flexbox
// This centers children vertically in the parent.
// This centers children horizontally.
d{
th: 100px; height: 100px; background: blue;
Section 50.3: Centering with Transform
HTML:
<div class="wrapper">
<div class="centered"> centered
</div>
</div>
CSS:
.wrapper {
position: relative;
height: 600px;
}
.centered { position: absolute; z-index: 999;
transform: translate(-50%, -50%);
top: 50%;
left: 50%;
}
<div class="container">
<span>vertically centered</span>
</div>
CSS:
.container{
height: 50px; /* set height */
line-height: 50px; /* set line-height equal to the height */
vertical-align: middle; /* works without this rule, but it is good having it explicitly set */
}
Note: This method will only vertically center a single line of text. It will not center block elements correctly and if
the text breaks onto a new line, you will have two very tall lines of text.
<div class="wrapper">
<img
src=>
</div>
CSS:
.wrapper{
position:relative;
height: 600px;
}
.wrapper img { position: absolute; top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
If you want to center other then images, then you must give height and width to that element.
HTML:
<div class="wrapper">
<div class="child"> make me center
</div>
</div>
CSS:
.wrapper{
position:relative; height: 600px;
}
.wrapper .child { position: absolute; top: 0;
left: 0;
right: 0;
bottom: 0; margin: auto; width: 200px; height: 30px;
border: 1px solid #f00;
}
<div class="wrapper">
<div class="content"></div>
</div>
CSS:
.wrapper{
min-height: 600px;
}
.wrapper:before{
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
.content {
display: inline-block;
height: 80px;
vertical-align: middle;
}
This method is best used in cases where you have a varied-height .content centered inside .wrapper; and you want
.wrapper's height to expand when .content's height exceed .wrapper's min-height.
Chapter 51: Object Fit and Placement
Section 51.1: object-fit
The object-fit property will defines how an element will fit into a box with an established height and width. Usually
applied to an image or video, Object-fit accepts the following five values:
FILL
object-fit:fill;
Fill stretches the image to fit the content box without regard to the image's original aspect ratio.
CONTAIN
object-fit:contain;
Contain fits the image in the box's height or width while maintaining the image's aspect ratio.
COVER
object-fit:cover;
Cover fills the entire box with the image. The image aspect ratio is preserved, but the image is cropped to the
dimensions of the box.
NONE
object-fit:none;
SCALE-DOWN
object-fit:scale-down;
Scale-down either sizes the object as none or as contain. It displays whichever option results in a smaller image
size.
Chapter 52: CSS design patterns
These examples are for documenting CSS-specific design patterns like BEM, OOCSS and SMACSS.
These examples are NOT for documenting CSS frameworks like Bootstrap or Foundation.
As the same implies, BEM metholology is all about componentization of your HTML and CSS code into three
types of components:
Elements: Part of blocks that have no standalone meaning and are semantically tied to their blocks.
Examples are menu item, list item, checkbox caption & header title
Examples are disabled, highlighted, checked, fixed, size big & color yellow
The goal of BEM is to keep optimize the readability, maintainability and flexibility of your CSS code. The way to
achieve this, is to apply the following rules.
Code example
If you apply BEM to your form elements, your CSS selectors should look something like this:
.form { } // Block
.form--theme-xmas { } // Block + modifier
.form--simple { } // Block + modifier
.form input { } // Block > element
.form submit { } // Block > element
.form submit--disabled { } // Block > element + modifier
Because these default styles are given some leeway by the language specifications and because browsers may not
follow the specs properly they can differ from browser to browser.
This is where normalize.css comes into play. It overrides the most common inconsistencies and fixes known bugs.
What does it do
So, by including normalize.css in your project your design will look more alike and consistent across different
browsers.
Difference to reset.css
You may have heard of reset.css. What's the difference between the two?
While normalize.css provides consistency by setting different properties to unified defaults, reset.css achieves
consistency by removing all basic styling that a browser may apply. While this might sound like a good idea at
first, this actually means you have to write all rules yourself, which goes against having a solid standard.
n, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, stron
Normalize CSS on the other and deals with many of these separately. The following is a sample from the version
(v4.2.0) of the code.
/**
* 1. Change the default font family in all BROWSERS (opinionated).
* 2. Correct the line height in all BROWSERS.
* 3. Prevent ADJUSTMENTS of font SIZE after orientation CHANGES in IE and iOS.
*/
/* Document
========================================================================== */
html {
font-family: sans-serif; /* 1 */
line-height: 1.15; /* 2 */
-ms-text-size-adjust: 100%; /* 3 */
-webkit-text-size-adjust: 100%; /* 3 */
}
/* SECTIONS
========================================================================== */
/**
* Remove the margin in all BROWSERS (opinionated).
*/
body {
margin: 0;
}
/**
* Add the correct DISPLAY in IE 9-.
*/
article, aside,
footer,
header, nav,
section {
display: block;
}
/**
* Correct the font SIZE and margin on `h1` ELEMENTS WITHIN `SECTION` and
* `article` CONTEXTS in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
Normalize CSS
Chapter 55: Internet Explorer Hacks
Section 55.1: Adding Inline Block support to IE6 and IE7
display: inline-block;
The display property with the value of inline-block is not supported by Internet Explorer 6 and 7. A work-around for
this is:
zoom: 1;
*display: inline;
The zoom property triggers the hasLayout feature of elements, and it is available only in Internet Explorer. The
*display makes sure that the invalid property executes only on the affected browsers. Other browsers will simply
ignore the rule.
The -ms-high-contrast selector has 3 states: active, black-on-white, and white-on-black. In IE10+ it also had a
none state, but that is no longer supported in Edge going forward.
Examples
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: black-on-white) {
.header{
background: #fff;
color: #000;
}
}
This will change the header background to white and the text color to black when high contrast mode is active and
it is in black-on-white mode.
Similar to the first example, but this specifically selects the white-on-black state only, and inverts the header colors
to a black background with white text.
More Information:
.hide-on-ie6-and-ie7 {
*display : none; // This line is processed only on IE6 and IE7
}
Non-alphanumeric prefixes (other than hyphens and underscores) are ignored in IE6 and IE7, so this hack works
for any unprefixed property: value pair.
@media \0 screen {
.hide-on-ie8 {
display : none;
}
}
DON'T
#box {
left: 0;
top: 0;
transition: left 0.5s, top 0.5s;
position: absolute; width: 50px; height: 50px;
background-color: gray;
}
#box {
left: 0;
top: 0;
position: absolute; width: 50px; height: 50px;
background-color: gray;
#box.active {
transform: translate3d(100px, 100px, 0);
}
Demo same animation, took 1.3ms for rendering, 2.0ms for painting.
Credits
Thank you greatly to all the people from Stack Overflow Documentation who helped provide this
content, more changes can be sent to web@petercv.com for new content to be published or
updated
AB Chapter 20
A.J Chapter 4
Aaron Chapter 4
abaracedo Chapter 4
Abhishek Singh Chapter 22
adamboro Chapter 1
Aeolingamenfel Chapters 27 and 55
Ahmad Alfy Chapters 4, 5 and 16
Alohci Chapter 15
amflare Chapters 13 and 17
Andre Lopes Chapter 44
andre mcgruder Chapter 54
andreas Chapters 15 and 38
Andrew Chapters 12, 19 and 53
Andrew Myers Chapter 47
Anil Chapter 4
animuson Chapters 4, 50 and 53
apaul Chapters 6 and 27
Araknid Chapter 4
Arif Chapter 11
Arjan Einbu Chapters 4, 7, 8, 15 and 17
Ashwin Ramaswami Chapters 1 and 4
Asim K T Chapters 5 and
16
AVAVT Chapter 50
awe Chapter 1
bdkopen Chapter 3
Ben Rhys Chapter 5
Bipon Chapter 40
BiscuitBaker Chapter 7
Boris Chapter 5
Boysenb3rry Chapter 1
brandaemon Chapter 17
Brett DeWoody Chapters 18, 38 and 39
CalvT Chapters 5 and 9
Casey Chapter 11
Cassidy Williams Chapters 10 and 22
cdm Chapters 5 and 8
Charlie H Chapters 4 and 28
Chathuranga Jayanath Chapters 11, 13 and 23
Chiller Chapter 38
Chris Chapters 1, 4, 23, 25, 42 and 50
Chris Spittles Chapters 8 and 24
Christiaan Maks Chapter 28
CocoaBean Chapter 5
coderfin Chapter 3
cone56 Chapters 31 and 36
CPHPython Chapter 4
csx.cc Chapter 1
cuervoo Chapter 18
Daniel G. Blázquez Chapter 5
Daniel Käfer Chapter 6
Daniel Stradowski Chapter 5
DarkAjax Chapter 17
darrylyeo Chapters 2, 13 and 18
Darthstroke Chapter 5
Dave Everitt Chapter 4
David Fullerton Chapter 4
Demeter Dimitri Chapter 4
demonofthemist Chapter 14
designcise Chapters 4, 5 and 18
Devid Farinelli Chapters 4 and 6
Devon Bernard Chapter 4
Dex Star Chapter 27
Diego V Chapter 6
Dinidu Hewage Chapter 4
dippas Chapters 4, 17 and 21
doctorsherlock Chapter 10
dodopok Chapters 13, 36 and 45
Elegant.Scripting Chapter 43
Eliran Malka Chapter 6
Emanuele Parisio Chapter 6
Evgeny Chapter 15
Farzad YZ Chapter 6
fcalderan Chapter 5
feeela Chapters 46 and 55
FelipeAls Chapters 1, 5, 10, 11, 14, 16, 24 and 25
Felix A J Chapter 15
Felix Edelmann Chapter 4
Felix Schütz Chapter 4
Forty Chapter 4
fracz Chapter 4
fzzylogic Chapter 16
G Chapters 1 and 17
Gabriel R. Chapter 1
gandreadis Chapter 4
geek1011 Chapter 21
geeksal Chapter 17
Gerardas Chapter 1
Gnietschow Chapter 10
GoatsWearHats Chapter 1
Gofilord Chapter 21
Grant Palin Chapter 54
H. Pauwelyn Chapters 4, 18 and 36
HansCz Chapter 4
Harish Gyanani Chapter 1
Harry Chapters 10, 26, 28, 29, 33, 35 and 44
henry Chapter 4
Horst Jahns Chapter 5
Hristo Chapter 32
Hugo Buff Chapter 4
Hynes Chapters 4, 5 and 15
insertusernamehere Chapter 15
J Atkin Chapters 1 and 4
JF Chapters 4 and 20
Jacob Gray Chapters 4, 5 and 22
James Donnelly Chapters 7 and 17
James Taylor Chapter 5
jaredsk Chapters 10, 36 and 50
JedaiCoder Chapter 6
Jef Chapter 16
Jeffery Tang Chapter 30
jehna1 Chapter 6
jgh Chapter 12
JHS Chapter 25
Jmh2013 Chapters 13, 23 and 43
joejoe31b Chapters 4 and 13
JoelBonetR Chapter 4
joe_young Chapters 1 and 15
John Slegers Chapters 4, 5, 6, 13, 17, 18, 28, 52 and 55
Jon Chan Chapters 5 and
15 Jonathan Argentiero Chapter 6
Jonathan Lam Chapters 1, 6, 7, 16 and 22
Jonathan Zúñiga Chapter 5
Jose Gomez Chapter 1
Just a student Chapter 1
Kevin Katzke Chapter 23
kingcobra1986 Chapter 17
Kuhan Chapter 18
Kyle Ratliff Chapter 6
leo_ap Chapter 50
LiLacTac Chapter 55
Luka Kerr Chapter 29
Luke Taylor Chapter 28
Madalina Taina Chapters 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 19, 25, 29, 31, 32, 34, 39, 45 and 49
Marc Chapter 20
Marcatectura Chapter 21
Marjorie Pickard Chapter 2
Mark Perera Chapter 4
Marten Koetsier Chapters 34 and 41
Matas Vaitkevicius Chapters 4 and
13 Mattia Astorino Chapter 22
Maximillian Laumeister Chapters 5 and
13
Maxouhell Chapter 6
Michael Moriarty Chapters 5, 15 and 18
Michael_B Chapters 4 and 6
Mifeet Chapter 6
Mike McCaughan Chapter 24
Miles Chapters 12 and 51
Miro Chapter 18
MMachinegun Chapter 54
mmativ Chapter 50
Mod Proxy Chapter 6
Mr. Alien Chapter 5
Mr. Meeseeks Chapter 29
Mr_Green Chapter 8
Muthu Kumaran Chapter 37
Naeem Shaikh Chapter 4
Nate Chapter 5
Nathan Arthur Chapters 1, 4, 6, 8, 13, 14, 15 and 16
Nemanja Trifunovic Chapter 48
Niek Brouwer Chapter 23
niyasc Chapter 18
Nobal Mohan Chapter 10
o.v. Chapter 6
Obsidian Chapters 37 and 53
Ortomala Lokni Chapters 6, 7 and 17
Pat Chapter 21
patelarpan Chapters 1 and 50
Paul Kozlovitch Chapter 6
Paul Sweatte Chapter 46
Persijn Chapters 4 and 5
Phil Chapter 50
pixelbandito Chapter 9
Praveen Kumar Chapters 4, 6, 13, 15, 26, 28, 50 and 55
Qaz Chapter 12
Rahul Nanwani Chapter 22
RamenChef Chapter 43
rdans Chapter 4
RedRiderX Chapter 37
rejnev Chapter 8
Richard Hamilton Chapters 4, 5, 15, 18, 20 and
27 Rion Williams Chapter 4
rishabh dev Chapter 46
rmondesilva Chapters 15 and 20
Robotnicka Chapter 20
Rocket Risa Chapter 1
Sandeep Tuniki Chapter 6
Saroj Sasmal Chapter 1
ScientiaEtVeritas Chapters 1, 4, 6, 7, 10, 11, 18, 20, 21, 23, 26, 31, 33, 44
and 53 Sebastian Zartner Chapter 40
SeinopSys Chapters 18, 23, 36 and 54
Sergey Denisov Chapters 5 and 26
Shaggy Chapters 5, 21 and 53
Siavas Chapter 6
Someone Chapter 6
Sourav Ghosh Chapters 5 and 22
Squazz Chapters 16 and 31
srikarg Chapter 13
StefanBob Chapter 9
Stewartside Chapters 4, 5, 6, 18, 20 and 21
Stratboy Chapter 5
sudo bangbang Chapter 4
Sumner Evans Chapter 4
Sun Qingyao Chapter 8
Sunnyok Chapters 4, 6 and 8
Sverri M. Olsen Chapter 1
takeradi Chapter 16
Taylor Chapter 6
Ted Goas Chapters 12, 15, 34 and 43
Teo Dragovic Chapters 1 and 13
ThatWeirdo Chapter 4
TheGenie OfTruth Chapter 36
Theodore K. Chapter 22
think123 Chapter 5
Timothy Miller Chapter 55
Toby Chapters 15 and 20
Todd Chapter 1
ToniB Chapter 15
Tot Zam Chapter 8
Trevor Clarke Chapters 5, 8, 10 and 15
TrungDQ Chapter 56
TylerH Chapters 1, 4, 5, 36 and 53
Ulrich Schwarz Chapter 43
user007 Chapter 18
user2622348 Chapter 20
vishak Chapter 14
vkopio Chapter 7
Vlusion Chapter 15
Volker E. Chapter 15
web Chapters 6, 26, 28, 29 and 44
Will DiFruscio Chapter 9
Wolfgang Chapter 18
X Chapter 18
Xinyang Li Chapter 1
xpy Chapter 4
Yury Fedorov Chapter 4
Zac Chapters 5 and 12
Zaffy Chapter 4
Zakaria Acharki Chapter 20
Zaz Chapter 4
Ze Rubeus Chapter 4
zeel Chapter 6
zer00ne Chapter 20
Zeta Chapter 5
Zze Chapter 5