SVG Draw on Scroll

HTML
<h1>Scroll-to-draw</h1> <svg id="star-svg" viewBox="0 0 364.9 377.5"> <path fill="none" stroke="white" stroke-width="2" id="star-path" d="M102.2,377 0.5,377 0.5,0.5 364.4,0.5 364.4,377 102.2,377z "/> </svg>
CSS
body { /* feel free to change height */ height: 5000px; background: linear-gradient( to bottom, orange, darkblue ); } h1 { font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-weight: 300; color: white; text-transform: uppercase; text-align: center; font-size: 22px; letter-spacing: 5px; font-weight: 100; padding: 25px 15px; text-shadow: 1px 1px 1px #333; } #star-svg { position: fixed; top: 50%; left: 50%; width: 150px; height: 150px; margin: -75px 0 0 -75px; }
JAVASCRIPT
// Get a reference to the <path> var path = document.querySelector('#star-path'); // Get length of path... ~577px in this case var pathLength = path.getTotalLength(); console.log(pathLength); // Make very long dashes (the length of the path itself) path.style.strokeDasharray = pathLength + ' ' + pathLength; // Offset the dashes so the it appears hidden entirely path.style.strokeDashoffset = pathLength; // Jake Archibald says so // https://jakearchibald.com/2013/animated-line-drawing-svg/ path.getBoundingClientRect(); // When the page scrolls... window.addEventListener("scroll", function(e) { // What % down is it? // https://stackoverflow.com/questions/2387136/cross-browser-method-to-determine-vertical-scroll-percentage-in-javascript/2387222#2387222 // Had to try three or four differnet methods here. Kind of a cross-browser nightmare. var scrollPercentage = (document.documentElement.scrollTop + document.body.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight); // Length to offset the dashes var drawLength = pathLength * scrollPercentage; // Draw in reverse path.style.strokeDashoffset = pathLength - drawLength; // When complete, remove the dash array, otherwise shape isn't quite sharp // Accounts for fuzzy math if (scrollPercentage >= 0.99) { path.style.strokeDasharray = "none"; } else { path.style.strokeDasharray = pathLength + ' ' + pathLength; } });
Expand for more options Login