How to create: Timeline

Learn how to use CSS to create a responsive 'timeline'.

Timeline

2017

Lorem ipsum dolor sit amet, quo ei simul congue exerci, ad nec admodum perfecto mnesarchum, vim ea mazim fierent detracto. Ea quis iuvaret expetendis his, te elit voluptua dignissim per, habeo iusto primis ea eam.

2016

Lorem ipsum dolor sit amet, quo ei simul congue exerci, ad nec admodum perfecto mnesarchum, vim ea mazim fierent detracto. Ea quis iuvaret expetendis his, te elit voluptua dignissim per, habeo iusto primis ea eam.

2015

Lorem ipsum dolor sit amet, quo ei simul congue exerci, ad nec admodum perfecto mnesarchum, vim ea mazim fierent detracto. Ea quis iuvaret expetendis his, te elit voluptua dignissim per, habeo iusto primis ea eam.

Try It Yourself

How to create a timeline

First step - Add HTML:

<div class="timeline">
  <div class="container left">
    <div class="content">
      <h2>2017</h2>
      <p>Lorem ipsum..</p>
    </div>
  </div>
  <div class="container right">
    <div class="content">
      <h2>2016</h2>
      <p>Lorem ipsum..</p>
    </div>
  </div>
</div>

Second step - Add CSS:

* {
  box-sizing: border-box;
}
/* Set background color */
body {
  background-color: #474e5d;
  font-family: Helvetica, sans-serif;
}
/* Actual timeline (vertical ruler) */
.timeline {
  position: relative;
  max-width: 1200px;
  margin: 0 auto;
}
/* Actual timeline (vertical ruler) */
.timeline::after {
  content: '';
  position: absolute;
  width: 6px;
  background-color: white;
  top: 0;
  bottom: 0;
  left: 50%;
  margin-left: -3px;
}
/* Container that encloses the content */
.container {
  padding: 10px 40px;
  position: relative;
  background-color: inherit;
  width: 50%;
}
/* The circle on the timeline */
.container::after {
  content: '';
  position: absolute;
  width: 25px;
  height: 25px;
  right: -17px;
  background-color: white;
  border: 4px solid #FF9F55;
  top: 15px;
  border-radius: 50%;
  z-index: 1;
}
/* Place the container on the left */
.left {
  left: 0;
}
/* Place the container on the right */
.right {
  left: 50%;
}
/* Add an arrow to the left container (pointing to the right) */
.left::before {
  content: " ";
  height: 0;
  position: absolute;
  top: 22px;
  width: 0;
  z-index: 1;
  right: 30px;
  border: medium solid white;
  border-width: 10px 0 10px 10px;
  border-color: transparent transparent transparent white;
}
/* Add an arrow to the right container (pointing to the left) */
.right::before {
  content: " ";
  height: 0;
  position: absolute;
  top: 22px;
  width: 0;
  z-index: 1;
  left: 30px;
  border: medium solid white;
  border-width: 10px 10px 10px 0;
  border-color: transparent white transparent transparent;
}
/* Fix the circle position of the right container */
.right::after {
  left: -16px;
}
/* Actual content */
.content {
  padding: 20px 30px;
  background-color: white;
  position: relative;
  border-radius: 6px;
}
/* Media query - responsive timeline for screens less than 600 pixels wide */
@media screen and (max-width: 600px) {
/* Place the timeline to the left */
  .timeline::after {
    left: 31px;
  }
/* Full-width container */
  .container {
    width: 100%;
    padding-left: 70px;
    padding-right: 25px;
  }
/* Ensure all arrows point to the left */
  .container::before {
    left: 60px;
    border: medium solid white;
    border-width: 10px 10px 10px 0;
    border-color: transparent white transparent transparent;
  }
/* Ensure all circles are in the same position */
  .left::after, .right::after {
    left: 15px;
  }
/* Make all right containers behave like left containers */
  .right {
    left: 0%;
  }
}

Try It Yourself