Box breathing is a technique for dealing with stress. Give it a try by following this timer.
Forked from Dario Corsi's Pen CSS Only Box Breathing Visualizer.
Box breathing is a technique for dealing with stress. Give it a try by following this timer.
Forked from Dario Corsi's Pen CSS Only Box Breathing Visualizer.
<div class="wrapper"> | |
<div class="directions"> | |
<div class="message">Inhale</div> | |
<div class="message">Hold</div> | |
<div class="message">Exhale</div> | |
<div class="message">Hold</div> | |
</div> | |
<div class="timer inhale"> | |
<div class="progress"></div> | |
<div class="indicators"> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
</div> | |
</div> | |
<div class="timer inhale-hold"> | |
<div class="indicators"> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
</div> | |
</div> | |
<div class="timer exhale"> | |
<div class="indicators"> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
</div> | |
</div> | |
<div class="timer exhale-hold"> | |
<div class="indicators"> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
<div class="indicator"></div> | |
</div> | |
</div> | |
</div> |
$color-bg: #52BBF0; | |
$color-text: lighten($color-bg, 40%); | |
$color-timer-bg: lighten($color-bg, 10%); | |
$color-highlight: #3F6FB8; | |
$timer-duration:4000ms; | |
$timer-count:8; | |
$message-count:4; | |
body{ | |
background:$color-bg; | |
font: 400 16px/1.4 'Roboto', sans-serif; | |
letter-spacing:.12em; | |
} | |
.wrapper{ | |
transform:translate(-50%,-50%); | |
top:50%; | |
left:50%; | |
width:60vh; | |
height:60vh; | |
position:absolute; | |
margin:auto; | |
} | |
.directions{ | |
position:absolute; | |
top:50%;left:50%; | |
text-align:center; | |
transform:translate(-50%,-50%); | |
font-size:2rem; | |
.message{ | |
padding:.25rem; | |
animation: text-highlight ($timer-duration * $message-count) infinite; | |
color:$color-text; | |
opacity:.3; | |
&:nth-child(2){ | |
animation-delay:$timer-duration; | |
} | |
&:nth-child(3){ | |
animation-delay:$timer-duration * 2; | |
} | |
&:nth-child(4){ | |
animation-delay:$timer-duration * 3; | |
} | |
} | |
} | |
.timer{ | |
position:relative; | |
overflow:hidden; | |
border-radius:.5rem; | |
height:10%; | |
background:$color-timer-bg; | |
&:after{ | |
content:''; | |
display:block; | |
position:absolute; | |
top:0; | |
right:0; | |
bottom:0; | |
left:0; | |
width:100%; | |
transform: translateX(-100%); | |
animation: timer ($timer-duration * $timer-count) linear infinite; | |
animation-fill-mode: forwards; | |
background:$color-highlight; | |
z-index:0; | |
} | |
&.inhale{ | |
left:10%; | |
width:80%; | |
transform: rotate(0); | |
} | |
&.inhale-hold{ | |
position:absolute; | |
width:80%; | |
right:10%; | |
bottom:10%; | |
transform: rotate(90deg); | |
transform-origin:bottom right; | |
&:after{ | |
animation-delay:$timer-duration; | |
} | |
} | |
&.exhale{ | |
position:absolute; | |
width:80%; | |
left:10%; | |
bottom:0; | |
transform: rotate(180deg); | |
&:after{ | |
animation-delay:$timer-duration*2; | |
} | |
} | |
&.exhale-hold{ | |
position:absolute; | |
width:80%; | |
left:10%; | |
bottom:10%; | |
transform: rotate(270deg); | |
transform-origin:bottom left; | |
&:after{ | |
animation-delay:$timer-duration*3; | |
} | |
} | |
.indicators{ | |
display:flex; | |
height:100%; | |
} | |
.indicator{ | |
text-align:center; | |
position:relative; | |
z-index:2; | |
display:block; | |
flex:1; | |
border:1px solid $color-bg; | |
box-sizing:border-box; | |
} | |
} | |
@keyframes timer{ | |
10%,50%{ | |
transform: translateX(0%); | |
} | |
60%,100%{ | |
transform: translateX(100%); | |
} | |
} | |
@keyframes text-highlight{ | |
2%,25%{ | |
color:white; | |
opacity:1; | |
font-weight:600; | |
} | |
28%,100%{ | |
color: $color-text; | |
opacity:.3; | |
} | |
} | |