Created
October 23, 2017 23:29
-
-
Save fuzzywalrus/2b738eaebdbc09d6d85f0a2722c47426 to your computer and use it in GitHub Desktop.
This uses a data-attribute to create the progress bar. Forked from https://bootsnipp.com/snippets/featured/circle-progress-bar. This functions based on increments defined in the the scss. Change the $howManySteps var and the for loops below will generate the CSS. The data attributes will need to be changed to reflect the newly generated CSS. Let…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//styling | |
$borderWidth: 7px; | |
$animationTime: 1.5s; | |
$border-color-default: #eee; | |
$border-color-fill: #ffb43e; | |
$size: 150px; | |
//Create how many steps | |
$howManySteps: 10; //this needs to be even. | |
//for fun try using 20 and changine in the HTML the data-percentage to 15 or 85 | |
.progress { | |
width: $size; | |
height: $size; | |
line-height: $size; | |
background: none; | |
margin: 0 auto; | |
box-shadow: none; | |
position: relative; | |
&:after { | |
content: ""; | |
width: 100%; | |
height: 100%; | |
border-radius: 50%; | |
border: $borderWidth solid $border-color-default; | |
position: absolute; | |
top: 0; | |
left: 0; | |
} | |
> span { | |
width: 50%; | |
height: 100%; | |
overflow: hidden; | |
position: absolute; | |
top: 0; | |
z-index: 1; | |
} | |
.progress-left { | |
left: 0; | |
} | |
.progress-bar { | |
width: 100%; | |
height: 100%; | |
background: none; | |
border-width: $borderWidth; | |
border-style: solid; | |
position: absolute; | |
top: 0; | |
border-color: $border-color-fill; | |
} | |
.progress-left .progress-bar { | |
left: 100%; | |
border-top-right-radius: ($size/2);; | |
border-bottom-right-radius: ($size/2);; | |
border-left: 0; | |
-webkit-transform-origin: center left; | |
transform-origin: center left; | |
//animation: loading-2 1.5s linear forwards 1.8s; | |
} | |
.progress-right { | |
right: 0; | |
.progress-bar { | |
left: -100%; | |
border-top-left-radius: ($size/2);; | |
border-bottom-left-radius: ($size/2);; | |
border-right: 0; | |
-webkit-transform-origin: center right; | |
transform-origin: center right; | |
//animation: loading-1 1.8s linear forwards; | |
} | |
} | |
.progress-value { | |
display: flex; | |
border-radius: 50%; | |
font-size: 36px; | |
text-align: center; | |
line-height: 20px; | |
align-items: center; | |
justify-content: center; | |
height: 100%; | |
//font-family: $work-sans; | |
font-weight: 300; | |
div { | |
margin-top: 10px; | |
} | |
span { | |
font-size: 12px; | |
text-transform: uppercase; | |
} | |
} | |
} | |
/* This for look creates the necessary css animation names | |
Due to the split circle of progress-left and progress right, we must use the animations on each side. | |
*/ | |
@for $i from 1 through $howManySteps { | |
$stepName: ($i*(100 / $howManySteps)); | |
//animation only the left side if below 50% | |
@if $i <= ($howManySteps/2) { | |
.progress[data-percentage="#{$stepName}"] { | |
.progress-right .progress-bar { | |
animation: loading-#{$i} $animationTime linear forwards; | |
} | |
.progress-left .progress-bar {animation: 0;} | |
} | |
} | |
//animation only the right side if above 50% | |
@if $i > ($howManySteps/2) { | |
.progress[data-percentage="#{$stepName}"] { | |
.progress-right .progress-bar { | |
animation: loading-#{($howManySteps/2)} $animationTime linear forwards; //set the animation to longest animation | |
} | |
.progress-left .progress-bar { | |
animation: loading-#{$i - ($howManySteps/2)} $animationTime linear forwards $animationTime; | |
} | |
} | |
} | |
} | |
//animation | |
@for $i from 1 through ($howManySteps/2) { | |
$degrees: (180/($howManySteps/2)); | |
$degrees: ($degrees*$i); | |
@keyframes loading-#{$i}{ | |
0%{ | |
-webkit-transform: rotate(0deg); | |
transform: rotate(0deg); | |
} | |
100%{ | |
-webkit-transform: rotate($degrees); | |
transform: rotate(#{$degrees}deg); | |
} | |
} | |
} | |
/* | |
Mark up demo: | |
<div class="progress" data-percentage="20"> | |
<span class="progress-left"> | |
<span class="progress-bar"></span> | |
</span> | |
<span class="progress-right"> | |
<span class="progress-bar"></span> | |
</span> | |
<div class="progress-value"> | |
<div> | |
20%<br> | |
<span>completed</span> | |
</div> | |
</div> | |
</div> | |
*/ |
Add width: 100%;
on .progress-value
for fix text on Bootstrap v4.2.1
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
very helpfull! great job