I need help with my CSS and javascript code which I have uploaded to codepen.
I am trying to use CSS motion path, I would like to be able to control this with JavaScript, so when you press the "Forward button" it runs to the last keyframe and that works, But when I press the "Back button" then nothing happens. I will like it to move back to the first keyframe.
The question if I am on the right track with my code? and what I need to change?
function myForwardFunction() {
document.getElementById("pathed").style.animationPlayState = "running";
}
function myBackFunction() {
document.getElementById("pathed").style.animationDirection = "reverse";
}
section {
width: 244px;
height: 200px;
border: 2px dashed lightgrey;
}
body {
display: flex;
padding: 10px;
flex-wrap: wrap;
gap: 30px;
margin: 0;
height: 100vh;
justify-content: center;
align-items: center;
}
div {
width: 50px;
height: 50px;
border: 1px solid hsl(343, 100%, 58%, .3);
border-right: 5px solid hsl(343, 100%, 58%);
background: hsla(343, 100%, 58%, .3) radial-gradient(circle, hsl(343, 100%, 58%, 1) 3px, hsl(343, 100%, 58%, 0) 3px);
display: flex;
justify-content: center;
align-items: center;
font-family: monospace, sans-serif;
}
.pathed {
offset-path: path('M0,0 C40,240 200,240 240,0');
position: absolute;
animation: distance 4000ms alternate ease-in-out;
animation-play-state: paused;
animation-fill-mode: both;
animation-direction: normal;
}
@keyframes distance {
from {
offset-distance: 0%;
}
to {
offset-distance: 100%;
}
}
code {
position: absolute;
top: 100px;
right: 10px;
left: 10px;
line-height: 1.5;
}
section {
position: relative;
}
* {
box-sizing: border-box;
}
svg {
position: absolute;
opacity: .333;
stroke-width: 2px;
}
<button onclick="myForwardFunction()">Forward</button>
<button onclick="myBackFunction()">Back</button>
<section>
<svg viewBox="0 0 240 200"><path d="M0,0 C40,240 200,240 240,0" fill="none" stroke="lightgrey"/></svg>
<div id="pathed" class="pathed"></div>
</section>
You may also toggle a class
and use a transition
:
function myForwardFunction() {
document.getElementById("pathed").classList.add('to100');
}
function myBackFunction() {
document.getElementById("pathed").classList.toggle('to100');
}
section {
width: 244px;
height: 200px;
border: 2px dashed lightgrey;
}
body {
display: flex;
padding: 10px;
flex-wrap: wrap;
gap: 30px;
margin: 0;
height: 100vh;
justify-content: center;
align-items: center;
}
div {
width: 50px;
height: 50px;
border: 1px solid hsl(343, 100%, 58%, .3);
border-right: 5px solid hsl(343, 100%, 58%);
background: hsla(343, 100%, 58%, .3) radial-gradient(circle, hsl(343, 100%, 58%, 1) 3px, hsl(343, 100%, 58%, 0) 3px);
display: flex;
justify-content: center;
align-items: center;
font-family: monospace, sans-serif;
}
.pathed {
offset-path: path('M0,0 C40,240 200,240 240,0');
position: absolute;
transition: 4s;
offset-distance: 0%;
}
.pathed.to100 {
offset-distance: 100%;
}
code {
position: absolute;
top: 100px;
right: 10px;
left: 10px;
line-height: 1.5;
}
section {
position: relative;
}
* {
box-sizing: border-box;
}
svg {
position: absolute;
opacity: .333;
stroke-width: 2px;
}
small {font-size:0.6em}
<button onclick="myForwardFunction()">Forward</button>
<button onclick="myBackFunction()">Back<small>/toggle direction</small></button>
<section>
<svg viewBox="0 0 240 200"><path d="M0,0 C40,240 200,240 240,0" fill="none" stroke="lightgrey"/></svg>
<div id="pathed" class="pathed"></div>
</section>
edit as suggested by @wizzwizz4 comment , you can use your js to set the onclick function on your button:
let btn = document.querySelector('#click');
let div = document.querySelector('#pathed');
btn.addEventListener("click", function() {
this.classList.toggle('to100');
div.classList.toggle('to100');
});
section {
width: 244px;
height: 200px;
border: 2px dashed lightgrey;
}
body {
display: flex;
padding: 10px;
flex-wrap: wrap;
gap: 30px;
margin: 0;
height: 100vh;
justify-content: center;
align-items: center;
}
div {
width: 50px;
height: 50px;
border: 1px solid hsl(343, 100%, 58%, .3);
border-right: 5px solid hsl(343, 100%, 58%);
background: hsla(343, 100%, 58%, .3) radial-gradient(circle, hsl(343, 100%, 58%, 1) 3px, hsl(343, 100%, 58%, 0) 3px);
display: flex;
justify-content: center;
align-items: center;
font-family: monospace, sans-serif;
}
.pathed {
offset-path: path('M0,0 C40,240 200,240 240,0');
position: absolute;
transition: 4s;
offset-distance: 0%;
}
.pathed.to100 {
offset-distance: 100%;
}
#click:after {
content: ' forwards';
}
#click.to100:after {
content: ' backwards';
}
code {
position: absolute;
top: 100px;
right: 10px;
left: 10px;
line-height: 1.5;
}
section {
position: relative;
}
* {
box-sizing: border-box;
}
svg {
position: absolute;
opacity: .333;
stroke-width: 2px;
}
small {
font-size: 0.6em
}
<button id=click>Click to go</button>
<section>
<svg viewBox="0 0 240 200"><path d="M0,0 C40,240 200,240 240,0" fill="none" stroke="lightgrey"/></svg>
<div id="pathed" class="pathed"></div>
</section>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With