CSSNotesForProfessionals 101 200
CSSNotesForProfessionals 101 200
The letter-spacing property is used to specify the space between the characters in a text.
p {
letter-spacing: -1px;
}
Resources: https://developer.mozilla.org/en-US/docs/Web/CSS/letter-spacing
The text-indent property specifies how much horizontal space text should be moved before the beginning of the
first line of the text content of an element.
Resources:
h1 { text-decoration: none; }
h2 { text-decoration: overline; }
h3 { text-decoration: line-through; }
h4 { text-decoration: underline; }
.title {
text-decoration-style: dotted;
text-decoration-line: underline;
text-decoration-color: blue;
}
It should be noted that the following properties are only supported in Firefox
text-decoration-color
text-decoration-line
text-decoration-style
text-decoration-skip
Possible values
CSS
HTML
<p>
<span class="normal">This is an example, showing the effect of "word-spacing".</span><br>
<span class="narrow">This is an example, showing the effect of "word-spacing".</span><br>
<span class="extensive">This is an example, showing the effect of "word-spacing".</span><br>
</p>
Online-Demo
Try it yourself
Further reading:
word-spacing – MDN
word-spacing – w3.org
normal
small-caps
Sets every letter to uppercase, but makes the lowercase letters(from original text) smaller in size than the letters
that originally uppercase.
CSS:
.smallcaps{
font-variant: small-caps;
}
HTML:
<p class="smallcaps">
Documentation about CSS Fonts
Output:
Note: The font-variant property is a shorthand for the properties: font-variant-caps, font-variant-numeric, font-
variant-alternates, font-variant-ligatures, and font-variant-east-asian.
CSS
.aligner {
display: flex;
align-items: center;
justify-content: center;
}
.aligner-item {
max-width: 50%; /*for demo. Use actual width instead.*/
}
Here is a demo.
Reasoning
Property Value Description
This centers the elements along the axis other than the one specified by flex-direction,
align-items center i.e., vertical centering for a horizontal flexbox and horizontal centering for a vertical
flexbox.
This centers the elements along the axis specified by flex-direction. I.e., for a
justify-content center horizontal (flex-direction: row) flexbox, this centers horizontally, and for a vertical
flexbox (flex-direction: column) flexbox, this centers vertically)
All of the below styles are applied onto this simple layout:
<div id="container">
<div></div>
<div></div>
<div></div>
</div>
CSS:
Outcome:
Here is a demo.
CSS:
div#container {
display: flex;
flex-direction: column;
justify-content: center;
}
Outcome:
CSS:
div#container {
display: flex;
flex-direction: row;
align-items: center;
}
Outcome:
CSS:
div#container {
display: flex;
flex-direction: column;
align-items: center;
}
Outcome:
Outcome:
Outcome:
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
himenaeos. Curabitur sodales ligula in libero. </p>
</div>
<div class="footer">
CSS:
html, body {
height: 100%;
}
body {
display: flex;
flex-direction: column;
}
.content {
/* Include `0 auto` for best browser compatibility. */
flex: 1 0 auto;
}
.header, .footer {
background-color: grey;
color: white;
flex: none;
}
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:
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
HTML
First of all, we use CSS to apply display: flex; to the container. This will create 2 columns equal in height with the
content flowing naturally inside it
CSS
.cards {
display: flex;
}
.card {
border: 1px solid #ccc;
margin: 10px 10px;
padding: 0 20px;
}
button {
height: 40px;
background: #fff;
padding: 0 40px;
border: 1px solid #000;
}
p:last-child {
text-align: center;
}
Final CSS:
.cards {
display: flex;
}
.card {
border: 1px solid #ccc;
margin: 10px 10px;
padding: 0 20px;
display: flex;
flex-direction: column;
}
button {
height: 40px;
background: #fff;
padding: 0 40px;
border: 1px solid #000;
}
p:last-child {
text-align: center;
margin-top: auto;
}
This effect is achieved due to the property align-items being set to stretch by default.
HTML
<div class="container">
<div style="background-color: red">
Some <br />
data <br />
to make<br />
CSS
.container {
display: flex;
align-items: stretch; // Default value
}
The universal selector (*) and combinators (like > and ~) have no specificity.
#foo {
color: blue;
}
Here we have an ID selector which declares color as blue, and a class selector which declares color as red and
background as black.
An element with an ID of #foo and a class of .bar will be selected by both declarations. ID selectors have a Group A
specificity and class selectors have a Group B specificity. An ID selector outweighs any number of class selectors.
Because of this, color:blue; from the #foo selector and the background:black; from the .bar selector will be
applied to the element. The higher specificity of the ID selector will cause the browser to ignore the .bar selector's
color declaration.
.bar {
color: red;
background: black;
}
.baz {
background: white;
}
Here we have two class selectors; one of which declares color as red and background as black, and the other
declares background as white.
An element with both the .bar and .baz classes will be affected by both of these declarations, however the
problem we have now is that both .bar and .baz have an identical Group B specificity. The cascading nature of CSS
resolves this for us: as .baz is defined after .bar, our element ends up with the red color from .bar but the white
background from .baz.
The last snippet from Example 2 above can be manipulated to ensure our .bar class selector's color declaration is
used instead of that of the .baz class selector.
The most common way to achieve this would be to find out what other selectors can be applied to the .bar selector
sequence. For example, if the .bar class was only ever applied to span elements, we could modify the .bar selector
to span.bar. This would give it a new Group C specificity, which would override the .baz selector's lack thereof:
However it may not always possible to find another common selector which is shared between any element which
uses the .bar class. Because of this, CSS allows us to duplicate selectors to increase specificity. Instead of just .bar,
we can use .bar.bar instead (See The grammar of Selectors, W3C Recommendation). This still selects any element
with a class of .bar, but now has double the Group B specificity:
The !important flag on a style declaration and styles declared by the HTML style attribute are considered to have
a greater specificity than any selector. If these exist, the style declaration they affect will overrule other declarations
regardless of their specificity. That is, unless you have more than one declaration that contains an !important flag
for the same property that apply to the same element. Then, normal specificity rules will apply to those properties
in reference to each other.
Because they completely override specificity, the use of !important is frowned upon in most use cases. One should
use it as little as possible. To keep CSS code efficient and maintainable in the long run, it's almost always better to
increase the specificity of the surrounding selector than to use !important.
One of those rare exceptions where !important is not frowned upon, is when implementing generic helper classes
like a .hidden or .background-yellow class that are supposed to always override one or more properties wherever
they are encountered. And even then, you need to know what you're doing. The last thing you want, when writing
maintainable CSS, is to have !important flags throughout your CSS.
A final note
A common misconception about CSS specificity is that the Group A, B and c values should be combined with each
other (a=1, b=5, c=1 => 151). This is not the case. If this were the case, having 20 of a Group B or c selector would
be enough to override a single Group A or B selector respectively. The three groups should be regarded as
individual levels of specificity. Specificity cannot be represented by a single value.
When creating your CSS style sheet, you should maintain the lowest specificity as possible. If you need to make the
specificity a little higher to overwrite another method, make it higher but as low as possible to make it higher. You
shouldn't need to have a selector like this:
This makes future changes harder and pollutes that css page.
#mydiv {
font-weight: bold !important; /* This property won't be overridden
by the rule below */
}
#outerdiv #mydiv {
font-weight: normal; /* #mydiv font-weight won't be set to normal
even if it has a higher specificity because
of the !important declaration above */
}
Avoiding the usage of !important is strongly recommended (unless absolutely necessary), because it will disturb
the natural flow of css rules which can bring uncertainty in your style sheet. Also it is important to note that when
multiple !important declarations are applied to the same rule on a certain element, the one with the higher
specificity will be the ona applied.
If your rules shouldn't be overridden by any inline style of the element which is written inside style attribute
of the html element.
To give the user more control over the web accessibility, like increasing or decreasing size of the font-size, by
overriding the author style using !important.
For testing and debugging using inspect element.
See also:
W3C - 6 Assigning property values, Cascading, and Inheritance -- 6.4.2 !important rules
The browser will lookup the corresponding style(s) when rendering an element.
When only one CSS rule set is trying to set a style for an element, then there is no conflict, and that rule set is used.
When multiple rule sets are found with conflicting settings, first the Specificty rules, and then the Cascading rules
are used to determine what style to use.
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 {
<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">
<div class="mystyle">Hello World</div>
</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
#elmnt1 {
font-size: 24px;
border-color: red;
}
<body class="mystyle">
<div id="elmnt1" class="myotherstyle">
Hello, world!
</div>
</body>
font-size:
font-size: 24;, since #elmnt1 rule set has the highest specificity for the <div> in question, every
property here is set.
border:
border: 3px dotted red;. The border-color red is taken from #elmnt1 rule set, since it has the highest
specificity. The other properties of the border, border-thickness, and border-style are from the div rule
set.
background-color:
background-color: green;. The background-color is set in the div, body.mystyle > div.myotherstyle,
and .mystyle .myotherstyle rule sets. The specificities are (0, 0, 1) vs. (0, 2, 2) vs. (0, 2, 0), so the middle
one "wins".
color:
color: red;. The color is set in both the div and .mystyle .myotherstyle rule sets. The latter has the
higher specificity of (0, 2, 0) and "wins".
Here currentColor evaluates to red since the color property is set to red:
div {
color: red;
border: 5px solid currentColor;
box-shadow: 0 0 5px currentColor;
}
In this case, specifying currentColor for the border is most likely redundant because omitting it should produce
identical results. Only use currentColor inside the border property within the same element if it would be
overwritten otherwise due to a more specific selector.
Since it's the computed color, the border will be green in the following example due to the second rule overriding
the first:
div {
color: blue;
border: 3px solid currentColor;
color: green;
}
The parent's color is inherited, here currentColor evaluates to 'blue', making the child element's border-color blue.
.parent-class {
color: blue;
}
.parent-class .child-class {
border-color: currentColor;
}
currentColor can also be used by other rules which normally would not inherit from the color property, such as
background-color. The example below shows the children using the color set in the parent as its background:
.parent-class {
color: blue;
}
.parent-class .child-class {
background-color: currentColor;
}
Possible Result:
.some-class {
color: blue;
}
CSS keywords are not case sensitive—blue, Blue and BLUE will all result in #0000FF.
Color Keywords
Color name Hex value RGB values Color
AliceBlue #F0F8FF rgb(240,248,255)
In addition to the named colors, there is also the keyword transparent, which represents a fully-transparent black:
rgba(0,0,0,0)
CSS colors may also be represented as a hex triplet, where the members represent the red, green and blue
components of a color. Each of these values represents a number in the range of 00 to FF, or 0 to 255 in decimal
notation. Uppercase and/or lowercase Hexadecimal values may be used (i.e. #3fc = #3FC = #33ffCC). The browser
interprets #369 as #336699. If that is not what you intended but rather wanted #306090, you need to specify that
explicitly.
The total number of colors that can be represented with hex notation is 256 ^ 3 or 16,777,216.
Syntax
color: #rrggbb;
color: #rgb
Value Description
rr 00 - FF for the amount of red
gg 00 - FF for the amount of green
bb 00 - FF for the amount of blue
.some-class {
/* This is equivalent to using the color keyword 'blue' */
color: #0000FF;
}
.also-blue {
/* If you want to specify each range value with a single number, you can!
This is equivalent to '#0000FF' (and 'blue') */
color: #00F;
}
Hexadecimal notation is used to specify color values in the RGB color format, per the W3C's 'Numerical color
values'.
There are a lot of tools available on the Internet for looking up hexadecimal (or simply hex) color values.
Search for "hex color palette" or "hex color picker" with your favorite web browser to find a bunch of options!
Hex values always start with a pound sign (#), are up to six "digits" long, and are case-insensitive: that is, they don't
care about capitalization. #FFC125 and #ffc125 are the same color.
.some-class {
/* Scalar RGB, equivalent to 'blue'*/
color: rgb(0, 0, 255);
}
.also-blue {
/* Percentile RGB values*/
color: rgb(0%, 0%, 100%);
}
.red {
/* Opaque red */
color: rgba(255, 0, 0, 1);
}
.red-50p {
/* Half-translucent red. */
color: rgba(255, 0, 0, .5);
}
Syntax
rgba(<red>, <green>, <blue>, <alpha>);
Value Description
<red> an integer from 0 - 255 or percentage from 0 - 100%
<green> an integer from 0 - 255 or percentage from 0 - 100%
<blue> an integer from 0 - 255 or percentage from 0 - 100%
<alpha> a number from 0 - 1, where 0.0 is fully transparent and 1.0 is fully opaque
Hue is represented as an angle from 0° to 360° (without units), while saturation and lightness are represented as
percentages.
p {
color: hsl(240, 100%, 50%); /* Blue */
}
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
Example Usage
<div style="opacity:0.8;">
This is a partially transparent element
</div>
Property Value Transparency
opacity: 1.0; Opaque
opacity: 0.75; 25% transparent (75% Opaque)
opacity: 0.5; 50% transparent (50% Opaque)
opacity: 0.25; 75% transparent (25% Opaque)
opacity: 0.0; Transparent
.transparent-element {
/* for IE 8 & 9 */
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; // IE8
/* works in IE 8 & 9 too, but also 5, 6, 7 */
filter: alpha(opacity=60); // IE 5-7
/* Modern Browsers */
opacity: 0.6;
}
A CSS distance measurement is a number immediately followed by a length unit (px, em, pc, in, …)
CSS supports a number of length measurements units. They are absolute or relative.
You can use rem defined by the font-size of your html tag to style elements by setting their font-size to a value of
rem and use em inside the element to create elements that scale with your global font-size.
HTML:
Relevant CSS:
html {
font-size: 16px;
}
input[type="button"] {
font-size: 1rem;
padding: 0.5em 2em;
}
input[type="range"] {
font-size: 1rem;
input[type=text] {
font-size: 1rem;
padding: 0.5em;
}
Possible Result:
em: Relative to the font size of the parent. This causes the compounding issue
rem: Relative to the font size of the root or <html> element. This means it's possible to declare a single font
size for the html element and define all rem units to be a percentage of that.
The main issue with using rem for font sizing is that the values are somewhat difficult to use. Here is an example of
some common font sizes expressed in rem units, assuming that the base size is 16px :
10px = 0.625rem
12px = 0.75rem
14px = 0.875rem
16px = 1rem (base)
18px = 1.125rem
20px = 1.25rem
24px = 1.5rem
30px = 1.875rem
32px = 2rem
CODE:
Version ≥ 3
html {
font-size: 16px;
}
p {
font-size: 1rem; /* 16px */
}
li {
font-size: 1.5em; /* 24px */
}
vh, which stands for viewport height is relative to 1% of the viewport height
vw, which stands for viewport width is relative to 1% of the viewport width
Version ≥ 3
div {
width: 20vw;
height: 20vh;
}
Above, the size for the div takes up 20% of the width and height of the viewport
Equation:
For Example:
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-elements, just like pseudo-classes, are added to a CSS selectors but instead of describing a special state,
they allow you to scope and style certain parts of an html element.
For example, the ::first-letter pseudo-element targets only the first letter of a block element specified by the
selector.
The content attribute is required for pseudo-elements to render; however, the attribute can have an empty value
(e.g. content: "").
div::after {
content: 'after';
color: red;
border: 1px solid red;
}
div {
color: black;
border: 1px solid black;
padding: 1px;
}
div::before {
content: 'before';
color: green;
border: 1px solid green;
}
ul {
list-style-type: none;
}
Then you add the custom styling. In this example, we will create gradient boxes for bullets.
li:before {
content: "";
display: inline-block;
margin-right: 10px;
height: 10px;
width: 10px;
background: linear-gradient(red, blue);
}
HTML
<ul>
<li>Test I</li>
<li>Test II</li>
</ul>
Result
The higher the z-index, the higher up in the stacking context (on the z-axis) it is placed.
Example
In the example below, a z-index value of 3 puts green on top, a z-index of 2 puts red just under it, and a z-index of 1
puts blue under that.
HTML
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
CSS
div {
position: absolute;
height: 200px;
width: 200px;
}
div#div1 {
z-index: 1;
left: 0px;
top: 0px;
background-color: blue;
}
div#div2 {
z-index: 3;
left: 100px;
top: 100px;
background-color: green;
}
div#div3 {
z-index: 2;
left: 50px;
Syntax
z-index: [ number ] | auto;
Parameter Details
An integer value. A higher number is higher on the z-index stack. 0 is the default value. Negative
number
values are allowed.
auto Gives the element the same stacking context as its parent. (Default)
Remarks
All elements are laid out in a 3D axis in CSS, including a depth axis, measured by the z-index property. z-index
only works on positioned elements: (see: Why does z-index need a defined position to work?). The only value where
it is ignored is the default value, static.
Read about the z-index property and Stacking Contexts in the CSS Specification on layered presentation and at the
Mozilla Developer Network.
1. top
2. left
3. right
specify the element should appear in relation to its next non-static containing element.
.abspos{
position:absolute;
top:0px;
left:500px;
}
This code will move the box containing element with attribute class="abspos" down 0px and right 500px relative to
its containing element.
#stickyDiv {
position:fixed;
top:10px;
left:10px;
}
1. top
2. left
3. right
4. bottom
are used to indicate how far to move the element from where it would have been in normal flow.
.relpos{
position:relative;
top:20px;
left:30px;
}
This code will move the box containing element with attribute class="relpos" 20px down and 30px to the right from
where it would have been in normal flow.
This keyword lets the element use the normal behavior, that is it is laid out in its current position in the
flow. The top, right, bottom, left and z-index properties do not apply.
.element{
position:static;
Inline
An inline element occupies only as much width as necessary. It stacks horizontally with other elements of the
same type and may not contain other non-inline elements.
As demonstrated above, two inline elements, <span> and <b>, are in-line (hence the name) and do not break the
flow of the text.
Block
A block element occupies the maximum available width of its' parent element. It starts with a new line and, in
contrast to inline elements, it does not restrict the type of elements it may contain.
The div element is block-level by default, and as shown above, the two block elements are vertically stacked and,
unlike the inline elements, the flow of the text breaks.
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.
border-width:2px;
border-color:black;
border-style:solid;
}
</style>
<ul>
<li>First Element </li>
<li>Second Element </li>
<li>Third Element </li>
</ul>
border-width:2px;
border-color:black;
border-style:solid;
}
</style>
<ul>
<li>First Element </li>
<li>Second Element </li>
<li>Third Element </li>
</ul>
border-width:2px;
border-color:black;
border-style:solid;
}
</style>
<ul>
<li>First Element </li>
<li>Second Element </li>
<li>Third Element </li>
</ul>
none
An element that is given the none value to its display property will not be displayed at all.
<div id="myDiv"></div>
This can now be marked as not being displayed by the following CSS rule:
#myDiv {
display: none;
}
When an element has been set to be display:none; the browser ignores every other layout property for that
specific element (both position and float). No box will be rendered for that element and its existence in html does
not affect the position of following elements.
Note that this is different from setting the visibility property to hidden. Setting visibility: hidden; for an
element would not display the element on the page but the element would still take up the space in the rendering
process as if it would be visible. This will therefore affect how following elements are displayed on the page.
The none value for the display property is commonly used along with JavaScript to show or hide elements at will,
eliminating the need to actually delete and re-create them.
<style>
table {
width: 100%;
}
<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">
I behave like a table now
</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;
grid-columns: 50px 50px 50px;
grid-rows: 50px 50px;
}
However, that still doesn't help us much because we need to give an order to each child element. We can do this by
specifying the grid-row and grid-column values which will tell it where it sits in the grid:
.container .item1 {
grid-column: 1;
grid-row: 1;
}
.container .item2 {
grid-column: 2;
grid-row: 1;
}
.container .item3 {
grid-column: 1;
grid-row: 2;
}
.container .item4 {
grid-column: 2;
By giving each item a column and row value it identifies the items order within the container.
View a working example on JSFiddle. You'll need to view this in IE10, IE11 or Edge for it to work as these are
currently the only browsers supporting Grid Layout (with vendor prefix -ms-) or enable a flag in Chrome, Opera and
Firefox according to caniuse in order to test with them.
The table on the left has table-layout: auto while the one on the right has table-layout: fixed. The former is
wider than the specified width (210px instead of 150px) but the contents fit. The latter takes the defined width of
150px, regardless if the contents overflow or not.
Value Description
auto This is the default value. It defines the layout of the table to be determined by the contents of its' cells.
This value sets the table layout to be determined by the width property provided to the table. If the content
fixed
of a cell exceeds this width, the cell will not resize but instead, let the content overflow.
Below an example with two tables with different values set to the empty-cells property:
The table on the left has empty-cells: show while the one on the right has empty-cells: hide. The former does
display the empty cells whereas the latter does not.
Value Description
show This is the default value. It shows cells even if they are empty.
hide This value hides a cell altogether if there are no contents in the cell.
More Information:
https://www.w3.org/TR/CSS21/tables.html#empty-cells
https://developer.mozilla.org/en-US/docs/Web/CSS/empty-cells
http://codepen.io/SitePoint/pen/yfhtq
https://css-tricks.com/almanac/properties/e/empty-cells/
The table on the left has border-collapse: separate while the one on the right has border-collapse: collapse.
Value Description
separate This is the default value. It makes the borders of the table separate from each other.
collapse This value sets the borders of the table to merge together, rather than being distinct.
Below an example of two tables with different values to the border-spacing property:
The table on the left has border-spacing: 2px (default) while the one on the right has border-spacing: 8px.
Value Description
<length> This is the default behavior, though the exact value can vary between browsers.
<length> <length> This syntax allows specifying separate horizontal and vertical values respectively.
Below an example with two tables with different values set to the caption-side property:
The table on the left has caption-side: top while the one on the right has caption-side: bottom.
Value Description
top This is the default value. It places the caption above the table.
bottom This value places the caption below the table.
div{
width: 150px;
height:150px;
background-color: red;
transition: background-color 1s;
}
div:hover{
background-color: green;
}
HTML
<div></div>
This example will change the background color when the div is hovered the background-color change will last 1
second.
For CSS Bézier Curves, P0 and P3 are always in the same spot. P0 is at (0,0) and P3 is at (1,1), which menas that the
parameters passed to the cubic-bezier function can only be between 0 and 1.
If you pass parameters which aren't in this interval the function will default to a linear transition.
Since cubic-bezier is the most flexible transition in CSS, you can translate all other transition timing function to
cubic-bezier functions:
linear: cubic-bezier(0,0,1,1)
HTML
<div></div>
transition-property: Specifies the CSS properties the transition effect is for. In this case, the div will expand
both horizontally and vertically when hovered.
transition-duration: Specifies the length of time a transition takes to complete. In the above example, the
height and width transitions will take 1 second and 500 milliseconds respectively.
transition-timing-function: Specifies the speed curve of the transition effect. A linear value indicates the
transition will have the same speed from start to finish.
transition-delay: Specifies the amount of time needed to wait before the transition effect starts. In this case,
the height will start transitioning immediately, whereas the width will wait 1 second.
@keyframes
You can either specify a set time with a percentage value, or two percentage values, ie
[ from | to | <percentage> ]
10%, 20%, for a period of time where the keyframe's set attributes are set.
block Any amount of CSS attributes for the keyframe.
Basic Example
In this example, we'll make a basic background animation that cycles between all colors.
@keyframes rainbow-background {
0% { background-color: #ff0000; }
8.333% { background-color: #ff8000; }
16.667% { background-color: #ffff00; }
25.000% { background-color: #80ff00; }
33.333% { background-color: #00ff00; }
41.667% { background-color: #00ff80; }
50.000% { background-color: #00ffff; }
58.333% { background-color: #0080ff; }
66.667% { background-color: #0000ff; }
75.000% { background-color: #8000ff; }
83.333% { background-color: #ff00ff; }
91.667% { background-color: #ff0080; }
100.00% { background-color: #ff0000; }
}
.RainbowBackground {
animation: rainbow-background 5s infinite;
}
View Result
There's a few different things to note here. First, the actual @keyframes syntax.
@keyframes rainbow-background{
This is the definition for a keyframe within the animation. The first part, the 0% in the case, defines where the
keyframe is during the animation. The 0% implies it is 0% of the total animation time from the beginning.
The animation will automatically transition between keyframes. So, by setting the next background color at 8.333%,
the animation will smoothly take 8.333% of the time to transition between those keyframes.
.RainbowBackground {
animation: rainbow-background 5s infinite;
}
This code attaches our animation to all elements which have the .RainbowBackground class.
In this particular example, both the 0% and 100% keyframes specify { background-color: #ff0000; }. Wherever
two or more keyframes share a state, one may specify them in a single statement. In this case, the two 0% and 100%
lines could be replaced with this single line:
Cross-browser compatibility
For older WebKit-based browsers, you'll need to use the vendor prefix on both the @keyframes declaration and the
animation property, like so:
@-webkit-keyframes{}
-webkit-animation: ...
Example
.Example{
height: 100px;
background: #fff;
}
.Example:hover{
height: 120px;
View Result
By default, hovering over an element with the .Example class would immediately cause the element's height to
jump to 120px and its background color to red (#ff0000).
By adding the transition property, we can cause these changes to occur over time:
.Example{
...
transition: all 400ms ease;
}
View Result
The all value applies the transition to all compatible (numbers-based) properties. Any compatible property name
(such as height or top) can be substituted for this keyword.
400ms specifies the amount of time the transition takes. In this case, the element's change in height will take 400
milliseconds to complete.
Finally, the value ease is the animation function, which determines how the animation is played. ease means start
slow, speed up, then end slow again. Other values are linear, ease-out, and ease-in.
Cross-Browser Compatibility
The transition property is generally well-supported across all major browsers, excepting IE 9. For earlier versions
of Firefox and Webkit-based browsers, use vendor prefixes like so:
.Example{
transition: all 400ms ease;
-moz-transition: all 400ms ease;
-webkit-transition: all 400ms ease;
}
Note: The transition property can animate changes between any two numerical values, regardless of unit. It can
also transition between units, such as 100px to 50vh. However, it cannot transition between a number and a default
or automatic value, such as transitioning an element's height from 100px to auto.
Our second example is a little more simple, and shows that some properties can be omitted:
animation: 3s slidein;
/* duration | name */
It's also worth mentioning that when using the animation shorthand the order of the properties makes a difference.
Obviously the browser may confuse your duration with your delay.
If brevity isn't your thing, you can also skip the shorthand property and write out each property individually:
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;
Both CSS keyframes and the transition property use GPU acceleration. Performance is increased by offloading
calculations to the device's GPU. This is done by creating paint layers (parts of the page that are individually
rendered) that are offloaded to the GPU to be calculated. The will-change property tells the browser what will
animate, allowing the browser to create smaller paint areas, thus increasing performance.
The will-change property accepts a comma-separated list of properties to be animated. For example, if you plan
on transforming an object and changing its opacity, you would specify:
.Example{
...
will-change: transform, opacity;
}
Note: Use will-change sparingly. Setting will-change for every element on a page can cause performance
problems, as the browser may attempt to create paint layers for every element, significantly increasing the amount
of processing done by the GPU.
<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.
<div class="scale"></div>
CSS
.scale {
width: 100px;
height: 100px;
background: teal;
transform: scale(0.5, 1.3);
}
This example will scale the div to 100px * 0.5 = 50px on the X axis and to 100px * 1.3 = 130px on the Y axis.
The center of the transform is in the center of the div, 50% from left and 50% from top.
<div class="skew"></div>
CSS
.skew {
width: 100px;
height: 100px;
background: teal;
transform: skew(20deg, -30deg);
}
This example will skew the div by 20 degrees on the X axis and by - 30 degrees on the Y axis.
The center of the transform is in the center of the div, 50% from left and 50% from top.
This will rotate the element 15 degrees clockwise and then translate it 200px to the right.
In chained transforms, the coordinate system moves with the element. This means that the translation won't be
horizontal but on an axis rotate 15 degrees clockwise as shown in the following image:
<div class="transform"></div>
.transform {
transform: rotate(15deg) translateX(200px);
}
<div class="translate"></div>
CSS
.translate {
width: 100px;
height: 100px;
background: teal;
transform: translate(200px, 50%);
This example will move the div by 200px on the X axis and by 100px * 50% = 50px on the Y axis.
On the X axis:
.translate {
transform: translateX(200px);
}
On the Y axis:
.translate {
transform: translateY(50%);
}
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;
transition: transform 1s;
}
.origin1 {
transform-origin: 0 0;
}
.origin2 {
transform-origin: 100% 0;
}
.transform:hover {
transform: rotate(30deg);
}
The default value for the transform-origin property is 50% 50% which is the center of the element.
HTML
<div class='needle'></div>
In the above example, a needle or compass pointer shape is created using 3D transforms. Generally when we apply
the rotate transform on an element, the rotation happens only in the Z-axis and at best we will end up with
diamond shapes only. But when a rotateY transform is added on top of it, the element gets squeezed in the Y-axis
and thus ends up looking like a needle. The more the rotation of the Y-axis the more squeezed the element looks.
The output of the above example would be a needle resting on its tip. For creating a needle that is resting on its
base, the rotation should be along the X-axis instead of along Y-axis. So the transform property's value would have
to be something like rotateX(85deg) rotateZ(45deg);.
This pen uses a similar approach to create something that resembles the Safari logo or a compass dial.
<div id="title">
<h1 data-content="HOVER">HOVER</h1>
</div>
CSS:
*{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;
font-family: 'Open Sans', sans-serif;
color:rgba(0,0,0,0.8);
line-height:1em;
transform:rotateY(50deg);
perspective:150px;
perspective-origin:0% 50%;
In this example, the text is transformed to make it look like it is going into the screen away from the user.
The shadow is transformed accordingly so it follows the text. As it is made with a pseudo element and the data
attribute, it inherits the transforms form it's parent (the H1 tag).
The white "light" is made with a pseudo element on the #title element. It is skewed and uses border-radius for the
rounded corner.
With 3D transforms and the backface-visibility property, you're able to rotate an element such that the original
front of an element no longer faces the screen.
JSFIDDLE
.flip {
-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
4. initial - sets the property to its default, which is visible
HTML:
<div class="cube">
<div class="cubeFace"></div>
<div class="cubeFace face2"></div>
</div>
CSS:
body {
perspective-origin: 50% 100%;
perspective: 1500px;
overflow: hidden;
}
.cube {
position: relative;
padding-bottom: 20%;
transform-style: preserve-3d;
transform-origin: 50% 100%;
transform: rotateY(45deg) rotateX(0);
}
.cubeFace {
CSS
img {
-webkit-filter: blur(1px);
filter: blur(1px);
}
Result
CSS
p {
-webkit-filter: drop-shadow(10px 10px 1px green);
filter: drop-shadow(10px 10px 1px green);
}
Result
CSS
img {
-webkit-filter: hue-rotate(120deg);
filter: hue-rotate(120deg);
}
Result
HTML
CSS
img {
-webkit-filter: brightness(200%) grayscale(100%) sepia(100%) invert(100%);
filter: brightness(200%) grayscale(100%) sepia(100%) invert(100%);
}
Result
<div></div>
CSS
div {
width: 100px;
height: 100px;
background-color: white;
-webkit-filter: invert(100%);
filter: invert(100%);
}
Result
Examples:
Value Description
none No cursor is rendered for the element
auto Default. The browser sets a cursor
help The cursor indicates that help is available
wait The cursor indicates that the program is busy
move The cursor indicates something is to be moved
pointer The cursor is a pointer and indicates a link
.disabled {
pointer-events: none;
}
In this example,
'none' prevents all click, state and cursor options on the specified HTML element [[1]]
auto;
inherit.
1. https://css-tricks.com/almanac/properties/p/pointer-events/
Other resources:
https://davidwalsh.name/pointer-events
HTML
CSS
#example {
caret-color: red;
}
Resources:
https://developer.mozilla.org/en-US/docs/Web/CSS/caret-color
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
background-color: #1C90F3;
width: 200px;
height: 100px;
margin: 50px;
}
.box_shadow:after {
content: "";
width: 190px;
height: 1px;
margin-top: 98px;
margin-left: 5px;
display: block;
position: absolute;
z-index: -1;
-webkit-box-shadow: 0px 0px 8px 2px #444444;
-moz-box-shadow: 0px 0px 8px 2px #444444;
box-shadow: 0px 0px 8px 2px #444444;
}
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
-webkit-box-shadow: 0px 0px 10px -1px #444444;
-moz-box-shadow: 0px 0px 10px -1px #444444;
box-shadow: 0px 0px 10px -1px #444444;
}
<div class="box_shadow"></div>
CSS
.box_shadow {
background-color: #1C90F3;
width: 200px;
height: 100px;
margin: 50px;
-webkit-box-shadow: inset 0px 0px 10px 0px #444444;
-moz-box-shadow: inset 0px 0px 10px 0px #444444;
box-shadow: inset 0px 0px 10px 0px #444444;
}
Result:
HTML
<div class="box_shadow"></div>
CSS
.box_shadow {
width: 100px;
height: 100px;
margin: 100px;
box-shadow:
-52px -52px 0px 0px #f65314,
52px -52px 0px 0px #7cbb00,
-52px 52px 0px 0px #00a1f1,
52px 52px 0px 0px #ffbb00;
}
CSS
img:nth-of-type(1) {
shape-outside: circle(80px at 50% 50%);
float: left;
width: 200px;
}
img:nth-of-type(2) {
shape-outside: circle(80px at 50% 50%);
float: right;
width: 200px;
}
p {
text-align: center;
line-height: 30px; /* purely for demo */
}
HTML
<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 the above example, both the images are actually square images and when the text is placed without the shape-
outside property, it will not flow around the circle on either side. It will flow around the containing box of the image
only. With shape-outside the float area is re-defined as a circle and the content is made to flow around this
imaginary circle that is created using shape-outside.
The imaginary circle that is used to re-define the float area is a circle with radius of 80px drawn from the center-mid
point of the image's reference box.
Below are a couple of screenshots to illustrate how the content would be wrapped around when shape-outside is
used and when it is not used.
CSS
img:nth-of-type(1) {
shape-outside: circle(80px at 50% 50%);
shape-margin: 10px;
float: left;
width: 200px;
}
img:nth-of-type(2) {
shape-outside: circle(80px at 50% 50%);
shape-margin: 10px;
float: right;
width: 200px;
}
p {
text-align: center;
line-height: 30px; /* purely for demo */
}
HTML
<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:
Each list item gets a 'marker box', which contains the bullet marker. This box can either be placed inside or outside
of the list item box.
list-style-position: inside;
places the bullet within the <li> element, pushing the content to the right as needed.
list-style-position: outside;
places the bullet left of the <li> element. If there is not enough space in the padding of the containing element, the
marker box will extend to the left even if it would fall off the page.
<ul>
<li>first item</li>
<li>second item</li>
</ul>
CSS
ul {
list-style-type: none;
}
li {
margin: 0;
padding: 0;
}
Non-specific:
.item {
counter-increment: item-counter;
}
.item:before {
content: counter(item-counter, upper-roman) ". "; /* by specifying the upper-roman as style the
output would be in roman numbers */
}
HTML
<div class='item'>Item No: 1</div>
<div class='item'>Item No: 2</div>
<div class='item'>Item No: 3</div>
In the above example, the counter's output would be displayed as I, II, III (roman numbers) instead of the usual 1, 2,
3 as the developer has explicitly specified the counter's style.
.item {
border: 1px solid;
height: 100px;
margin-bottom: 10px;
}
.item-header {
border-bottom: 1px solid;
height: 40px;
line-height: 40px;
padding: 5px;
}
.item-content {
padding: 8px;
}
HTML
<div class='item'>
<div class='item-header'>Item 1 Header</div>
<div class='item-content'>Lorem Ipsum Dolor Sit Amet....</div>
</div>
<div class='item'>
<div class='item-header'>Item 2 Header</div>
<div class='item-content'>Lorem Ipsum Dolor Sit Amet....</div>
</div>
<div class='item'>
<div class='item-header'>Item 3 Header</div>
<div class='item-content'>Lorem Ipsum Dolor Sit Amet....</div>
</div>
The above example numbers every "item" in the page and adds the item's number before its header (using content
property of .item-header element's :before pseudo). A live demo of this code is available here.
HTML
<ul>
<li>Level 1
<ul>
<li>Level 1.1
<ul>
<li>Level 1.1.1</li>
</ul>
</li>
</ul>
The above is an example of multi-level numbering using CSS counters. It makes use of the self-nesting concept of
counters. Self nesting is a concept where if an element already has a counter with the given name but is having to
create another then it creates it as a child of the existing counter. Here, the second level ul already inherits the
list-item-number counter from its parent but then has to create its own list-item-number (for its children li) and
so creates list-item-number[1] (counter for second level) and nests it under list-item-number[0] (counter for
first level). Thus it achieves the multi-level numbering.
The output is printed using the counters() function instead of the counter() function because the counters()
function is designed to prefix the value of all higher level counters (parent) when printing the output.
It is especially useful when working with different types of units (e.g. subtracting a px value from a percentage) to
calculate the value of an attribute.
+, -, /, and * operators can all be used, and parentheses can be added to specify the order of operations if
necessary.
#div1 {
position: absolute;
left: 50px;
width: calc(100% - 100px);
border: 1px solid black;
background-color: yellow;
padding: 5px;
text-align: center;
}
Below is a blockquote element which contains a character inside a data-* attribute which CSS can use (e.g. inside
the ::before and ::after pseudo-element) using this function.
<blockquote data-mark='"'></blockquote>
In the following CSS block, the character is appended before and after the text inside the element:
blockquote[data-mark]::before,
blockquote[data-mark]::after {
content: attr(data-mark);
}
/* set a variable */
:root {
/* access variable */
selector {
color: var(--primary-color);
}
This feature is currently under development. Check caniuse.com for the latest browser support.
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.
For example, it's common in CSS to reuse a single color throughout a document. Prior to CSS Variables this would
mean reusing the same color value many times throughout a document. With CSS Variables the color value can be
assigned to a variable and referenced in multiple places. This makes changing values easier and is more semantic
than using traditional CSS values.
You can define variables multiple times and only the definition with the highest specificity will apply to the element
selected.
.button {
--color: green;
padding: .5rem;
border: 1px solid var(--color);
color: var(--color);
}
.button_red {
--color: red;
}
Empty Vs Space
/* Invalid */
--color:;
/* Valid */
--color: ; /* space is assigned */
Concatenations
/* Invalid */
--width: 10;
width: var(--width)px;
/* Valid */
--width: 10px;
width: var(--width);
/* Valid */
--width: 10;
width: calc(1px * var(--width)); /* multiply by 1 unit to convert */
width: calc(1em * var(--width));
Here, a media query changes the variables used to set up a very simple grid:
HTML
<div></div>
<div></div>
<div></div>
<div></div>
CSS
:root{
--width: 25%;
--content: 'This is desktop';
}
@media only screen and (max-width: 767px){
:root{
--width:50%;
--content: 'This is mobile';
}
}
@media only screen and (max-width: 480px){
:root{
--width:100%;
}
}
div{
width: calc(var(--width) - 20px);
height: 100px;
}
div:before{
content: var(--content);
/* Other Styles */
body {
padding: 10px;
}
div{
display: flex;
align-items: center;
justify-content: center;
font-weight:bold;
float:left;
margin: 10px;
border: 4px solid black;
background: red;
}
HTML:
<div class="trapezoid"></div>
CSS:
.trapezoid {
width: 50px;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid black;
}
With changing the border sides, the orientation of the trapezoid can be adjusted.
By setting some borders to transparent, and others to a color we can create various triangles. For example, in the
Up triangle, we set the bottom border to the desired color, then set the left and right borders to transparent. Here's
an image with the left and right borders shaded slightly to show how the triangle is being formed.
Triangle - Pointing Up
<div class="triangle-up"></div>
.triangle-up {
width: 0;
height: 0;
border-left: 25px solid transparent;
border-right: 25px solid transparent;
border-bottom: 50px solid rgb(246, 156, 85);
}
<div class="triangle-down"></div>
.triangle-down {
width: 0;
height: 0;
border-left: 25px solid transparent;
border-right: 25px solid transparent;
border-top: 50px solid rgb(246, 156, 85);
}
.triangle-right {
width: 0;
height: 0;
border-top: 25px solid transparent;
border-bottom: 25px solid transparent;
border-left: 50px solid rgb(246, 156, 85);
}
<div class="triangle-left"></div>
.triangle-left {
width: 0;
height: 0;
border-top: 25px solid transparent;
border-bottom: 25px solid transparent;
border-right: 50px solid rgb(246, 156, 85);
}
<div class="triangle-up-right"></div>
.triangle-up-right {
width: 0;
height: 0;
border-top: 50px solid rgb(246, 156, 85);
border-left: 50px solid transparent;
}
<div class="triangle-up-left"></div>
.triangle-up-left {
<div class="triangle-down-right"></div>
.triangle-down-right {
width: 0;
height: 0;
border-bottom: 50px solid rgb(246, 156, 85);
border-left: 50px solid transparent;
}
<div class="triangle-down-left"></div>
.triangle-down-left {
width: 0;
height: 0;
border-bottom: 50px solid rgb(246, 156, 85);
border-right: 50px solid transparent;
}
To create a circle, define an element with an equal width and height (a square) and then set the border-radius
property of this element to 50%.
HTML
CSS
.circle {
width: 50px;
height: 50px;
background: rgb(246, 156, 85);
border-radius: 50%;
}
Ellipse
An ellipse is similar to a circle, but with different values for width and height.
HTML
<div class="oval"></div>
CSS
.oval {
width: 50px;
height: 80px;
background: rgb(246, 156, 85);
border-radius: 50%;
}
The additional squares are created using the ::before and ::after psuedo-elements.
8 Point Burst
An 8 point burst are 2 layered squares. The bottom square is the element itself, the additional square is created
using the :before pseudo-element. The bottom is rotated 20°, the top square is rotated 135°.
<div class="burst-8"></div>
.burst-8 {
background: rgb(246, 156, 85);
width: 40px;
.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
top is rotated 60°.
<div class="burst-12"></div>
.burst-12 {
width: 40px;
height: 40px;
position: relative;
text-align: center;
background: rgb(246, 156, 85);
}
.burst-12::before, .burst-12::after {
content: "";
position: absolute;
top: 0;
left: 0;
height: 40px;
width: 40px;
background: rgb(246, 156, 85);
}
.burst-12::before {
-ms-transform: rotate(30deg);
transform: rotate(30deg);
}
.burst-12::after {
-ms-transform: rotate(60deg);
transform: rotate(60deg);
<div class="square"></div>
.square {
width: 100px;
height: 100px;
background: rgb(246, 156, 85);
}
HTML:
<div class="cube"></div>
CSS:
.cube {
background: #dc2e2e;
width: 100px;
height: 100px;
position: relative;
margin: 50px;
}
.cube::before {
content: '';
.cube::after {
content: '';
display: inline-block;
background: #9e1515;
width: 16px;
height: 100px;
transform: skewY(-50deg);
position: absolute;
top: -10px;
left: 100%;
}
See demo
HTML:
<div class="pyramid"></div>
CSS:
.pyramid {
width: 100px;
height: 200px;
position: relative;
margin: 50px;
}
.pyramid::before,.pyramid::after {
content: '';
display: inline-block;
width: 0;
height: 0;
border: 50px solid;
.pyramid::before {
border-color: transparent transparent #ff5656 transparent;
transform: scaleY(2) skewY(-40deg) rotate(45deg);
}
.pyramid::after {
border-color: transparent transparent #d64444 transparent;
transform: scaleY(2) skewY(40deg) rotate(-45deg);
}