Changing a CSS Animation at its Current Values
How do I make an changing a css animation at its current values?
Made as an experiment to try and change a CSS animation using its current values to a new animation and demonstrate the technique of doing so. What is a changing a css animation at its current values? How do you make a changing a css animation at its current values? This script and codes were developed by Zach Saucier on 20 August 2022, Saturday.
Changing a CSS Animation at its Current Values - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>Changing a CSS Animation at its Current Values</title> <link rel="stylesheet" href="css/style.css">
</head>
<body> <!-- NOTE: This example only works in Webkit Browsers -->
<div id="circle"></div>
<div id='button'>ChangeAnimation</div>
<div id='result'></div> <script src="js/index.js"></script>
</body>
</html>
Changing a CSS Animation at its Current Values - Script Codes CSS Codes
@-webkit-keyframes rotate { 0% { -webkit-transform:translate(100px, 100px) rotate(0deg) translate(-100px, -100px) rotate(0deg); background-color:red; } 13% { -webkit-transform:translate(100px, 100px) rotate(45deg) translate(-100px, -100px) rotate(-45deg); } 25% { -webkit-transform:translate(100px, 100px) rotate(90deg) translate(-100px, -100px) rotate(-90deg); } 38% { -webkit-transform:translate(100px, 100px) rotate(135deg) translate(-100px, -100px) rotate(0deg); } 50% { -webkit-transform:translate(100px, 100px) rotate(180deg) translate(-100px, -100px) rotate(-180deg); } 63% { -webkit-transform:translate(100px, 100px) rotate(225deg) translate(-100px, -100px) rotate(225deg); } 75% { -webkit-transform:translate(100px, 100px) rotate(270deg) translate(-100px, -100px) rotate(-270deg); } 88% { -webkit-transform:translate(100px, 100px) rotate(315deg) translate(-100px, -100px) rotate(315deg); } 100% { -webkit-transform:translate(100px, 100px) rotate(360deg) translate(-100px, -100px) rotate(-360deg); }
}
#circle { height: 50px; width: 50px; border-radius:25px; background-color: teal; -webkit-animation-duration: 4s; -webkit-animation-timing-function: linear; -webkit-animation-name:"rotate"; -webkit-animation-iteration-count: infinite; position:absolute; left:30%; top:20%;
}
#button { width:130px; background:teal;
}
Changing a CSS Animation at its Current Values - Script Codes JS Codes
// NOTE: The change to red signifies the start of
// the animation
// Allows elements to be accessed in a clean way
var circle = document.getElementById('circle'), button = document.getElementById('button'); // Gets element to show current percentage
var result = document.getElementById('result'), // Current position of circle around its path // in percent in reference to the original totalCurrentPercent = 0, // Percent of circle around its path in // percent in reference to the latest origin currentPercent = 0;
// Updates the percent change from the latest origin
var showPercent = window.setInterval(function() { if(currentPercent < 100) { currentPercent += 1; } else { currentPercent = 0; } result.innerHTML = currentPercent;
}, 39); // Runs at a rate based on the animation's // duration (milliseconds / 100)
// Checks to see if the specified rule is within
// any of the stylesheets found in the document;
// returns the animation object if so
function findKeyframesRule(rule) { var ss = document.styleSheets; for (var i = 0; i < ss.length; ++i) { for (var j = 0; j < ss[i].cssRules.length; ++j) { if (ss[i].cssRules[j].type == window.CSSRule.WEBKIT_KEYFRAMES_RULE && ss[i].cssRules[j].name == rule) { return ss[i].cssRules[j]; } } } return null;
}
// Replaces the animation based on the percent
// when activated and other hard coded
// specifications
function change(anim) { // Obtains the animation object of the specified // animation var keyframes = findKeyframesRule(anim), length = keyframes.cssRules.length; // Makes an array of the current percent values // in the animation var keyframeString = []; for(var i = 0; i < length; i ++) { keyframeString.push(keyframes[i].keyText); } // Removes all the % values from the array so // the getClosest function can perform calculations var keys = keyframeString.map(function(str) { return str.replace('%', ''); }); // Updates the current position of the circle to // be used in the calculations totalCurrentPercent += currentPercent; if(totalCurrentPercent > 100) { totalCurrentPercent -= 100; } // Self explanatory variables if you read the // description of getClosest var closest = getClosest(keys); var position = keys.indexOf(closest), firstPercent = keys[position]; // Removes the current rules of the specified // animation for(var i = 0, j = keyframeString.length; i < j; i ++) { keyframes.deleteRule(keyframeString[i]); } // Turns the percent when activated into the // corresponding degree of a circle var multiplier = firstPercent * 3.6; // Essentially this creates the rules to set a new // origin for the path based on the approximated // percent of the animation when activated and // increases the diameter of the new circular path keyframes.insertRule("0% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 0) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 0) + "deg); background-color:red; }"); keyframes.insertRule("13% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 45) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 45) + "deg); }"); keyframes.insertRule("25% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 90) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 90) + "deg); }"); keyframes.insertRule("38% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 135) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 135) + "deg); }"); keyframes.insertRule("50% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 180) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 180) + "deg); }"); keyframes.insertRule("63% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 225) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 225) + "deg); }"); keyframes.insertRule("75% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 270) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 270) + "deg); }"); keyframes.insertRule("88% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 315) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 315) + "deg); }"); keyframes.insertRule("100% { -webkit-transform: translate(100px,100px) rotate(" + (multiplier + 360) + "deg) translate(-100px,-100px) rotate(" + (multiplier + 360) + "deg); }"); // Shows the circle again circle.style.display = "inherit"; // Sets the animation to the newly specified rules circle.style.webkitAnimationName = anim; // Resets the approximate animation percent counter window.clearInterval(showPercent); currentPercent = 0; showPercent = self.setInterval(function() { if(currentPercent < 100) { currentPercent += 1; } else { currentPercent = 0; } result.innerHTML = currentPercent; }, 39);
}
// Attatches the change function to the button's
// onclick function
button.onclick = function() { // Removes the animation so a new one can be set circle.style.webkitAnimationName = "none"; // Temporarily hides the circle circle.style.display = "none"; // Initializes change function setTimeout(function () { change("rotate"); }, 0);
}
// Gets the animation's closest % value based on
// the approximated % found below
function getClosest(keyframe) { var curr = keyframe[0]; var diff = Math.abs (totalCurrentPercent - curr); for (var val = 0, j = keyframe.length; val < j; val++) { var newdiff = Math.abs(totalCurrentPercent - keyframe[val]); if (newdiff < diff) { diff = newdiff; curr = keyframe[val]; } } return curr;
}
// Check out http://zachsaucier.com/ for more of my projects
Developer | Zach Saucier |
Username | Zeaklous |
Uploaded | August 20, 2022 |
Rating | 3.5 |
Size | 3,781 Kb |
Views | 30,360 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Business card | 4,454 Kb |
Pausing Transitions | 2,098 Kb |
Reverse clip path with blend modes | 2,725 Kb |
Click Based Rotation Demo | 2,086 Kb |
Hipster date intro screen | 5,878 Kb |
Personal site header 2017 | 6,864 Kb |
SVG border animation 2 | 3,307 Kb |
Converting CSS Animations to Transitions | 1,995 Kb |
Circular Questionnaire | 5,141 Kb |
Circle Snake | 1,965 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
Mesmerizing octopus | Jllodra | 3,549 Kb |
Transitioning application screens with semantically named classes | Djgrant | 3,697 Kb |
Direction-icon | Alexandremasy | 3,323 Kb |
Dribbble Inspired Registration Form | Lancebush | 2,358 Kb |
Masonry | Uriuriuriu | 5,005 Kb |
We Simplify animation | Meodai | 48,169 Kb |
Filter inputs | Rowinf | 1,721 Kb |
Testing Portfolio Page | Sideshowli | 3,395 Kb |
Headroom.js demo | WickyNilliams | 3,982 Kb |
Draggable directive | YahyaKacem | 2,277 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!