You need to divide by 2 every values involved, even the clip(); ones (fiddle updated)
#loading {
width: 50px;
height: 50px;
margin: 30px auto;
position: relative;
}
.outer-shadow,
.inner-shadow {
z-index: 4;
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.inner-shadow {
top: 50%;
left: 50%;
width: 40px;
height: 40px;
margin-left: -20px;
margin-top: -20px;
border-radius: 100%;
background-color: #ffffff;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.hold {
position: absolute;
width: 100%;
height: 100%;
clip: rect(0px, 50px, 50px, 25px);
border-radius: 100%;
background-color: #fff;
}
.fill,
.dot span {
background-color: #f50;
}
.fill {
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
clip: rect(0px, 25px, 50px, 0px);
}
.left .fill {
z-index: 1;
-webkit-animation: left 1s linear;
-moz-animation: left 1s linear;
animation: left 1s linear both;
}
@keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(180deg);
}
}
.right {
z-index: 3;
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
transform: rotate(180deg);
}
.right .fill {
z-index: 3;
-webkit-animation: right 1s linear;
-moz-animation: right 1s linear;
animation: right 1s linear both;
-webkit-animation-delay: 1s;
-moz-animation-delay: 1s;
animation-delay: 1s;
}
@keyframes right {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes right {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
.inner-shadow img {
margin-left: 8px;
margin-top: 7px;
}
<div id='loading'>
<div class='outer-shadow'>
</div>
<div class='inner-shadow'>
</div>
<div class='hold left'>
<div class='fill'></div>
</div>
<div class='hold right'>
<div class='fill'></div>
</div>
</div>
edit: in respond to comment @Filipe
How would the change from clip to clip-path be? I tried (also changing rect to inset), but the animation stops working.
Possible example with clip-path instead clip .
#loading {
width: 50px;
height: 50px;
margin: 30px auto;
position: relative;
}
.outer-shadow,
.inner-shadow {
z-index: 4;
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.inner-shadow {
top: 50%;
left: 50%;
width: 40px;
height: 40px;
margin-left: -20px;
margin-top: -20px;
border-radius: 100%;
background-color: #ffffff;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.hold {
position: absolute;
width: 100%;
height: 100%;
clip-path: polygon(50% 0, 0 0, 0 100%, 50% 100%);
border-radius: 100%;
background-color: #fff;
}
.fill,
.dot span {
background-color: #f50;
}
.fill {
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%);
}
.left .fill {
z-index: 1;
-webkit-animation: left 1s linear;
-moz-animation: left 1s linear;
animation: left 1s linear both;
}
@keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(180deg);
}
}
.right {
z-index: 3;
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
transform: rotate(180deg);
}
.right .fill {
z-index: 3;
-webkit-animation: right 1s linear;
-moz-animation: right 1s linear;
animation: right 1s linear both;
-webkit-animation-delay: 1s;
-moz-animation-delay: 1s;
animation-delay: 1s;
}
@keyframes right {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes right {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
.inner-shadow img {
margin-left: 8px;
margin-top: 7px;
}
<div id='loading'>
<div class='outer-shadow'>
</div>
<div class='inner-shadow'>
</div>
<div class='hold left'>
<div class='fill'></div>
</div>
<div class='hold right'>
<div class='fill'></div>
</div>
</div>
Answer from G-Cyrillus on Stack OverflowCSS circle border fill animation - Stack Overflow
How to animate border so that it displays slowly from start to finish
animation - CSS animate circle border filling with color - Stack Overflow
html - CSS animation - How to fill in "starting from border"? - Stack Overflow
Videos
You need to divide by 2 every values involved, even the clip(); ones (fiddle updated)
#loading {
width: 50px;
height: 50px;
margin: 30px auto;
position: relative;
}
.outer-shadow,
.inner-shadow {
z-index: 4;
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.inner-shadow {
top: 50%;
left: 50%;
width: 40px;
height: 40px;
margin-left: -20px;
margin-top: -20px;
border-radius: 100%;
background-color: #ffffff;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.hold {
position: absolute;
width: 100%;
height: 100%;
clip: rect(0px, 50px, 50px, 25px);
border-radius: 100%;
background-color: #fff;
}
.fill,
.dot span {
background-color: #f50;
}
.fill {
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
clip: rect(0px, 25px, 50px, 0px);
}
.left .fill {
z-index: 1;
-webkit-animation: left 1s linear;
-moz-animation: left 1s linear;
animation: left 1s linear both;
}
@keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(180deg);
}
}
.right {
z-index: 3;
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
transform: rotate(180deg);
}
.right .fill {
z-index: 3;
-webkit-animation: right 1s linear;
-moz-animation: right 1s linear;
animation: right 1s linear both;
-webkit-animation-delay: 1s;
-moz-animation-delay: 1s;
animation-delay: 1s;
}
@keyframes right {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes right {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
.inner-shadow img {
margin-left: 8px;
margin-top: 7px;
}
<div id='loading'>
<div class='outer-shadow'>
</div>
<div class='inner-shadow'>
</div>
<div class='hold left'>
<div class='fill'></div>
</div>
<div class='hold right'>
<div class='fill'></div>
</div>
</div>
edit: in respond to comment @Filipe
How would the change from clip to clip-path be? I tried (also changing rect to inset), but the animation stops working.
Possible example with clip-path instead clip .
#loading {
width: 50px;
height: 50px;
margin: 30px auto;
position: relative;
}
.outer-shadow,
.inner-shadow {
z-index: 4;
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.inner-shadow {
top: 50%;
left: 50%;
width: 40px;
height: 40px;
margin-left: -20px;
margin-top: -20px;
border-radius: 100%;
background-color: #ffffff;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.5);
}
.hold {
position: absolute;
width: 100%;
height: 100%;
clip-path: polygon(50% 0, 0 0, 0 100%, 50% 100%);
border-radius: 100%;
background-color: #fff;
}
.fill,
.dot span {
background-color: #f50;
}
.fill {
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%);
}
.left .fill {
z-index: 1;
-webkit-animation: left 1s linear;
-moz-animation: left 1s linear;
animation: left 1s linear both;
}
@keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes left {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(180deg);
}
}
.right {
z-index: 3;
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
transform: rotate(180deg);
}
.right .fill {
z-index: 3;
-webkit-animation: right 1s linear;
-moz-animation: right 1s linear;
animation: right 1s linear both;
-webkit-animation-delay: 1s;
-moz-animation-delay: 1s;
animation-delay: 1s;
}
@keyframes right {
0% {
-webkit-transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
@-webkit-keyframes right {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(180deg);
}
}
.inner-shadow img {
margin-left: 8px;
margin-top: 7px;
}
<div id='loading'>
<div class='outer-shadow'>
</div>
<div class='inner-shadow'>
</div>
<div class='hold left'>
<div class='fill'></div>
</div>
<div class='hold right'>
<div class='fill'></div>
</div>
</div>
is this what you expect,hope this will help to you.try this.I only concerned about the circle size of 50 px with inside circle.if this is not the case tell me.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>jquery</title>
<style type="text/css">
div.circleone{
width: 50px;
height: 50px;
border-radius: 25px;
box-shadow: 1px 2px 1px black;
}
div.circletwo
{
width: 25px;
height: 25px;
border-radius: 12.5px;
box-shadow: 1px -1px 1px black;
position: relative;
top: 25%;
left: 25%;
}
</style>
</head>
<body>
<div class="circleone">
<div class="circletwo"></div>
</div>
</body>
</html>
A way of making the border of an element looking animated is to gradually unveil the borders in turn by gradually shrinking a 5px wide (or high depending on which border) 100% wide element that is overlaying each border.
This snippet does this by animating the after pseudo element on the element and at the same time putting one border after another into the required final color.
You can put the class movingBorder from this snippet onto other elements to get the moving border effect.
.movingBorder {
width: 60vw;
height: 60vh;
border: solid 5px lime;
position: relative;
background: pink;
animation: changeBorders 5s linear;
}
@keyframes changeBorders {
0% {
border: solid 5px white;
border-left: solid 5px lime;
}
25% {
border: solid 5px white;
border-left: solid 5px lime;
}
25.02% {
border: solid 5px white;
border-left: solid 5px lime;
border-bottom: solid 5px lime;
}
50% {
border: solid 5px white;
border-left: solid 5px lime;
border-bottom: solid 5px lime;
}
50.02% {
border: solid 5px white;
border-left: solid 5px lime;
border-bottom: solid 5px lime;
border-right: solid 5px lime;
}
75% {
border: solid 5px white;
border-left: solid 5px lime;
border-bottom: solid 5px lime;
border-right: solid 5px lime;
}
75.02% {
border: solid 5px lime;
}
}
.movingBorder::after {
width: 5px;
background-color: white;
height: 0px;
position: absolute;
bottom: 0;
left: -5px;
z-index: 1;
animation: movedown 5s linear;
animation-fill-mode: forwards;
content: '';
display: inline-block;
}
@keyframes movedown {
0% {
height: calc(100% + 10px);
width: 5px;
bottom: -5px;
left: -5px;
}
25% {
height: 5px;
width: 5px;
bottom: -5px;
left: -5px;
}
25.01% {
height: 5px;
width: calc(100% + 10px);
bottom: -5px;
left: -5px;
}
50% {
height: 5px;
width: 0%;
left: 100%;
bottom: -5px;
}
50.01% {
height: calc(100% + 10px);
width: 5px;
left: 100%;
bottom: -5px;
}
75% {
height: 0;
width: 5px;
left: 100%;
bottom: 100%;
}
75.01% {
height: 5px;
width: calc(100% + 10px);
left: 0%;
bottom: 100%;
}
99.01% {
height: 5px;
width: 0;
left: 0;
bottom: 100%;
}
}
<div class="movingBorder" style="background: pink; width: 60vw; height: 60vh;"></div>
UPDATE: the above works for a square border but the requirement was for a border with radius set. This snippet puts an after element over the border (which is on the before pseudo element) which has this shape initially:

This moves left gradually revealing the top part of the lime border. Then the left part is set to transparent and the pseudo element moved right, gradually revealing the bottom part of the border.
NOTE: run this snippet in Full page to see the effect. The animation delays for 10 seconds so you have time to do that (otherwise the animation has finished before you've got there).
* {
margin: 0px;
padding: 0px;
list-style: none;
border: none;
text-decoration: none;
outline: none;
}
::-webkit-input-placeholder {
color: inherit;
opacity: 1;
}
:-ms-input-placeholder {
color: inherit;
opacity: 1;
}
::placeholder {
color: inherit;
opacity: 1;
}
html,
body {
height: 100%;
}
.col-lg- {}
.col-md- {}
.col-sm- {}
.col- {}
.img-fluid {}
.container-fluid {}
.justify-content-center {}
.row {}
.my-auto {}
.p0 {}
.container {
width: 100%;
max-width: 1170px;
}
.container-fluid {
width: 100%;
max-width: 1440px;
}
@media (max-width: 1199px) {
.container {
width: 100%;
max-width: 100%;
}
}
/*** ### Section One ### ***/
.section-one {
position: relative;
background: #ffffff;
}
.section-one h2 {
color: #000000;
font-size: 32px;
margin: 0px 0px 10px 0px;
padding: 0px;
font-family: "AzoSans-Medium";
}
.section-one p {
color: #000000;
font-size: 16px;
margin: 10px 0px;
padding: 0px;
font-family: "AzoSans-Regular";
}
.section-one .boxes {
position: relative;
margin-top: 75px;
}
.section-one .boxes:last-child {
margin-bottom: 100px;
}
.section-one .boxes .left-box {
position: relative;
margin: 25px 0px 0px 0px;
z-index: 3;
}
.section-one .boxes .left-box img {
width: 100%;
}
.section-one .boxes .right-box {
position: relative;
margin: 25px 0px 0px 0px;
height: 100%;
z-index: 2;
}
.section-one .boxes .right-box:before,
.section-one .boxes .right-box::after {
position: absolute;
content: "";
top: 50px;
left: -30px;
right: 0px;
bottom: 25px;
z-index: -2;
/* so we can have another pseudo element overlaying it */
}
.section-one .boxes .right-box:before {
border: 1px solid lime;
}
.section-one .boxes .right-box.left h2 {
text-align: left;
}
.section-one .boxes .right-box.left:before,
.section-one .boxes .right-box.left::after {
left: 0px;
right: -30px;
}
.section-one .boxes .right-box.left:before {
border-right: none;
border-radius: 250px 0px 0px 250px;
}
.section-one .boxes .right-box::after {
width: 200%;
height: 100%;
}
.section-one .boxes .right-box.left::after {
background-position: 0 0, 100% 75%;
background-size: calc(50% + 30px) 100%, 50% 50%;
background-repeat: no-repeat no-repeat, no-repeat no-repeat;
background-image: linear-gradient(white, white), linear-gradient(white, white);
animation: left 10s ease-in-out;
animation-fill-mode: forwards;
animation-delay: 10s;
/* just to give time to go full screen on SO snippet! */
}
@keyframes left {
0% {
background-image: linear-gradient(white, white), linear-gradient(white, white);
transform: translateX(0);
}
49.99% {
background-image: linear-gradient(white, white), linear-gradient(white, white);
}
50% {
background-image: linear-gradient(transparent, transparent), linear-gradient(white, white);
transform: translateX(-50%);
}
99.99% {
background-image: linear-gradient(transparent, transparent), linear-gradient(white, white);
transform: translateX(0);
opacity: 1;
}
100% {
opacity: 0;
}
}
.section-one .boxes .right-box.right h2 {
text-align: right;
}
.section-one .boxes .right-box.right:before {
border-left: none;
border-radius: 0px 250px 250px 0px;
}
.section-one .boxes .right-box h2 {
padding: 50px 0px 20px 0px;
}
.section-one .boxes .right-box p {
display: block;
margin: 15px auto;
width: 100%;
max-width: 355px;
text-align: justify;
}
.section-one .boxes .action-btn {
position: relative;
text-align: right;
}
@media (max-width: 1199px) {
.section-one h2 {
font-size: 28px;
}
.section-one p {
font-size: 15px;
}
.section-one .boxes {
position: relative;
margin-top: 50px;
}
.section-one .boxes:last-child {
margin-bottom: 75px;
}
.section-one .boxes .right-box:before {
left: -30px;
}
.section-one .boxes .right-box.left h2 {
text-align: left;
}
.section-one .boxes .right-box.left:before {
border-radius: 200px 0px 0px 200px;
}
.section-one .boxes .right-box.right h2 {
text-align: left;
}
.section-one .boxes .right-box.right:before {
border-radius: 0px 200px 200px 0px;
}
.section-one .boxes .right-box h2 {
padding: 50px 0px 15px 0px;
}
.section-one .boxes .right-box p {
display: block;
margin: 15px auto;
width: 100%;
max-width: 355px;
text-align: justify;
}
.section-one .boxes .action-btn {
position: relative;
text-align: right;
}
}
@media (max-width: 991px) {
.section-one h2 {
font-size: 25px;
}
.section-one .boxes {
position: relative;
margin-top: 10px;
}
.section-one .boxes:last-child {
margin-bottom: 30px;
}
.section-one .boxes .right-box:before {
display: none;
}
.section-one .boxes .right-box.right:before {
display: none;
}
.section-one .boxes .right-box h2 {
padding: 0px 0px 15px 0px;
margin: 0px;
}
.section-one .boxes .right-box p {
display: block;
margin: 0px auto 15px auto;
width: 100%;
max-width: 100%;
text-align: justify;
}
.section-one .boxes .action-btn {
position: relative;
text-align: right;
}
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<section class="section-one">
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="boxes">
<div class="row">
<div class="col-lg-6 aos-init" data-aos="zoom-in-right" data-aos-duration="800">
<div class="right-box left">
<h2>Heading1.</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla in erat et quam semper convallis. Phasellus vel nisl id leo suscipit molestie. Sed nec dignissim urna. Donec sit amet tortor nulla. Etiam tempus dui id ipsum commodo, et laoreet tortor luctus.
Ut dapibus.
</p>
</div>
</div>
<div class="col-lg-6 aos-init" data-aos="zoom-in-left" data-aos-duration="800">
<div class="left-box">
<img src="https://via.placeholder.com/650x430" class="img-fluid" alt="">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
Obviously equivalent CSS has to be added for when the text is to the right of the image.
You could "trick" the effect if your background-color is going to be white or solid color.
Just put a box above the element with the border slightly wider and higher, then make the animation to move this element away.
Like this:
* {box-sizing:border-box;}
.parent {
border:4px solid red;
height:200px;
border-radius:100px;
position:relative;
}
.text {
width:80%;
margin:0 auto;
position:relative;
top:50%;
transform:translateY(-50%);
}
.div1 {
position:absolute;
background-color:#fff;
border:4px solid #fff;
height:calc(100% + 20px);
width:calc(100% + 20px);
top:calc(0% - 10px);
left:calc(0% - 10px);
animation-name: border;
animation-duration: 5s;
animation-fill-mode:forwards;
}
@keyframes border {
0% {
left:calc(0% - 10px);
}
100% {
left:calc(100% + 10px );
}
}
<div class="parent">
<div class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eget ligula dictum, malesuada tortor vel, gravida velit. Pellentesque eget gravida quam. Nam sit amet massa aliquet, auctor libero dapibus, vehicula nunc. Sed ullamcorper, est id luctus facilisis, velit nibh semper nibh, ac tempus arcu velit ac metus. Donec ultricies ex id pellentesque ultrices. Vivamus rutrum, nulla quis bibendum fringilla, augue massa facilisis ipsum, id facilisis metus nisi nec eros.</div>
<div class="div1"></div>
</div>
You can move the div containing the text below the other div (div1) if you want the text not to be included in the animation.
One way you can do this is to animate the stroke-offset of a path. I've included sample code using a circle path. Depending on how big your element is you will need to change your dasharray and dashoffset values.
svg {
fill: #eee;
overflow: visible;
transform-origin:50% 50%;
transform: rotate(-90deg);
}
.path {
stroke: blue;
stroke-width: 4;
stroke-dasharray: 800;
stroke-dashoffset: 800;
animation: borderblueanim 2s infinite;
}
@keyframes borderblueanim {
from {
stroke-dashoffset: 800;
}
to {
stroke-dashoffset: 0;
}
}
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<circle class="path" cx="100" cy="100" r="100"/>
</svg>
Something like this might work. This uses SCSS
//Colors
$background: #fefefe;
$text: #4b507a;
$cyan: #60daaa;
$yellow: #fbca67;
$orange: #ff8a30;
$red: #f45e61;
$purple: #6477b9;
$blue: #0eb7da;
// Basic styles
button {
background: none;
border: 0;
box-sizing: border-box;
margin: 1em;
padding: 1em 2em;
// Using inset box-shadow instead of border for sizing simplicity
box-shadow: inset 0 0 0 2px $red;
color: $red;
font-size: inherit;
font-weight: 700;
// Required, since we're setting absolute on pseudo-elements
position: relative;
vertical-align: middle;
&::before,
&::after {
box-sizing: inherit;
content: '';
position: absolute;
width: 100%;
height: 100%;
}
}
// Border spins around element
// ::before holds three borders that appear separately, one at a time
// ::after holds one border that spins around to cover ::before's borders, making their appearance seem smooth
.spin {
width: 5em;
height: 5em;
padding: 0;
&:hover {
color: $blue;
}
&::before,
&::after {
top: 0;
left: 0;
}
&::before {
border: 2px solid transparent; // We're animating border-color again
}
&:hover::before {
border-top-color: $blue; // Show borders
border-right-color: $blue;
border-bottom-color: $blue;
transition:
border-top-color 0.15s linear, // Stagger border appearances
border-right-color 0.15s linear 0.10s,
border-bottom-color 0.15s linear 0.20s;
}
&::after {
border: 0 solid transparent; // Makes border thinner at the edges? I forgot what I was doing
}
&:hover::after {
border-top: 2px solid $blue; // Shows border
border-left-width: 2px; // Solid edges, invisible borders
border-right-width: 2px; // Solid edges, invisible borders
transform: rotate(270deg); // Rotate around circle
transition:
transform 0.4s linear 0s,
border-left-width 0s linear 0.35s; // Solid edge post-rotation
}
}
.circle {
border-radius: 100%;
box-shadow: none;
&::before,
&::after {
border-radius: 100%;
}
}
html {
background: $background;
}
body {
background: $background;
color: $text;
font: 300 24px/1.5 Lato, sans-serif;
margin: 1em auto;
max-width: 36em;
padding: 1em 1em 2em;
text-align: center;
}
.buttons {
isolation: isolate;
}
h1 {
font-weight: 300;
font-size: 2.5em;
}
<button class="spin circle">Spin Circle</button>