"Clicky" 3D Buttons with CSS

I wanted to challenge myself to come up with some really tactile 3D CSS buttons and ended up with the result shown below. This is a short tutorial on how I used CSS to make this possible:

There are two main components to creating these buttons. The first component is creating the bottom edge, and the second component is making the button move without disrupting its surroundings.

1. Creating The 3D Edge

There are two possible way of drawing the button’s bottom edge. The method I chose was to use an offset box-shadow with no blur radius. The other possible option is to create the bottom edge using a thick border-bottom style. This option, however, is more limiting as it prevents the use of additional border style but is a bit more browser-friendly.

2. Making it Move

Making the button move down on click is simple. We just need to set a relative top position to the thickness of the box shadow, then make the box shadow disappear. In CSS, on-click styles are added with the :active selector. Take a look at the CSS below; I’ve commented the important parts to make it easy to understand.

/** CSS **/

.clicky {
  /** Offset the Position **/
  position: relative;
  top: 0;
  margin-top: 0;
  margin-bottom: 10px;

  /** 3D Block Effect **/
  box-shadow: 0 10px 0 0 #6B2A4A;

  /** Make it look pretty **/
  display: block;
  background: #a47;
  color: #eee;
  padding: 1em 2em;
  border: 0;
  cursor: pointer;
  font-size: 1.2em;
  opacity: 0.9;
  border-radius: 10px;

.clicky:active {
  /** Remove 3D Block Effect on Click **/
  box-shadow: none;
  top: 10px;
  margin-bottom: 0;

.clicky:hover {
  opacity: 1;

.clicky:focus {
  /** Remove Chrome's Ugly Yellow Outline **/
  outline: 0;
<!-- HTML -->

<button class="clicky">CLICK ME!</button>

Final Worlds

That’s It! Now you can have the most bad-ass buttons on the block. Hopefully the CSS was clear enough that you understood what was going on. If you need clarification let me know in the comments below, or on one of the social networks (see page header or footer)

~ Gregory ʘ‿ʘ

tutorial webdev