Css PDF
Css PDF
GoalKicker.com
Disclaimer
200+ pages
Contents
About ....................................................................................................................................................
............................... 1
Chapter 3:
Comments .............................................................................................................................................
.... 8
Chapter 4:
Selectors ................................................................................................................................................
... 9
Section 4.3:
Combinators ..........................................................................................................................................
.. 12
Section 4.7: Select element using its ID without the high specificity of the ID
selector ....................................... 17
Section 4.8: The :last-of-type
selector ...................................................................................................................... 17
Section 4.10: A. The :not pseudo-class example & B. :focus-within CSS pseudo-
class ......................................... 18
Section 4.12: ID
selectors ............................................................................................................................................
20
Chapter 5:
Backgrounds .........................................................................................................................................
22
Chapter 6:
Centering ...............................................................................................................................................
.. 39
Section 6.11: Centering vertically and horizontally without worrying about height or
width ............................... 46
Chapter 8:
Margins .................................................................................................................................................
... 55
Chapter 9:
Padding .................................................................................................................................................
... 61
Chapter 10:
Border ...................................................................................................................................................
.. 63
Chapter 11:
Outlines .................................................................................................................................................
.. 69
Section 11.1:
Overview ...............................................................................................................................................
... 69
Chapter 12:
Overflow ................................................................................................................................................
71
Section 13.3:
mediatype .............................................................................................................................................
. 77
Chapter 14:
Floats ....................................................................................................................................................
.. 81
Section 14.3:
Clearfix ..................................................................................................................................................
.. 83
Chapter 15:
Typography .........................................................................................................................................
89
Section 15.2:
Quotes ...................................................................................................................................................
. 90
Section 17.3:
Cascading .............................................................................................................................................
112
Chapter 18:
Colors ....................................................................................................................................................
115
Section 18.1:
currentColor ..........................................................................................................................................
115
Chapter 22:
Positioning ..........................................................................................................................................
133
Chapter 24:
Grid .......................................................................................................................................................
. 141
Chapter 25:
Tables ...................................................................................................................................................
143
Chapter 26:
Transitions .........................................................................................................................................
145
Section 26.1: Transition
shorthand ........................................................................................................................... 145
Chapter 27:
Animations .........................................................................................................................................
148
Chapter 28: 2D
Transforms ................................................................................................................................. 152
Section 28.1:
Rotate ...................................................................................................................................................
152
Section 28.2:
Scale ....................................................................................................................................................
153
Section 28.3:
Skew .....................................................................................................................................................
153
Section 28.5:
Translate .............................................................................................................................................
154
Section 28.6: Transform
Origin ................................................................................................................................ 155
Chapter 29: 3D
Transforms ................................................................................................................................. 156
Section 29.4: 3D
cube ............................................................................................................................................... 159
Section 30.1:
Blur .......................................................................................................................................................
. 161
Chapter 35:
Counters ..............................................................................................................................................
175
Chapter 36:
Functions .............................................................................................................................................
178
Section 37.4:
Valid/Invalids ......................................................................................................................................
181
Section 38.1:
Trapezoid .............................................................................................................................................
184
Section 38.2:
Triangles ..............................................................................................................................................
184
Section 38.4:
Bursts ...................................................................................................................................................
188
Section 38.5:
Square .................................................................................................................................................
190
Section 38.6:
Cube .....................................................................................................................................................
190
Section 38.7:
Pyramid ...............................................................................................................................................
191
Chapter 39:
Columns ...............................................................................................................................................
193
Chapter 42:
Inheritance ........................................................................................................................................
197
Chapter 45:
Fragmentation ................................................................................................................................ 206
Section 46.2:
Introduction .........................................................................................................................................
207
Section 52.1:
BEM .......................................................................................................................................................
220
Section 53.1:
Transitions ............................................................................................................................................
222
Section 53.2:
Transform ...........................................................................................................................................
222
Section 54.1:
normalize.css .......................................................................................................................................
223
Chapter 56:
Performance .....................................................................................................................................
228
Credits ...................................................................................................................................................
......................... 231
About
Please feel free to share this PDF with anyone for free,
https://goalkicker.com/CSSBook
This CSS Notes for Professionals book is compiled from Stack Overflow
Text content is released under Creative Commons BY-SA, see credits at the end
of this book whom contributed to the various chapters. Images may be copyright
This is an unofficial free book created for educational purposes and is not
affiliated with official CSS group(s) or company(s) nor Stack Overflow. All
company owners
1 1996-12-17
2 1998-05-12
3 2015-10-13
An external CSS stylesheet can be applied to any number of HTML documents by placing a <link>
element in each
HTML document.
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
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>
</head>
<body>
<h1>Hello world!</h1>
<p>I ♥ CSS</p>
</body>
</html>
style.css
h1 {
color: green;
text-decoration: underline;
p{
font-size: 25px;
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
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
CSS enclosed in <style></style> tags within an HTML document functions like an external stylesheet,
except that
it lives in the HTML document it styles instead of in a separate file, and therefore can only be applied
to the
document in which it lives. Note that this element must be inside the <head> element for HTML
validation (though it
<head>
<style>
h1 {
color: green;
text-decoration: underline;
p{
font-size: 25px;
</style>
</head>
<body>
<h1>Hello world!</h1>
<p>I ♥ CSS</p>
</body>
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
<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';
Use inline styles to apply styling to a specific element. Note that this is not optimal. Placing style rules
in a <style>
tag or external CSS file is encouraged in order to maintain a distinction between content and
presentation.
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.
Pure JavaScript
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 fontfamily becomes fontFamily in javascript.
As an alternative to working directly on elements, you can create a <style> or <link> element in
JavaScript and
jQuery
$('#element').css('margin', '5px');
$('#element').css({
margin: "5px",
padding: "10px",
color: "black"
});
jQuery includes two ways to change css rules that have hyphens in them (i.e. font-size). You can put
them in
$('.example-class').css({
"background-color": "blue",
fontSize: "10px"
});
See also
There are three different properties for styling list-items: list-style-type, list-style-image, and list-
styleposition, which should be declared in that order. The default values are disc, outside, and none,
respectively. Each
list-style-type defines the shape or type of bullet point used for each list-item.
disc
circle
square
decimal
lower-roman
upper-roman
none
To use square bullet points for each list-item, for example, you would use the following property-value
pair:
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
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;
CSS Rule
Some properties can take multiple values, collectively known as a property list.
span {
/* Alternate Formatting */
span {
text-shadow:
yellow 0 0 3px,
When you group CSS selectors, you apply the same styles to several different elements without
repeating the styles
So the blue color applies to all <div> elements and all <p> elements. Without the comma only <p>
elements that are
<p>
A CSS rule consists of a selector (e.g. h1) and declaration block ({}).
h1 {}
Chapter 3: Comments
div {
}
Section 3.2: Multiple Line
/*
This
is
CSS
comment
*/
div {
color: red;
Chapter 4: Selectors
CSS selectors identify specific HTML elements as targets for CSS styles. This topic covers how CSS
selectors target
HTML elements. Selectors use a wide range of over 50 selection methods offered by the CSS language,
including
Selector Description
.blue.red All elements with class blue and red (a type of Compound selector)
:lang(en) Element that matches :lang declaration, for example <span lang="en">
Note: The value of an ID must be unique in a web page. It is a violation of the HTML standard to use
the
A complete list of selectors can be found in the CSS Selectors Level 3 specification.
Overview
Attribute selectors can be used with various types of operators that change the selection criteria
accordingly. They
[attr^='val'] <div attr="val1 val2"> Where attr's value begins with val 3
[attr$='val'] <div attr="sth aval"> Where the attr's value ends with val 3
followed by - (U+002D)
2
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
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
[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,
[lang="EN" i] {
color: red;
0-1-0
*[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.
See the Syntax Section for more details.
Overview
Selector Description
div span Descendant selector (all <span>s that are descendants of a <div>)
div > span Child selector (all <span>s that are a direct child of a <div>)
a ~ span General Sibling selector (all <span>s that are siblings after an <a>)
a + span Adjacent Sibling selector (all <span>s that are immediately after an <a>)
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
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>
<section>
</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>
<section>
</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;
}
<p>My text is not red</p>
<hr>
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;
<hr>
The above example selects all <p> elements that are preceded by another <p> element, whether or not
they are
immediately adjacent.
Pseudo-classes are keywords which allow selection based on information that lies outside of the
document tree or
that cannot be expressed by other selectors or combinators. This information can be associated to a
certain state
(state and dynamic pseudo-classes), to locations (structural and target pseudo-classes), to negations of
the former
(negation pseudo-class) or to languages (lang pseudo-class). Examples include whether or not a link
has been
followed (:visited), the mouse is over an element (:hover), a checkbox is checked (:checked), etc.
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.
:any
Allows you to build sets of related selectors by creating groups that the
:default Represents any user interface element that is the default among a group of
similar elements.
:first Used in conjunction with the @page rule, this selects the first page in a
printed document.
:first-child Represents any element that is the first child element of its parent.
:first-of-type Applies when an element is the first of the selected element type
:focus Applies to any element which has the user's focus. This can be given by the
:focus-within Can be used to highlight a whole section when one element inside it is focused. It
matches
any element that the :focus pseudo-class matches or that has a descendant focused.
:full-screen Applies to any element displayed in full-screen mode. It selects the whole stack
:hover Applies to any element being hovered by the user's pointing device, but
not activated.
:indeterminate
:in-range
its value attribute inside the specified range limitations for this element.
It allows the page to give a feedback that the value currently defined
:lang
:last-child Represents any element that is the last child element of its parent.
:last-of-type Applies when an element is the last of the selected element type inside
:left Used in conjunction with the @page rule, this selects all the left
:link Applies to any links which haven't been visited by the user.
:not()
valid and it can only contain one selector. However, you can chain multiple :not selectors
together.
:nth-child
odd or even.
:nth-of-type
:only-child
:optional
that does not have the required attribute set on it. This allows
:out-of-range
value attribute outside the specified range limitations for this element.
It allows the page to give a feedback that the value currently defined using the
:placeholder-shown Experimental. Applies to any form element currently displaying placeholder text.
:read-write Applies to any element that is editable by a user, such as <input> elements.
:right Used in conjunction with the @page rule, this selects all the right pages in a
printed document.
:scope
: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.
"The :nth-child(an+b) CSS pseudo-class matches an element that has an+b-1 siblings before it in the
document tree, for a given positive or zero value for n" - MDN :nth-child
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) ✔
The class name selector select all elements with the targeted class name. For example, the class
name .warning
<div class="warning">
</div>
You can also combine class names to target elements more specifically. Let's build on the example
above to
.important {
color: orange;
.warning {
color: blue;
.warning.important {
color: red;
HTML
<div class="warning">
</div>
</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
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
parent elements with a .warning class names and child elements with .important class names.
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
The :last-of-type selects the element that is the last child, of a particular type, of its parent. In the
example below,
the css selects the last paragraph and the last heading h1.
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>
</div>
jsFiddle
<style>
input:in-range {
</style>
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
Section 4.10: A. The :not pseudo-class example & B. :focuswithin CSS pseudo-class
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">
</form>
CSS:
input:not([disabled]):not(.example){
background-color: #ccc;
The :not() pseudo-class will also support comma-separated selectors in Selectors Level 4:
CSS:
input:not([disabled], .example){
background-color: #ccc;
HTML:
<div>
<input type="text">
</div>
CSS:
div {
height: 80px;
}
input{
margin:30px;
div:focus-within {
background-color: #1565C0;
With the ~ selector, you can easily implement a global accessible boolean without using JavaScript.
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="container">
<div id="sidebar">
</div>
</div>
<div id="footer">
</div>
GoalKicker.com – CSS Notes for Professionals 20
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: */
/* false: */
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.
margin-left: 300px;
#darkThemeUsed:checked ~ #container,
#darkThemeUsed:checked ~ #footer {
background: #333;
In action
used.
<div id="exampleID">
<p>Example</p>
</div>
#exampleID {
width: 20px;
Note: The HTML specs do not allow multiple elements with the same ID
HTML
<input type="range"></input>
CSS
input[type=range]::-ms-thumb
input[type=range]::-ms-track
OnFocus input[type=range]:focus
Lower part of
the track
The :only-child CSS pseudo-class represents any element which is the only child of its parent.
HTML:
<div>
<p>This paragraph is the only child of the div, it will have the color blue</p>
</div>
<div>
</div>
CSS:
p:only-child {
color: blue;
The above example selects the <p> element that is the unique child from its parent, in this case a
<div>.
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
The background-color property sets the background color of an element using a color value or through
keywords,
such as transparent, inherit or initial.
transparent, specifies that the background color should be transparent. This is default.
Color names
CSS
div {
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
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 {
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 {
footer {
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:
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 {
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 {
They will all lead to the red color being shown underneath the image, where the parts of the image
are transparent,
body {
background-image: url(partiallytransparentimage.png);
background: red;
Gradients are new image types, added in CSS3. As an image, gradients are set with the background-
image property,
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
<direction>
90deg... . The angle starts from to top and rotates clockwise. Can be specified in deg, grad, rad,
List of colors, optionally followed each one by a percentage or length to display it at. For
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 {
It is possible to specify any number of color stops in a gradient by separating them with commas. The
following
.linear-gradient-rainbow {
background: linear-gradient(to left, red, orange, yellow, green, blue, indigo, violet)
radial-gradient()
.radial-gradient-simple {
.radial-gradient {
Value Meaning
circle Shape of gradient. Values are circle or ellipse, default is ellipse.
farthest-corner Keywords describing how big the ending shape must be. Values are closest-side,
farthestside, closest-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
.bullseye {
.warning {
Value Meaning
-45deg Angle unit. The angle starts from to top and rotates clockwise. Can be specified in deg, grad,
rad, or
turn.
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
default, this image is tiled to cover the entire element, excluding margin.
.myClass {
background-image: url('/path/to/image.jpg');
.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
url('/path/to/image.jpg')
Specify background image's path(s) or an image resource specified with data URI
This following attributes are very useful and almost essential too.
background-position: left offset (px/%) right offset (px/%) | center center | left top | right
bottom;
The background property can be used to set one or more background related properties:
fixed)
3+
background-clip How the background is painted relative to the content-box, border-box, or the
padding-box 3+
background-attachment How the background image behaves, whether it scrolls along with its
containing
The order of the values does not matter and every value is optional
Syntax
[<initial|inherit>];
GoalKicker.com – CSS Notes for Professionals 27
Examples
background: red;
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
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
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
General overview
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
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
background-size: 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
#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
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:
background-image: url(http://i.stack.imgur.com/r5CAq.jpg);
background-repeat: no-repeat;
background-color: #ccc;
width: 20em;
height: 10em;
div.contain {
background-size: contain;
div.cover {
background-size: cover;
/********************************************
*********************************************/
float: left;
div + div {
clear: both;
padding-top:1ex;
background-color: #000;
color: #fefefe;
margin: 1ex;
padding: 1ex;
opacity: 0.8;
display: block;
width: 10ex;
font-size: 0.7em;
content: attr(class);
}
<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>
</div>
<div>
<div class="cover"></div>
<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 neither do you see any background color;
</div>
The background-position property is used to specify the starting position for a background image or
gradient
.myClass {
background-image: url('path/to/image.jpg');
The position is set using an X and Y co-ordinate and be set using any of the units used within CSS.
Unit Description
value% value%
A percentage for the horizontal offset is relative to (width of background positioning area - width of
background image).
A percentage for the vertical offset is relative to (height of background positioning area - height of
background image)
valuepx valuepx
Offsets background image by a length given in pixels relative to the top left of the background
positioning area
In addition to the shorthand property above, one can also use the longhand background properties
backgroundposition-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.
Note: If the background-attachment property is set to fixed, this property has no effect.
Possible values:
initial
inherit
CSS
.example {
width: 300px;
padding: 50px;
background: url(https://static.pexels.com/photos/6440/magazines-desk-work-workspace-
medium.jpg);
background-repeat: no-repeat;
.example1 {}
HTML
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut
</div>
<p>background-origin: border-box:</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
<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>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut
</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 {
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.
#mydiv {
#mydiv {
Demo
The background-attachment property sets whether a background image is fixed or scrolls with the rest
of the page.
body {
background-image: url('img.jpg');
background-attachment: fixed;
}
Value Description
scroll The background scrolls along with the element. This is default.
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;
}
Definition and Usage: The background-clip property specifies the painting area of the background.
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
CSS
.example {
width: 300px;
padding: 50px;
background: url(https://static.pexels.com/photos/6440/magazines-desk-work-workspace-
medium.jpg);
background-repeat: no-repeat;
.example1 {}
HTML
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut
</div>
<p>background-origin: border-box:</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut
</div>
<p>background-origin: content-box:</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut
</div>
div {
background-image: url("img.jpg");
background-repeat: repeat-y;
.my-div {
width: 300px;
height: 200px;
background-size: 100%;
background-repeat: no-repeat;
url('https://static.pexels.com/photos/54624/strawberry-fruit-red-sweet-54624-medium.jpeg');
background-blend-mode:saturation;
CSS Syntax: background-blend-mode: normal | multiply | screen | overlay | darken | lighten | color-
dodge |
If you set opacity on an element it will affect all its child elements. To set an opacity just on the
background of an
element you will have to use RGBA colors. Following example will have a black background with 0.6
opacity.
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000,
endColorstr=#99000000);
/* For IE 8*/
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000,
endColorstr=#99000000)";
Chapter 6: Centering
HTML:
<div class="container">
</div>
CSS:
height: 100%;
.container {
display: flex;
img {
View Result
HTML:
CSS:
html, body {
height: 100%;
body {
display: flex;
View Result
See Dynamic Vertical and Horizontal Centering under the Flexbox documentation for more details on
flexbox and
Browser Support
Some recent browser versions, such as Safari 8 and IE10, require vendor prefixes.
For a more detailed look at flexbox browser support, see this answer.
GoalKicker.com – CSS Notes for Professionals 40
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
Keep in mind that with this technique, the element could end being rendered at a non-integer pixel
boundary,
HTML
<div class="container">
<div class="element"></div>
</div>
CSS
.container {
position: relative;
.element {
position: absolute;
top: 50%;
left: 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
For horizontal-only centering, use left: 50% and transform: translateX(-50%). The same goes for
verticalonly 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:
marginright: -50%; and margin-bottom: -50%;. View this fiddle for more information.
Objects can be centered by using margin: 0 auto; if they are block elements and have a defined width.
HTML
<div class="containerDiv">
<div id="centeredDiv"></div>
</div>
<div class="containerDiv">
<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
.containerDiv {
width: 100%;
height: 100px;
padding-bottom: 40px;
#centeredDiv {
margin: 0 auto;
width: 200px;
height: 100px;
#centeredParagraph {
width: 200px;
margin: 0 auto;
#centeredImage {
display: block;
width: 200px;
margin: 0 auto;
Result:
The most common and easiest type of centering is that of lines of text in an element. CSS has the rule
text-align:
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
Automatic margins, paired with values of zero for the left and right or top and bottom offsets, will
center an
View Result
HTML
</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.
The calc() function is the part of a new syntax in CSS3 in which you can calculate (mathematically)
what size/position
your element occupies by using a variety of values like pixels, percentages, etc. Note: Whenever you
use this
function, always take care of the space between two values calc(100% - 80px).
CSS
.center {
position: absolute;
height: 50px;
width: 50px;
background: red;
HTML
<div class="center"></div>
You can also use line-height to center vertically a single line of text inside a container :
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.
Supported by IE11+
View Result
Use these 3 lines to vertical align practically everything. Just make sure the div/image you apply the
code to has a
div.vertical {
position: relative;
top: 50%;
transform: translateY(-50%);
HTML
We will see how to center content based on the height of a near element.
HTML
<div class="content">
<div class="position-container">
<div class="thumb">
<img src="http://lorempixel.com/400/200/">
</div>
<div class="details">
<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%;
width: 100%;
Link to JSFiddle
The main points are the 3 .thumb, .details and .position-container containers:
middle.
The .thumb must have width: 100% if you want that it will take all the remaining space and it will be
The image (if you have an image) inside .thumb should have width: 100%, but it is not necessary if you
have
correct proportions.
This technique works even when the container's dimensions are unknown.
Set up a "ghost" element inside the container to be centered that is 100% height, then use vertical-
align:
CSS
.block {
text-align: center;
/* May want to do this if there is risk the container may be narrower than the element inside */
white-space: nowrap;
.block:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -0.25em;
.centered {
display: inline-block;
vertical-align: middle;
width: 300px;
HTML
<div class="block">
<div class="centered"></div>
</div>
The following technique allows you to add your content to an HTML element and center it both
horizontally and
should re-adjust the horizontal text-alignment to eg. text-align: left; or text-align: right;, unless you
Demo
HTML
<div class="outer-container">
<div class="inner-container">
<div class="centered-content">
</div>
</div>
</div>
CSS
body {
margin : 0;
.outer-container {
position : absolute;
display: table;
background: #ccc;
.inner-container {
display: table-cell;
vertical-align: middle;
text-align: center;
.centered-content {
display: inline-block;
text-align: left;
background: #fff;
padding: 20px;
HTML
<div class="wrap">
</div>
CSS
.wrap {
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;
If the size of your content is fixed, you can use absolute positioning to 50% with margin that reduces
half of your
HTML
<div class="center">
</div>
CSS
.center {
position: absolute;
background: #ccc;
left: 50%;
width: 150px;
top: 50%;
height: 200px;
You can center the element horizontally even if you don't know the height of the content:
HTML
<div class="center">
</div>
CSS
.center {
position: absolute;
background: #ccc;
left: 50%;
width: 150px;
You can center the element vertically if you know the element's height:
HTML
<div class="center">
Center only vertically
</div>
CSS
.center {
position: absolute;
background: #ccc;
top: 50%;
height: 200px;
margin-top:-50% percentage-based margin values are calculated relative to the width of containing
block
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;
layout
One could easily center a child element using table display property.
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;
}
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.
The Edges
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
Then we have the border box, as defined by the border property. If there is no border width defined,
the
The outermost rectangle is the margin box, as defined by the margin property. If there is no margin
width
Example
div {
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
The border box is the same size as the padding box, plus the 5px width we're defining above with the
border
Finally the margin box is the same size as the border box, plus the 50px width we're defining above
with the
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:
The default box model (content-box) can be counter-intuitive, since the width / height for an element
will not
represent its actual width or height on screen as soon as you start adding padding and border styles to
the
element.
textarea {
width: 100%;
padding: 3px;
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
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
borderbox. 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
units (e.g. px) see parameter section in Units for a list of valid units
When two margins are touching each other vertically, they are collapsed. When two margins touch
horizontally,
div{
margin: 10px;
<div>
some content
</div>
<div>
</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.)
margin: 10px;
.bottom{
margin: 15px;
<div class="top">
some content
</div>
<div class="bottom">
</div>
These elements will be spaced 15px apart vertically. The margins overlap as much as they can, but the
larger
.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">
</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
div{
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...)
Collapsing Margins Between Parent and Child Elements:
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
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
The standard margin property can be expanded to specify differing widths to each side of the selected
elements.
margin to the left side, and a 100px margin to the left side. View Result
HTML
<div id="myDiv"></div>
CSS
#myDiv {
height: 40px;
width: 40px;
background-color: red;
p{
/*equals to:*/
margin:1px 1px;
/*equals to:*/
/*equals to:*/
margin:1px 1px 1px 1px;
Another exapmle:
p{
margin:10px 15px; /* 10px margin-top & bottom And 15px margin-right & left*/
/*equals to:*/
/*equals to:*/
/* margin left will be calculated from the margin right value (=15px) */
margin
As long as the element is a block, and it has an explicitly set width value, margins can be used to
center block
We add a width value that is lower than the width of the window and the auto property of margin
then distributes
#myDiv {
width:80%;
margin:0 auto;
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
In the example above, the #myDiv element is set to 80% width which leaves use 20% leftover. The
browser
It is obvious to assume that the percentage value of margin to margin-left and margin-right would be
relative to
.parent {
width : 500px;
height: 300px;
.child {
width : 100px;
height: 100px;
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 is one of a few CSS properties that can be set to negative values. This property can be used to
overlap
div{
display: inline;
#over{
margin-left: -20px;
<div>Base 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 {
</style>
<div class="myDiv"></div>
Three values:
<style>
.myDiv {
</style>
<div class="myDiv"></div>
Two values:
<style>
.myDiv {
}
</style>
<div class="myDiv"></div>
One value:
<style>
.myDiv {
</style>
<div class="myDiv"></div>
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.
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>
GoalKicker.com – CSS Notes for Professionals 63
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 topright-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
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
.circle {
width: 200px;
height: 200px;
border-radius: 100px;
Because border-radius accepts percentages, it is common to use 50% to avoid manually calculating the
borderradius value:
.circle {
width: 150px;
height: 150px;
border-radius: 50%;
If the width and height properties are not equal, the resulting shape will be an oval rather than a
circle.
-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;
The border-style property sets the style of an element's border. This property can have from one to
four values
Examples:
border-style: dotted;
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
Using outline:
.div1{
width: 100px;
height: 100px;
margin: 20px;
Using box-shadow:
.div2{
width: 100px;
height: 100px;
margin: 20px;
.div3 {
position: relative;
width: 100px;
height: 100px;
margin: 20px;
.div3:before {
position: absolute;
z-index: -1;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
http://jsfiddle.net/MadalinaTn/bvqpcohm/2/
In most cases you want to define several border properties (border-width, border-style and border-
color) for all
sides of an element.
Instead of writing:
border-width: 1px;
border-style: solid;
border-color: #000;
These shorthands are also available for every side of an element: border-top, border-left, border-right
and
The border-collapse property applies only to tables (and elements displayed as display: table or
inlinetable) and sets whether the table borders are collapsed into a single border or detached as in
standard HTML.
table {
With the border-image property you have the possibility to set an image to be used instead of normal
border
styles.
border-image-slice: Specifies the offset that is used to divide the image into nine regions (four corners,
border-image-repeat: Specifies how the images for the sides and the middle of the border image are
scaled
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.
CSS
.bordered {
border-image: linear-gradient(to right, red 20%, green 20%, green 40%, blue 40%, blue 60%, maroon
border-image-slice: 1;
}
HTML
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
(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
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.
A box's backgrounds, but not its border-image, are clipped to the appropriate curve (as determined by
‘background-clip’).
For example if you wanted to add a border to the left side of an element, you could do:
#element {
Parameter Details
none no outline
Outline is a line that goes around the element, outside of the border. In contrast to border, outlines do
not take any
space in the box model. So adding an outline to an element does not affect the position of the element
or other
elements.
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.
An outline is a line around an element. It is displayed around the margin of the element. However, it is
The outline-style property is used to set the style of the outline of an element.
p{
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
hidden Hides the overflowing content, both scroll bars disappear and the page becomes fixed
auto Same as scroll if content overflows, but doesn't add scroll bar if content fits
overflow-wrap tells a browser that it can break a line of text inside a targeted element onto multiple
lines in an
otherwise unbreakable place. Helpful in preventing an long string of text causing layout problems due
to
CSS
div {
width:100px;
#div1 {
overflow-wrap:normal;
#div2 {
overflow-wrap:break-word;
HTML
<div id="div1">
<strong>#div1</strong>: Small words are displayed normally, but a long word like <span
</div>
<div id="div2">
<strong>#div2</strong>: Small words are displayed normally, but a long word like <span
</div>
These two properties work in a similar fashion as the overflow property and accept the same values.
The
overflow-x parameter works only on the x or left-to-right axis. The overflow-y works on the y or top-to-
bottom
axis.
HTML
<div id="div-x">
If this div is too small to display its contents,
</div>
<div id="div-y">
</div>
CSS
div {
width: 200px;
height: 200px;
#div-x {
overflow-x: hidden;
#div-y {
overflow-y: hidden;
HTML
<div>
This div is too small to display its contents to display the effects of the overflow property.
</div>
CSS
div {
width:100px;
height:100px;
overflow:scroll;
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.
HTML
<div>
Even if this div is too small to display its contents, the content is not clipped.
</div>
CSS
div {
width:50px;
height:50px;
overflow:visible;
Result
Content is not clipped and will be rendered outside the content box if it exceeds its container size.
Section 12.5: Block Formatting Context Created with Overflow
Using the overflow property with a value different to visible will create a new block formatting
context. This is
CSS
img {
float:left;
margin-right: 10px;
div {
HTML
<img src="http://placehold.it/100x100">
<div>
<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.
Parameter Details
mediatype (Optional) This is the type of media. Could be anything in the range of all to screen.
not (Optional) Doesn't apply the CSS for this particular media type and applies for everything
else.
media feature Logic to identify use case for CSS. Options outlined below.
aspect-ratio Describes the aspect ratio of the targeted display area of the output device.
color Indicates the number of bits per color component of the output device. If the device is not a
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.
width 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).
device-aspect-ratio Deprecated CSS will only display on devices whose height/width ratio matches the
specified
max-device-width Deprecated Same as max-width but measures the physical screen width, rather than
the
display width of the browser.
min-device-width Deprecated Same as min-width but measures the physical screen width, rather than
the
max-device-height Deprecated Same as max-height but measures the physical screen width, rather
than the
min-device-height Deprecated Same as min-height but measures the physical screen width, rather
than the
Media queries allow one to apply CSS rules based on the type of device / media (e.g. screen, print or
handheld)
called media type, additional aspects of the device are described with media features such as the
availability of
@media [...] {
@media print {
A Media Query containing a Media Feature (and an implicit Media Type of "all")
body {
background-color: skyblue;
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
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.
Media queries have an optional mediatype parameter. This parameter is placed directly after the
@media
@media print {
html {
background-color: white;
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
html {
background-color: green;
And the same way, for just showing it only on the screen, this can be used:
.fadeInEffects {
display: block;
}
}
The list of mediatype can be understood better with the following table:
tv Television-type devices
Screens
Although this works only for WebKit based browsers, this is helpful:
@media screen
and (-webkit-min-device-pixel-ratio: 1) {
@media screen
and (-webkit-min-device-pixel-ratio: 2)
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:
This hasn't been implemented in engines other than WebKit and Blink.
When we are using "width" with media queries it is important to set the meta tag correctly. Basic
meta tag looks like
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).
What does that mean?
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
But if you did not set the meta tag correctly it will try to show your webpage with its native resolution
which results
Sizes
Often times, responsive web design involves media queries, which are CSS blocks that are only
executed if a
condition is satisfied. This is useful for responsive web design because you can use media queries to
specify
different CSS styles for the mobile version of your website versus the desktop version.
.site-title {
font-size: 80%;
/* Styles in this block are only applied if the screen size is atleast 300px wide, but no more
than 767px */
.site-title {
font-size: 90%;
/* Styles in this block are only applied if the screen size is atleast 768px wide, but no more
than 1023px */
.site-title {
font-size: 120%;
/* 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]>
<![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).
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
HTML:
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed
cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis
ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia
<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque
nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin
ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non,
CSS:
img {
float:left;
margin-right:1rem;
Codepen Link
both - No floating elements allowed on either the left or the right side
initial - Sets this property to its default value. Read about initial
inherit - Inherits this property from its parent element. Read about inherit
<html>
<head>
<style>
img {
float: left;
p.clear {
clear: both;
</style>
</head>
<body>
<p>Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem
ipsoum Lorem
ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum </p>
<p class="clear">Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem
ipsoum
Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum Lorem ipsoum </p>
</body>
</html>
Section 14.3: Clearfix
The clearfix hack is a popular way to contain floats (N. Gallagher aka @necolas)
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
3 versions with slightly different effects (sources :A new micro clearfix hack by N. Gallagher and
clearfix reloaded by
T. J. Koblentz):
.cf:after {
content: "";
display: table;
.cf:after {
clear: both;
/**
* 1. The space content is one way to avoid an Opera bug when the
.cf:before,
.cf:after {
display: table; /* 2 */
.cf:after {
clear: both;
.cf:before,
.cf:after {
display: table;
.cf:after {
clear: both;
/**
*/
.cf {
*zoom: 1;
}
Other resource: Everything you know about clearfix is wrong (clearfix and BFC - Block Formatting
Context while
The div is a block-level element, i.e it occupies the whole of the page width and the siblings are place
one below the
<div>
</div>
<div>
</div>
We can make them in-line by adding a float css property to the div.
HTML:
<div class="outer-div">
<div class="inner-div1">
</div>
<div class="inner-div2">
</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
Setting overflow value to hidden,auto or scroll to an element, will clear all the floats within that
element.
are not the same height in this example. This is one of the tricky parts with multi-column layouts using
floats, and
HTML:
<div class="wrapper">
<div class="sidebar">
<h2>Sidebar</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio.</p>
</div>
<div class="content">
<h1>Content</h1>
<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque
nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin
ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non,
</div>
</div>
CSS:
.wrapper {
width:600px;
padding:20px;
background-color:pink;
/* Floated elements don't use any height. Adding "overflow:hidden;" forces the
parent element to expand to contain its floated children. */
overflow:hidden;
.sidebar {
width:150px;
float:left;
background-color:blue;
.content {
width:450px;
float:right;
background-color:yellow;
HTML:
<div class="wrapper">
<div class="left-sidebar">
<h1>Left Sidebar</h1>
</div>
<div class="content">
<h1>Content</h1>
<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque
nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin
ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non,
massa. </p>
</div>
<div class="right-sidebar">
<h1>Right Sidebar</h1>
</div>
</div>
CSS:
.wrapper {
width:600px;
background-color:pink;
padding:20px;
/* Floated elements don't use any height. Adding "overflow:hidden;" forces the
overflow:hidden;
.left-sidebar {
width:150px;
background-color:blue;
float:left;
.content {
width:300px;
background-color:yellow;
float:left;
.right-sidebar {
width:150px;
background-color:green;
float:right;
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:
<div class="sidebar">
<h1>Sidebar</h1>
</div>
<div class="content">
<h1>Content</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed
cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis
ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia
Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque
nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin
ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non,
massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper
</div>
CSS:
.sidebar {
display:table;
float:left;
background-color:blue;
.content {
overflow:hidden;
background-color:yellow;
Fiddle
Parameter Details
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
color Any valid CSS color representation, like red, #00FF00, hsl(240, 100%, 50%) etc.
font-stretch
Whether or not to use a confenced or expanded face from font. Valid values are normal,
ultracondensed, extra-condensed, condensed, semi-condensed, semi-expanded, expanded,
extraexpanded or ultra-expanded
element {
You can have all your font-related styles in one declaration with the font shorthand. Simply use the
font property,
For example, to make all p elements bold with a font size of 20px and using Arial as the font family
typically you
p{
font-weight: bold;
font-size: 20px;
}
However with the font shorthand it can be condensed as follows:
p{
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 fontfamily. 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;
The quotes property is used to customize the opening and closing quotation marks of the <q> tag.
q{
HTML:
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.
div {
.ex {
.horizontal-tb {
.vertical-rtl {
.vertical-ltr {
}
The direction property is used to change the horizontal text direction of an element.
The writing-mode property changes the alignment of text so it can be read from top-to-bottom or from
left-to-right,
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.
The text-overflow property deals with how overflowed content should be signaled to users. In this
example, the
.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;
line-height: X; /* fallback */
http://jsfiddle.net/csYjC/1131/
Resources:
https://www.w3.org/TR/2012/WD-css3-ui-20120117/#text-overflow0
To add shadows to text, use the text-shadow property. The syntax is as follows:
h1 {
h1 {
Multiple Shadows
h1 {
The text-transform property allows you to change the capitalization of text. Valid values are:
uppercase,
CSS
.example1 {
text-transform: uppercase;
.example2 {
text-transform: capitalize;
.example3 {
text-transform: lowercase;
}
HTML
<p class="example1">
</p>
<p class="example2">
all letters in capitalize <!-- "All Letters In Capitalize (Sentence Case)" -->
</p>
<p class="example3">
</p>
h2 {
letter-spacing: 1px;
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
p{
text-indent: 50px;
The text-indent property specifies how much horizontal space text should be moved before the
beginning of the
Resources:
https://www.w3.org/TR/CSS21/text.html#propdef-text-indent
https://developer.mozilla.org/en-US/docs/Web/CSS/text-indent
h1 { text-decoration: none; }
h2 { text-decoration: overline; }
h3 { text-decoration: line-through; }
h4 { text-decoration: underline; }
property:
.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
The word-spacing property specifies the spacing behavior between tags and words.
Possible values
the keyword inherit takes the value from the parent element
CSS
HTML
<p>
</p>
Online-Demo
Try it yourself
Further reading:
word-spacing – MDN
word-spacing – w3.org
Attributes:
normal
small-caps
Sets every letter to uppercase, but makes the lowercase letters(from original text) smaller in size than
the letters
CSS:
.smallcaps{
font-variant: small-caps;
HTML:
<p class="smallcaps">
<br>
aNd ExAmpLe
</p>
Output:
Note: The font-variant property is a shorthand for the properties: font-variant-caps, font-variant-
numeric, fontvariant-alternates, font-variant-ligatures, and font-variant-east-asian.
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
HTML
<div class="aligner">
<div class="aligner-item">…</div>
</div>
CSS
.aligner {
display: flex;
align-items: center;
justify-content: center;
.aligner-item {
Here is a demo.
Reasoning
align-items center
This centers the elements along the axis other than the one specified by flex-direction,
i.e., vertical centering for a horizontal flexbox and horizontal centering for a vertical
flexbox.
justify-content center
This centers the elements along the axis specified by flex-direction. I.e., for a
horizontal (flex-direction: row) flexbox, this centers horizontally, and for a vertical
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.
div#container {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
Outcome:
Here is a demo.
div#container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
Outcome:
Here is a demo.
This code creates a sticky footer. When the content doesn't reach the end of the viewport, the footer
sticks to the
bottom of the viewport. When the content extends past the bottom of the viewport, the footer is also
pushed out of
HTML:
<div class="header">
<h2>Header</h2>
</div>
<div class="content">
<h1>Content</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.
Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis
ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia
arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
</div>
<div class="footer">
<h4>Footer</h4>
</div>
CSS:
html, body {
height: 100%;
body {
display: flex;
flex-direction: column;
}
.content {
flex: 1 0 auto;
.header, .footer {
background-color: grey;
color: white;
flex: none;
One of the nicest features of flexbox is to allow optimally fitting containers to their parent element.
Live demo.
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;
Outcome:
Holy Grail layout is a layout with a fixed height header and footer, and a center with 3 columns. The 3
columns
include a fixed width sidenav, a fluid center, and a column for other content like ads (the fluid center
appears first in
the markup). CSS Flexbox can be used to achieve this with a very simple markup:
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 .content {
flex: 1 1 auto;
overflow: auto;
.content-body .sidenav {
order: -1;
flex: 0 0 100px;
overflow: auto;
.content-body .ads {
flex: 0 0 100px;
overflow: auto;
.footer {
flex: 0 0 50px;
Demo
flexbox
It's a regular pattern in design these days to vertically align call to actions inside its containing cards
like this:
HTML
<div class="cards">
<div class="card">
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim
<p><button>Action</button></p>
</div>
<div class="card">
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim
<p>Lorem ipsum Magna proident ex anim dolor ullamco pariatur reprehenderit culpa esse enim
<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
CSS
.cards {
display: flex;
.card {
padding: 0 20px;
button {
height: 40px;
background: #fff;
padding: 0 40px;
p:last-child {
text-align: center;
In order to move the buttons to the bottom of the block, we need to apply display: flex; to the card
itself with
the direction set to column. After that, we should select the last element inside the card and set the
margin-top to
auto. This will push the last paragraph to the bottom of the card and achieve the required result.
Final CSS:
.cards {
display: flex;
.card {
display: flex;
flex-direction: column;
button {
height: 40px;
background: #fff;
padding: 0 40px;
p:last-child {
text-align: center;
margin-top: auto;
This code makes sure that all nested containers are always the same height. This is done by assuring
that all nested
elements are the same height as the containing parent div. See working example:
https://jsfiddle.net/3wwh7ewp/
This effect is achieved due to the property align-items being set to stretch by default.
HTML
<div class="container">
to make<br />
GoalKicker.com – CSS Notes for Professionals 108
</div>
</div>
</div>
CSS
.container {
display: flex;
Each individual CSS Selector has its own specificity value. Every selector in a sequence increases the
sequence's
overall specificity. Selectors fall into one of three different specificity groups: A, B and c. When multiple
selector
sequences select a given element, the browser uses the styles applied by the sequence with the highest
overall
specificity.
A id selectors #foo
B
class selectors
attribute selectors
pseudo-classes
.bar
[title], [colspan="2"]
:hover, :nth-child(2)
type selectors
pseudo-elements
div, li
::before, ::first-letter
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
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
The last snippet from Example 2 above can be manipulated to ensure our .bar class selector's color
declaration is
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
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
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
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
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
This makes future changes harder and pollutes that css page.
The !important declaration is used to override the usual specificity in a style sheet by giving a higher
priority to a
#mydiv {
#outerdiv #mydiv {
font-weight: normal; /* #mydiv font-weight won't be set to normal
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
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
To give the user more control over the web accessibility, like increasing or decreasing size of the font-
size, by
See also:
W3C - 6 Assigning property values, Cascading, and Inheritance -- 6.4.2 !important rules
Cascading and specificity are used together to determine the final value of a CSS styling property. They
also define
2. User stylesheet (The additional styling a user has set on his/her browser)
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
What color will the text be? (hover to see the answer)
blue
First the specificity rules are applied, and the one with the highest specificity "wins".
.class {
background: #FFF;
}
Internal css (in HTML file)
<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".
<body class="otherstyle">
</body>
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
div {
font-size: 7px;
background-color: yellow;
color: purple;
font-size: 11px;
background-color: green;
#elmnt1 {
font-size: 24px;
border-color: red;
.mystyle .myotherstyle {
font-size: 16px;
background-color: black;
color: red;
<body class="mystyle">
Hello, world!
</div>
</body>
font-size:
font-size: 24;, since #elmnt1 rule set has the highest specificity for the <div> in question, every
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
Here currentColor evaluates to red since the color property is set to red:
div {
color: red;
border: 5px solid 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
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;
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:
Most browsers support using color keywords to specify a color. For example, to set the color of an
element to blue,
.some-class {
color: blue;
CSS keywords are not case sensitive—blue, Blue and BLUE will all result in #0000FF.
Color Keywords
In addition to the named colors, there is also the keyword transparent, which represents a fully-
transparent black:
rgba(0,0,0,0)
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
.some-class {
color: #0000FF;
.also-blue {
/* If you want to specify each range value with a single number, you can!
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.
RGB is an additive color model which represents colors as mixtures of red, green, and blue light. In
essence, the
RGB representation is the decimal equivalent of the Hexadecimal Notation. In Hexadecimal each
number ranges
.some-class {
.also-blue {
Syntax
.red {
/* Opaque red */
.red-50p {
/* Half-translucent red. */
Syntax
Value Description
<alpha> a number from 0 - 1, where 0.0 is fully transparent and 1.0 is fully opaque
HSL stands for hue ("which color"), saturation ("how much color") and lightness ("how much white").
Hue is represented as an angle from 0° to 360° (without units), while saturation and lightness are
represented as
percentages.
p{
Syntax
Value Description
<hue>
specified in degrees around the color wheel (without units), where 0° is red, 60° is yellow, 120° is
green, 180° is cyan, 240° is blue, 300° is magenta, and 360° is red
<saturation>
specified in percentage where 0% is fully desaturated (grayscale) and 100% is fully saturated (vividly
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.
Syntax
Value Description
<hue>
specified in degrees around the color wheel (without units), where 0° is red, 60° is yellow, 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)
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;">
</div>
.transparent-element {
/* for IE 8 & 9 */
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; // IE8
/* Modern Browsers */
opacity: 0.6;
Unit Description
em Relative to the font-size of the element (2em means 2 times the size of the current font)
cm centimeters
mm millimeters
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.
Version ≥ 3
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:
<input type="range">
Relevant CSS:
html {
font-size: 16px;
input[type="button"] {
font-size: 1rem;
input[type="range"] {
font-size: 1rem;
GoalKicker.com – CSS Notes for Professionals 128
width: 10em;
input[type=text] {
font-size: 1rem;
padding: 0.5em;
Possible Result:
CSS3 introduces a few new units, including the rem unit, which stands for "root em". Let's look at how
rem works.
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
18px = 1.125rem
20px = 1.25rem
24px = 1.5rem
30px = 1.875rem
32px = 2rem
CODE:
Version ≥ 3
html {
font-size: 16px;
h1 {
p{
li {
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:
On the output, the Child's width will be half(50%) of the Parent's, which is 50px.
HTML
<div class="parent">
PARENT
<div class="child">
CHILD
</div>
</div>
CSS
<style>
*{
color: #CCC;
.parent{
background-color: blue;
width: 100px;
.child{
background-color: green;
width: 50%;
</style>
OUTPUT
pseudo-element Description
::backdrop Used to create a backdrop that hides the underlying document for an element in the top
layer's
stack
::placeholder Allows you to style the placeholder text of a form element (Experimental)
::spelling-error Represents a text segment which the browser has flagged as incorrectly spelled
(Experimental)
::grammar-error
Represents a text segment which the browser has flagged as grammatically incorrect
(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.
Pseudo-elements are added to selectors but instead of describing a special state, they allow you to
style certain
parts of a document.
The content attribute is required for pseudo-elements to render; however, the attribute can have an
empty value
div::after {
content: 'after';
color: red;
div {
color: black;
border: 1px solid black;
padding: 1px;
div::before {
content: 'before';
color: green;
Pseudo-elements are often used to change the look of lists (mostly for unordered lists, ul).
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;
HTML
<ul>
<li>Test I</li>
<li>Test II</li>
</ul>
Result
Parameter Details
static Default value. Elements render in order, as they appear in the document flow. The top, right,
bottom,
relative The element is positioned relative to its normal position, so left:20px adds 20 pixels to the
element's
LEFT position
absolute The element is positioned relative to its first positioned (not static) ancestor element
sticky Experimental feature. It behaves like position: static within its parent until a given offset
threshold
To change the default stack order positioned elements (position property set to relative, absolute or
fixed), use
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
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
Parameter Details
number An integer value. A higher number is higher on the z-index stack. 0 is the default value.
Negative
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
Read about the z-index property and Stacking Contexts in the CSS Specification on layered
presentation and at the
When absolute positioning is used the box of the desired element is taken out of the Normal Flow and
it no longer
affects the position of the other elements on the page. Offset properties:
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
Defining position as fixed we can remove an element from the document flow and set its position
relatively to the
browser window. One obvious use is when we want something to be visible when we scroll to the
bottom of a long
page.
#stickyDiv {
position:fixed;
top:10px;
left:10px;
}
Section 22.4: Relative Position
Relative positioning moves the element in relation to where it would have been in normal flow .Offset
properties:
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
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;
block Block element, occupy 100% of the available width, break after element.
inline-block Taking special properties from both inline and block elements, no break, but can have
width.
grid Behaves like a block element and lays out its content according to the grid model.
flex Behaves like a block element and lays out its content according to the flexbox model.
initial Reset the value to the default value taken from behaviors described in the HTML specifications
or
The display CSS property is fundamental for controlling the layout and flow of an HTML document.
Most elements
have a default display value of either block or inline (though some elements have other default
values).
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
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,
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.
<style>
li {
display : inline;
background : lightblue;
padding:10px;
border-width:2px;
border-color:black;
border-style:solid;
</style>
<ul>
</ul>
<style>
li {
display : block;
background : lightblue;
padding:10px;
border-width:2px;
border-color:black;
border-style:solid;
</style>
<ul>
</ul>
<style>
li {
display : inline-block;
background : lightblue;
padding:10px;
border-width:2px;
border-color:black;
border-style:solid;
</style>
<ul>
</ul>
none
An element that is given the none value to its display property will not be displayed at all.
<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
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,
<style>
table {
width: 100%;
</style>
<table>
<tr>
<td>
I'm a table
</td>
</tr>
</table>
<style>
.table-div {
display: table;
.table-row-div {
display: table-row;
.table-cell-div {
display: table-cell;
</style>
<div class="table-div">
<div class="table-row-div">
<div class="table-cell-div">
</div>
</div>
</div>
The CSS Grid is defined as a display property. It applies to a parent element and its immediate children
only.
<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;
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
The table-layout property changes the algorithm that is used for the layout of a table.
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
Value Description
auto This is the default value. It defines the layout of the table to be determined by the contents of its'
cells.
fixed This value sets the table layout to be determined by the width property provided to the table. If
the content
of a cell exceeds this width, the cell will not resize but instead, let the content overflow.
The empty-cells property determines if cells with no content should be displayed or not. This has no
effect unless
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
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/
Below an example of two tables with different values to the border-collapse property:
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.
The border-spacing property determines the spacing between cells. This has no effect unless border-
collapse is
set to separate.
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.
Section 25.5: caption-side
The caption-side property determines the vertical positioning of the <caption> element within a table.
This has no
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.
Parameter Details
transition-property The specific CSS property whose value change needs to be transitioned (or) all, if
all the
transition-duration The duration (or period) in seconds (s) or milliseconds (ms) over which the
transition
transition-timing-function
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,
cubic-bezier(), steps(). More information about the various timing functions can be
transition-delay The amount of time that must have elapsed before the transition can start. Can be
CSS
div{
width: 150px;
height:150px;
background-color: red;
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.
The cubic-bezier function is a transition timing function which is often used for custom and smooth
transitions.
These parameters will be mapped to points which are part of a Bézier curve:
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
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)
CSS
div {
height: 100px;
width: 100px;
transition-timing-function: linear;
div:hover {
height: 200px;
width: 200px;
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-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.
Transition
Parameter Details
property Either the CSS property to transition on, or all, which specifies all transition-able
properties.
timing-function
Specifies a function to define how intermediate values for properties are computed.
Common values are ease, linear, and step-end. Check out the easing function cheatsheet for more.
delay Amount of time, in seconds or milliseconds, to wait before playing the animation.
@keyframes
[ from | to | <percentage> ] You can either specify a set time with a percentage value, or two
percentage values, ie
10%, 20%, for a period of time where the keyframe's set attributes are set.
Basic Example
In this example, we'll make a basic background animation that cycles between all colors.
@keyframes rainbow-background {
0% { background-color: #ff0000; }
.RainbowBackground {
View Result
There's a few different things to note here. First, the actual @keyframes syntax.
@keyframes rainbow-background{
This sets the name of the animation to rainbow-background.
0% { background-color: #ff0000; }
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 {
This code attaches our animation to all elements which have the .RainbowBackground class.
animation-duration: How long the animation will take, in this case 5 seconds.
animation-iteration-count (Optional): The number of times the animation will loop. In this case, the
animation-delay (Optional): Specifies how long to wait before the animation starts. It defaults to 0
seconds,
and can take negative values. For example, -2s would start the animation 2 seconds into its loop.
animation-timing-function (Optional): Specifies the speed curve of the animation. It defaults to ease,
where the animation starts slow, gets faster and ends slow.
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
@-webkit-keyframes{}
-webkit-animation: ...
Useful for simple animations, the CSS transition property allows number-based CSS properties to
animate
between states.
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
By adding the transition property, we can cause these changes to occur over time:
.Example{
...
View Result
The all value applies the transition to all compatible (numbers-based) properties. Any compatible
property name
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
.Example{
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
Our first syntax example shows the animation shorthand property using all of the available
properties/parameters:
slidein;
Our second example is a little more simple, and shows that some properties can be omitted:
Our third example shows the most minimal declaration. Note that the animation-name and
animation-duration
must be declared:
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:
animation-duration: 3s;
animation-timing-function: ease-in;
animation-delay: 1s;
animation-iteration-count: 2;
animation-direction: reverse;
animation-fill-mode: both;
animation-play-state: paused;
animation-name: slidein;
`will-change` Attribute
When creating animations and other GPU-heavy actions, it's important to understand the will-change
attribute.
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
.Example{
...
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
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
skew(x,y)
each direction
skewX(x)
Horizontal shear mapping distorting each point of an element by a certain angle in the
horizontal direction
skewY(y)
Vertical shear mapping distorting each point of an element by a certain angle in the vertical
direction
angle
The angle by which the element should be rotated or skewed (depending on the function
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
length-or-percentage
A number which defines how many times the element should be scaled in the specified axis.
In scale() function, the second scale-factor is optional. If not provided, the first scale-factor
HTML
<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.
HTML
<div class="scale"></div>
CSS
.scale {
width: 100px;
height: 100px;
background: teal;
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.
HTML
<div class="skew"></div>
CSS
.skew {
width: 100px;
height: 100px;
background: teal;
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="transform"></div>
.transform {
HTML
<div class="translate"></div>
CSS
.translate {
width: 100px;
height: 100px;
background: teal;
This example will move the div by 200px on the X axis and by 100px * 50% = 50px on the Y axis.
On the X axis:
.translate {
transform: translateX(200px);
}
On the Y axis:
.translate {
transform: translateY(50%);
Transformations are done with respect to a point which is defined by the transform-origin property.
In the following example the first div (.tl) is rotate around the top left corner with transform-origin: 0
0; and
the second (.tr)is transformed around it's top right corner with transform-origin: 100% 0. The rotation
is applied
on hover :
HTML:
CSS:
.transform {
display: inline-block;
width: 200px;
height: 100px;
background: teal;
.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.
transforms
CSS
div.needle {
margin: 100px;
height: 150px;
width: 150px;
/* presentational */
background-image: linear-gradient(to top left, #555 0%, #555 40%, #444 50%, #333 97%);
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
This pen uses a similar approach to create something that resembles the Safari logo or a compass dial.
HTML:
<div id="title">
<h1 data-content="HOVER">HOVER</h1>
</div>
CSS:
*{margin:0;padding:0;}
html,body{height:100%;width:100%;overflow:hidden;background:#0099CC;}
#title{
position:absolute;
top:50%; left:50%;
transform:translate(-50%,-50%);
perspective-origin:50% 50%;
perspective:300px;
h1{
text-align:center;
font-size:12vmin;
color:rgba(0,0,0,0.8);
line-height:1em;
transform:rotateY(50deg);
perspective:150px;
perspective-origin:0% 50%;
h1:after{
content:attr(data-content);
position:absolute;
left:0;top:0;
transform-origin:50% 100%;
transform:rotateX(-90deg);
color:#0099CC;
#title:before{
content:'';
position:absolute;
top:-150%; left:-25%;
width:180%; height:328%;
background:rgba(255,255,255,0.7);
transform-origin: 0 100%;
border-radius:0 0 100% 0;
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
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
For example, this would flip an element away from the screen:
JSFIDDLE
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-ms-transform: rotateY(180deg);
-webkit-backface-visibility: visible;
-moz-backface-visibility: visible;
-ms-backface-visibility: visible;
.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:
1. visible (default) - the element will always be visible even when not facing the screen.
2. hidden - the element is not visible when not facing the screen.
3. inherit - the property will gets its value from the its parent element
3D transforms can be use to create many 3D shapes. Here is a simple 3D CSS cube example:
HTML:
<div class="cube">
<div class="cubeFace"></div>
<div class="cubeFace face2"></div>
</div>
CSS:
body {
perspective: 1500px;
overflow: hidden;
.cube {
position: relative;
padding-bottom: 20%;
transform-style: preserve-3d;
.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: rotateX(90deg);
backface-visibility: hidden;
.face2 {
.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);
Additional styling is added in the demo and a transform is applied on hover to view the 6 faces of the
cube.
Value Description
brightness(x) Brightens the image at any value above 1.0 or 100%. Below that, the image will be
darkened.
contrast(x) Provides more contrast to the image at any value above 1.0 or 100%. Below that, the
drop-shadow(h, v, x, y, z) Gives the image a drop-shadow. h and v can have negative values. x, y, and z
are optional.
greyscale(x) Shows the image in greyscale, with a maximum value of 1.0 or 100%.
invert(x) Inverts the color of the image with a maximum value of 1.0 or 100%.
opacity(x) Sets how opaque/transparent the image is with a maximum value of 1.0 or 100%.
saturate(x) Saturates the image at any value above 1.0 or 100%. Below that, the image will start to
de-saturate.
sepia(x) Converts the image to sepia with a maximum value of 1.0 or 100%.
HTML
CSS
img {
-webkit-filter: blur(1px);
filter: blur(1px);
Result
possible)
HTML
CSS
p{
Result
HTML
img {
-webkit-filter: hue-rotate(120deg);
filter: hue-rotate(120deg);
Result
HTML
CSS
img {
Result
HTML
<div></div>
CSS
div {
width: 100px;
height: 100px;
background-color: white;
-webkit-filter: invert(100%);
filter: invert(100%);
Result
cursor: value;
Examples:
Value Description
The pointer-events property allows for control over how HTML elements respond to mouse/touch
events.
.disabled {
pointer-events: none;
In this example,
'none' prevents all click, state and cursor options on the specified HTML element [[1]]
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
The caret-color CSS property specifies the color of the caret, the visible indicator of the insertion point
in an
element where text and other content is inserted by the user's typing or editing.
HTML
CSS
#example {
caret-color: red;
Resources:
https://developer.mozilla.org/en-US/docs/Web/CSS/caret-color
Parameters Details
inset by default, the shadow is treated as a drop shadow. the inset keyword draws the shadow inside
the
frame/border.
blur-radius 0 by default. value cannot be negative. the bigger the value, the bigger and lighter the
shadow
becomes.
spread-radius 0 by default. positive values will cause the shadow to expand. negative values will cause
the shadow
to shrink.
color can be of various notations: a color keyword, hexadecimal, rgb(), rgba(), hsl(), hsla()
JSFiddle: https://jsfiddle.net/UnsungHero97/80qod7aL/2/
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;
JSFiddle: https://jsfiddle.net/UnsungHero97/80qod7aL/
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
background-color: #1C90F3;
width: 200px;
height: 100px;
margin: 50px;
Result:
JSFiddle: https://jsfiddle.net/UnsungHero97/80qod7aL/1/
JSFiddle: https://jsfiddle.net/UnsungHero97/80qod7aL/5/
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
width: 100px;
height: 100px;
margin: 100px;
box-shadow:
Parameter Details
none
A value of none means that the float area (the area that is used for wrapping content around a float
basic-shape Refers to one among inset(), circle(), ellipse() or polygon(). Using one of these functions
and its
shape-box
Refers to one among margin-box, border-box, padding-box, content-box. When only <shape-box> is
provided (without <basic-shape>) this box is the shape. When it is used along with <basic-shape>, this
image When an image is provided as value, the shape is computed based on the alpha channel of the
image
specified.
With the shape-outside CSS property one can define shape values for the float area so that the inline
content
CSS
img:nth-of-type(1) {
float: left;
width: 200px;
img:nth-of-type(2) {
width: 200px;
p{
text-align: center;
HTML
<img src="http://images.clipartpanda.com/circle-clip-art-circlergb.jpg">
<img src="http://images.clipartpanda.com/circle-clip-art-circlergb.jpg">
<p>Some paragraph whose text 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.
In the above example, both the images are actually square images and when the text is placed
without the shapeoutside 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
The imaginary circle that is used to re-define the float area is a circle with radius of 80px drawn from
the center-mid
Below are a couple of screenshots to illustrate how the content would be wrapped around when
shape-outside is
CSS
img:nth-of-type(1) {
shape-margin: 10px;
float: left;
width: 200px;
img:nth-of-type(2) {
shape-margin: 10px;
float: right;
width: 200px;
p{
text-align: center;
HTML
<img src="http://images.clipartpanda.com/circle-clip-art-circlergb.jpg">
<img src="http://images.clipartpanda.com/circle-clip-art-circlergb.jpg">
<p>Some paragraph whose text 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 Ipsum Dolor Sit Amet....</p>
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:
Value Description
A list consists of <li> elements inside a containing element (<ul> or <ol>). Both the list items and the
container can
have margins and paddings which influence the exact position of the list item content in the document.
The default
values for the margin and padding may be different for each browser. In order to get the same layout
crossbrowser, these need to be set specifically.
Each list item gets a 'marker box', which contains the bullet marker. This box can either be placed
inside or outside
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.
Sometimes, a list should just not display any bullet points or numbers. In that case, remember to
specify margin
and padding.
<ul>
<li>first item</li>
<li>second item</li>
</ul>
CSS
ul {
list-style-type: none;
li {
margin: 0;
padding: 0;
list-style: decimal-leading-zero;/* Decimal numbers padded by initial zeros (01, 02, 03, … 10) */
list-style: lower-roman; /* Lowercase roman numerals (i., ii., iii., iv., ...) */
list-style: upper-roman; /* Uppercase roman numerals (I., II., III., IV., ...) */
list-style-type: lower-greek; /* Lowercase roman letters (α., β., γ., δ., ...) */
Non-specific:
Parameter Details
counter-name This is the name of the counter that needs to be created or incremented or printed. It
can be any
integer
This integer is an optional value that when provided next to the counter name will represent the
initial value of the counter (in counter-set, counter-reset properties) or the value by which the
none
This is the initial value for all 3 counter-* properties. When this value is used for counterincrement, the
value of none of the counters are affected. When this is used for the other two, no
counter is created.
counter-style
This specifies the style in which the counter value needs to be displayed. It supports all values
supported by the list-style-type property. If none is used then the counter value is not printed
at all.
connector-string This represents the string that must be placed between the values of two different
counter levels
output
CSS
body {
counter-reset: item-counter;
.item {
counter-increment: item-counter;
.item:before {
content: counter(item-counter, upper-roman) ". "; /* by specifying the upper-roman as style the
HTML
CSS
body {
.item {
counter-increment: item-counter; /* increment the counter every time an element with class "item"
is encountered */
.item-header:before {
content: counter(item-counter) ". "; /* print the value of the counter before the header and
append a "." to it */
.item {
height: 100px;
margin-bottom: 10px;
.item-header {
height: 40px;
line-height: 40px;
padding: 5px;
.item-content {
padding: 8px;
HTML
<div class='item'>
</div>
<div class='item'>
</div>
<div class='item'>
</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.
counters
CSS
ul {
list-style: none;
counter-reset: list-item-number; /* self nesting counter as name is same for all levels */
li {
counter-increment: list-item-number;
li:before {
content: counters(list-item-number, ".") " "; /* usage of counters() function means value of
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
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.
It is especially useful when working with different types of units (e.g. subtracting a px value from a
percentage) to
+, -, /, and * operators can all be used, and parentheses can be added to specify the order of
operations if
necessary.
#div1 {
position: absolute;
left: 50px;
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
<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.
Creates an image representing a gradient of colors radiating from the center of the gradient
radial-gradient(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 the edges*/
This creates a gradient going from bottom to top, with colors starting at red, then yellow at 50%, and
finishing in
blue.
GoalKicker.com – CSS Notes for Professionals 180
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
:root {
--red: #b00;
--blue: #4679bd;
--grey: #ddd;
.Bx1 {
color: var(--red);
background: var(--grey);
:root {
--W200: 200px;
--W10: 10px;
.Bx2 {
width: var(--W200);
height: var(--W200);
margin: var(--W10);
CSS variables cascade in much the same way as other properties, and can be restated safely.
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;
color: var(--color);
.button:hover {
--color: blue;
.button_red {
--color: red;
}
Naming When naming CSS variables, it contains only letters and dashes just like other CSS properties
(eg: lineheight, -moz-box-sizing) but it should start with double dashes (--)
--123color: blue;
--#color: red;
--bg_color: yellow
--$width: 100px;
--color: red;
--bg-color: yellow
--width: 100px;
--pcolor: ;
--Pcolor: ;
--pColor: ;
Empty Vs Space
/* Invalid */
--color:;
/* Valid */
Concatenations
--logo-url: 'logo';
.logo{
--logo-url: 'assets/img/logo.png';
background: url(var(--logo-url));
/* Valid */
.logo{
--logo-url: url('assets/img/logo.png');
background: var(--logo-url);
/* Invalid */
--width: 10;
width: var(--width)px;
/* Valid */
--width: 10px;
width: var(--width);
/* Valid */
--width: 10;
You can re-set variables within media queries and have those new values cascade wherever they are
used,
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%;
:root{
--width:50%;
:root{
--width:100%;
}
}
div{
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;
background: red;
A trapezoid can be made by a block element with zero height (height of 0px), a width greater than
zero and a
HTML:
<div class="trapezoid"></div>
CSS:
.trapezoid {
width: 50px;
height: 0;
With changing the border sides, the orientation of the trapezoid can be adjusted.
To create a CSS triangle define an element with a width and height of 0 pixels. The triangle shape will
be formed
using border properties. For an element with 0 height and width the 4 borders (top, right, bottom, left)
each form a
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.
Triangle - Pointing Up
<div class="triangle-up"></div>
.triangle-up {
width: 0;
height: 0;
<div class="triangle-down"></div>
.triangle-down {
width: 0;
height: 0;
<div class="triangle-right"></div>
.triangle-right {
width: 0;
height: 0;
<div class="triangle-left"></div>
.triangle-left {
width: 0;
height: 0;
<div class="triangle-up-right"></div>
.triangle-up-right {
width: 0;
height: 0;
.triangle-up-left {
width: 0;
height: 0;
<div class="triangle-down-right"></div>
.triangle-down-right {
width: 0;
height: 0;
<div class="triangle-down-left"></div>
.triangle-down-left {
width: 0;
height: 0;
To create a circle, define an element with an equal width and height (a square) and then set the
border-radius
HTML
<div class="circle"></div>
CSS
.circle {
width: 50px;
height: 50px;
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;
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 {
width: 40px;
height: 40px;
position: relative;
text-align: center;
-ms-transform: rotate(20deg);
transform: rotate(20eg);
.burst-8::before {
content: "";
position: absolute;
top: 0;
left: 0;
height: 40px;
width: 40px;
background: rgb(246, 156, 85);
-ms-transform: rotate(135deg);
transform: rotate(135deg);
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
<div class="burst-12"></div>
.burst-12 {
width: 40px;
height: 40px;
position: relative;
text-align: center;
.burst-12::before, .burst-12::after {
content: "";
position: absolute;
top: 0;
left: 0;
height: 40px;
width: 40px;
.burst-12::before {
-ms-transform: rotate(30deg);
transform: rotate(30deg);
.burst-12::after {
-ms-transform: rotate(60deg);
transform: rotate(60deg);
To create a square, define an element with both a width and height. In the example below, we have an
element
<div class="square"></div>
.square {
width: 100px;
height: 100px;
This example shows how to create a cube using 2D transformation methods skewX() and skewY() on
pseudo
elements.
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
This example shows how to create a pyramid using borders and 2D transformation methods skewY()
and
HTML:
<div class="pyramid"></div>
CSS:
.pyramid {
width: 100px;
height: 200px;
position: relative;
margin: 50px;
.pyramid::before,.pyramid::after {
content: '';
display: inline-block;
width: 0;
height: 0;
position: absolute;
.pyramid::before {
.pyramid::after {
The CSS multi-column layout makes it easy to create multiple columns of text.
Code
<div id="multi-columns">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut 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 esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
laborum</div>
.multi-columns {
-moz-column-count: 2;
-webkit-column-count: 2;
column-count: 2;
Result
The column-width property sets the minimum column width. If column-count is not defined the
browser will make
Code:
<div id="multi-columns">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut
labore et dolore magna aliqua. Ut 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
esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
</div>
.multi-columns {
-moz-column-width: 100px;
-webkit-column-width: 100px;
column-width: 100px;
Result
CSS allows to define that element contents wrap into multiple columns with gaps and rules between
them.
Section 40.1: Create Multiple Columns
<div class="content">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim
ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl
feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui
blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla
facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil
</div>
CSS
.content {
-moz-column-count: 3; /* Firefox */
column-count: 3;
<section>
<p>Lorem ipsum dolor sit amet, 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
<p> Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem
ipsum dolor sit amet, 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 duo dolores et ea
rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
<p>Lorem ipsum dolor sit amet, 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 duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
</section>
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;
The horizontally justified navigation (menu) bar has some number of items that should be justified.
The first (left)
item has no left margin within the container, the last (right) item has no right margin within the
container. The
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
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
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.
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.
#myContainer {
color: red;
padding: 5px;
}
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>
Some properties are not automatically inherited from an element down to its' children. This is because
those
properties are typically desired to be unique to the element (or selection of elements) to which the
property is
applied to. Common such properties are margin, padding, background, display, etc.
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.
#myContainer {
color: red;
padding: 5px;
#myContainer p {
padding: inherit;
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>
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
HTML
CSS
.icon {
background: url(“icons-sprite.png”);
display: inline-block;
height: 20px;
width: 20px;
.icon1 {
.icon2 {
.icon3 {
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.
Parameter Details
clip-source A URL which can point to an inline SVG element (or) an SVG element in an external file that
basic-shape
Refers to one among inset(), circle(), ellipse() or polygon(). Using one of these
functions the clipping path is defined. These shape functions work exactly the same way as
clip-geometry-box
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 corresponding box is used as the path for clipping. When used with a
mask-reference This can be none or an image or a reference URL to a mask image source.
repeat-style This specifies how the mask should be repeated or tiled in the X and Y axes. The supported
mask-mode
Can be alpha or luminance or auto and indicates whether the mask should be treated as a
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
position
This specifies the position of each mask layer and is similar in behavior to the backgroundposition
property. The value can be provided in 1 value syntax (like top, 10%) or in 2 value
geometry-box
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) depending
on the property. The list of possible values are content-box, padding-box, border-box,
bg-size
This represents the size of each mask-image layer and has the same syntax as backgroundsize. 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.
compositing-operator
This can be any one among add, subtract, exclude, multiply per layer and defines the type
of compositing operation that should be used for this layer with those below it. Detailed
With Clipping and Masking you can make some specified parts of elements transparent or opaque.
Both can be
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
Example
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
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
An element called rectangle defined in masks.svg will be used as an luminance mask on the element.
transparent
CSS
div {
height: 200px;
width: 200px;
background: url(http://lorempixel.com/200/200/nature/1);
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.
CSS:
div{
width: 200px;
height: 200px;
background: teal;
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 <clipgeometry-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:
CSS:
div{
width:200px;
height:200px;
background:teal;
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
View Example
Output:
image
CSS
div {
width: 200px;
height: 200px;
background: url(http://lorempixel.com/200/200/abstract/6);
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.
shapes
CSS
height: 200px;
width: 400px;
background-image: url(http://lorempixel.com/400/200/nature/4);
mask-image: linear-gradient(to top right, transparent 49.5%, white 50.5%), linear-gradient(to top
mask-repeat: no-repeat;
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.
Value Description
left Insert page breaks so that the next page is formatted as a left page
right Insert page breaks so that the next page is formatted as a right page
@media print {
p{
page-break-inside: avoid;
h1 {
page-break-before: always;
h2 {
page-break-after: avoid;
}
}
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.
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:
stylesheet.insertRule("body { background-image:
The browser identifies tokens from stylesheet and coverts them into nodes which are linked into a tree
structure.
The entire map of all the nodes with their associated styles of a page would be the CSS Object Model.
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.
Parameter Details
(property: value)
Evaluates true if the browser can handle the CSS rule. The parenthesis around the rule are
required.
and Returns true only if both the previous and next conditions are true.
.my-container {
display: flex;
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)) {
/* ... */
In this example every positioned element creates its own stacking context, because of their positioning
and z-index
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">
<code>position: relative;<br/>
z-index: 5;</code>
</div>
<div id="div2">
<code>position: relative;<br/>
z-index: 2;</code>
</div>
<div id="div3">
<div id="div4">
<h1
>
<code
>position: relative;<br/>
z-index: 6;</code
>
</div
>
<h1
>
<code
>position: absolute;<br/>
z-index: 4;</code
>
<div id
="div5"
>
<h1
>
<code
>position: relative;<br/>
z-index: 1;</code
>
</div
>
<div id
="div6"
>
<h1
>
<code
>position: absolute;<br/>
z-index: 3;</code
>
</div
>
</div
>
CSS: * {
margin
html
padding
: 20px
;
font
: 12px
/20px Arial
, sans-serif
div
opacity
: 0.7
position
: relative
h1
font
: inherit
font-weight
: bold
#div1
,
#div2
border
padding
: 10px
background-color
: #cfc
#div1
z-index
margin-bottom
: 190px
#div2
{
z-index
#div3
z-index
opacity
position
: absolute
top
: 40px
left
: 180px
width
: 330px
border
background-color
: #fdd
padding
#div4
#div5 {
background-color: #ffc;
#div4 {
z-index: 6;
margin-bottom: 15px;
#div5 {
z-index: 1;
margin-top: 15px;
#div6 {
z-index: 3;
position: absolute;
top: 20px;
left: 180px;
width: 150px;
height: 125px;
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.
dierent to visible
img{
float:left;
width:100px;
margin:0 10px;
.div1{
background:#f1f1f1;
.div2{
background:#f1f1f1;
overflow:hidden;
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
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
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;
HTML:
<div class="container">
<div class="child"></div>
</div>
CSS:
.container {
height: 500px;
width: 500px;
background: white;
.child {
width: 100px;
height: 100px;
background: blue;
HTML:
<div class="wrapper">
<div class="centered">
centered
</div>
</div>
CSS:
.wrapper {
position: relative;
height: 600px;
.centered {
position: absolute;
z-index: 999;
top: 50%;
left: 50%;
HTML:
<div class="container">
<span>vertically centered</span>
</div>
CSS:
.container{
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.
HTML:
<div class="wrapper">
<img
src="http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png?
v=c78bd457575a">
</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;
HTML:
<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.
The object-fit property will defines how an element will fit into a box with an established height and
width. Usually
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
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.
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.
BEM stands for Blocks, Elements and Modifiers. It's a methodology initially conceived by Russian tech
company
Yandex, but which gained quite some traction among American & Western-European web developers
as well.
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
modifiername
Elements or blocks that have modifiers should inherit everything from the block or element it is
modifying
Code example
If you apply BEM to your form elements, your CSS selectors should look something like this:
.form { } // Block
</form>
Prefix Browser(s)
-webkit- Google Chrome, Safari, newer versions of Opera 12 and up, Android, Blackberry and UC
browsers
-o-
-khtml- Konquerer
div {
div {
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
Every browser has a default set of CSS styles that it uses for rendering elements. These default styles
may not be
consistent across browsers because: the language specifications are unclear so base styles are up for
interpretation, browsers may not follow specifications that are given, or browsers may not have
default styles for
newer HTML elements. As a result, people may want to normalize default styles across as many
browsers as
possible.
Browsers have a default set of CSS styles they use for rendering elements. Some of these styles can
even be
customised using the browser's settings to change default font face and size definitions, for example.
The styles
contain the definition of which elements are supposed to be block-level or inline, among other things.
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.
CSS resets take separate approaches to browser defaults. Eric Meyer’s Reset CSS has been around for a
while. His
approach nullifies many of the browser elements that have been known to cause problems right off
the back. The
b, u, i, center,
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
Normalize CSS on the other and deals with many of these separately. The following is a sample from
the version
/**
*/
/* 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
========================================================================== */
/**
*/
body {
margin: 0;
/**
*/
article,
aside,
footer,
header,
nav,
section {
display: block;
/**
* Correct the font size and margin on `h1` elements within `section` and
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
Normalize CSS
display: inline-block;
The display property with the value of inline-block is not supported by Internet Explorer 6 and 7. A
work-around
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
greater
In Internet Explorer 10+ and Edge, Microsoft provides the -ms-high-contrast media selector to expose
the "High
Contrast" setting from the browser, which allows the programmer to adjust their site's styles
accordingly.
The -ms-high-contrast selector has 3 states: active, black-on-white, and white-on-black. In IE10+ it also
had a
Examples
.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.
.header{
background: #000;
color: #fff;
Similar to the first example, but this specifically selects the white-on-black state only, and inverts the
header colors
More Information:
To target Internet Explorer 6 and Internet Explorer 7, start your properties with *:
.hide-on-ie6-and-ie7 {
Non-alphanumeric prefixes (other than hyphens and underscores) are ignored in IE6 and IE7, so this
hack works for
@media \0 screen {
.hide-on-ie8 {
display : none;
layout
Changing some CSS attribute will trigger the browser to synchronously calculate the style and layout,
which is a bad
DON'T
#box {
left: 0;
top: 0;
position: absolute;
width: 50px;
height: 50px;
background-color: gray;
#box.active {
left: 100px;
top: 100px;
DO
#box
left
top
0
;
position
: absolute
width
: 50px
height
: 50px
background-color
: gray
transition
: transform 0.5s
transform
: translate3d
)
;
#box.active
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 [email protected] for new content to be published or updated
A B Chapter 20
A.J Chapter 4
Aaron Chapter 4
abaracedo Chapter 4
adamboro Chapter 1
Alohci Chapter 15
Anil Chapter 4
Araknid Chapter 4
Arif Chapter 11
AVAVT Chapter 50
awe Chapter 1
bdkopen Chapter 3
Bipon Chapter 40
BiscuitBaker Chapter 7
Boris Chapter 5
Boysenb3rry Chapter 1
brandaemon Chapter 17
Casey Chapter 11
Chiller Chapter 38
CocoaBean Chapter 5
coderfin Chapter 3
CPHPython Chapter 4
csx.cc Chapter 1
cuervoo Chapter 18
DarkAjax Chapter 17
Darthstroke Chapter 5
demonofthemist Chapter 14
Diego V Chapter 6
doctorsherlock Chapter 10
Elegant.Scripting Chapter 43
Evgeny Chapter 15
Farzad YZ Chapter 6
fcalderan Chapter 5
Felix A J Chapter 15
Forty Chapter 4
fracz Chapter 4
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
HansCz Chapter 4
henry Chapter 4
Hristo Chapter 32
insertusernamehere Chapter 15
J F Chapters 4 and 20
JedaiCoder Chapter 6
Jef Chapter 16
jehna1 Chapter 6
jgh Chapter 12
JHS Chapter 25
JoelBonetR Chapter 4
kingcobra1986 Chapter 17
Kuhan Chapter 18
leo_ap Chapter 50
LiLacTac Chapter 55
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
Maxouhell Chapter 6
Mifeet Chapter 6
Miro Chapter 18
MMachinegun Chapter 54
mmativ Chapter 50
Mr_Green Chapter 8
Nate Chapter 5
o.v. Chapter 6
Pat Chapter 21
Phil Chapter 50
pixelbandito Chapter 9
Qaz Chapter 12
RamenChef Chapter 43
rdans Chapter 4
RedRiderX Chapter 37
rejnev Chapter 8
Robotnicka Chapter 20
ScientiaEtVeritas Chapters 1, 4, 6, 7, 10, 11, 18, 20, 21, 23, 26, 31, 33, 44 and 53
Siavas Chapter 6
Someone Chapter 6
srikarg Chapter 13
StefanBob Chapter 9
Stratboy Chapter 5
takeradi Chapter 16
Taylor Chapter 6
Theodore K. Chapter 22
think123 Chapter 5
Todd Chapter 1
ToniB Chapter 15
TrungDQ Chapter 56
user007 Chapter 18
user2622348 Chapter 20
vishak Chapter 14
vkopio Chapter 7
Vlusion Chapter 15
Volker E. Chapter 15
Wolfgang Chapter 18
X Chapter 18
Xinyang Li Chapter 1
xpy Chapter 4
Yury Fedorov Chapter 4
Zaffy Chapter 4
Zaz Chapter 4
Ze Rubeus Chapter 4
zeel Chapter 6
zer00ne Chapter 20
Zeta Chapter 5
Zze Chapter 5