Recently, I came across a need to display a list of artist's exhibitions in a sidebar on a webpage. I wasn't quite satisfied with the styling of the presentation I had at hand at the time. That lead me to write a snippet of code you'll find in this tutorial. I wrote it in Stylus and HTML. Click on the View Compiled button to see the compiled CSS.
The Curriculum Timeline – grab the code
For those of you, who just wanna see it in action or just get the final code, here it is…
Default settings and variables
$bgColor ?= #ffffff
$txtColor ?= #444444
$linkColor ?= #ec008c
The basic structure
AS you can see, in the code above, the actual timeline HTML is made of the following parts:
<!-- The actual timeline HTML starts here -->
<div class="timeline tm">
<!-- listing of the individual years -->
<div class="tm__year"> … </div>
<div class="tm__year"> … </div>
<div class="tm__year"> … </div>
<div class="tm__year"> … </div>
<!-- the actual vertical line representing the timeline -->
<div class="tm__line"></div>
</div>
This is pretty straight forward. The idea is an encapsulating block .tm
that has its property position: relative
to provide a point of reference for the vertical line .tm__line
which is positioned absolutely. The .tm
block also displays all the .tm__year
elements. I shall mention these in more detail later.
.tm
min-height: 100vh
position: relative
/* The vertical line symbolizing the timeline */
&__line
position: absolute
/* defines the width of the vertical line */
width: 2px
top: 0
bottom: 0
left: 100%
transform: translateX(-5rem)
background-color: lighten($txtColor, 80%)
z-index: -1
The structure of the individual year elements and their labels
Each of the .tm__year
elements is made of an unordered list of the exhibitions that the artist participated in that year and a label for the particular year.
<div class="tm__year">
<div class="tm__label">2018</div>
<ul class="tm__events">
<li class="tm__event"> … </li>
<li class="tm__event"> … </li>
<li class="tm__event"> … </li>
</ul>
</div>
The formatting of the .tm__year
makes each one of them position: relative;
to set a reference point for the .tm__label
element that is positioned absolutely. The label uses a set of text-shadow
properties to create the illusion of the text outline.
/* Definition of the year elements */
&__year
position: relative
min-height: 10rem
margin-top: 3rem
&:first-child
/* making sure the first year sticks to the top */
margin-top: 0
&__label
color: rgba($txtColor, 0.3)
color: $bgColor
font-family: 'PT Serif', serif;
font-weight: bold
font-size: 4rem
line-height: 1
transform: rotate(-90deg)
transform-origin: 100% 0
position: absolute
top: 0
right: 4.75rem
max-width: 16rem
text-align: right
text-shadow: -1px -1px 0 rgba($linkColor, 0.6),
1px -1px 0 rgba($linkColor, 0.6),
-1px 1px 0 rgba($linkColor, 0.6),
1px 1px 0 rgba($linkColor, 0.6)
The actual list of exhibitions
There is nothing really special about the unordered list of exhibitions for each year. Each exhibition element consists of its heading and description.
<ul>
<li class="tm__event">
<h2 class="tm__event__heading">Ceramiq, Órgiva, Spain</h2>
A cyanotype exhibition.
</li>
…
</ul>
The actual styling of the list, its items and their headings
&__events
/* Sets the right edge of the list in line with the vertical line */
width: calc(100% - 5rem)
/* Aligns the text of exhibitions to the right edge */
text-align: right
&__event
padding: 1rem 0
padding-right: 2rem
/* set the reference point for the timeline bullet points */
position: relative
…
&__heading
font-size: 1.5rem
line-height: 1.2
margin-bottom: 0.5rem
color: $linkColor
The timeline bullet points
Each event on the timeline is highlighted by a bullet point. These are made by the CSS ::after
pseudo-element thus they don't require any additional HTML markup. As an icing on the cake, I've added a gentle micro-animation. I'm animating the bullet point's box-shadow
property and offsetting the odd and even bullet points by half of the animation period, thus creating an alternating effect.
&__event
…
&::after
content: ''
width: 1rem
height: 1rem
background-color: $linkColor
position: absolute
top: 1.5rem
right: calc(-0.5rem - 1px)
transform: rotate(45deg)
animation-duration: 1.5s
animation-name: microEvent
animation-iteration-count: infinite
animation-delay: 0
&:nth-child(odd)
&::after
animation-delay: 0.75s
@keyframes microEvent
from
box-shadow: 0 0 0 rgba($linkColor, 0.5)
to
box-shadow: 0 0 1rem 0.5rem rgba($linkColor, 0.1)
Special thanks go to my wife for letting me use some of her artist's CV records to make the example a bit more natural and for the cover image. Please, reward her goodwill, visit her website Emma Plunkett Art and perhaps even buy a piece of her artwork.
Top comments (0)