Advertisement
Mangus875

[OLD] Rolling Square Metronome

Nov 9th, 2023 (edited)
787
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 3.34 KB | None | 0 0
  1. <!--
  2. New paste:
  3.     https://pastebin.com/LE6pGXdr
  4. -->
  5.  
  6. <!DOCTYPE html>
  7. <html>
  8.     <head>
  9.         <title>Animated Metronome</title>
  10.         <style>
  11.             :root {
  12.             background-color: #2d2d2d;
  13.             }
  14.             .rolling_square {
  15.             --bpm: 120;
  16.             --duration: calc(240s / var(--bpm));
  17.             position: absolute;
  18.             left: 50%;
  19.             top: 50%;
  20.             width: 50vh;
  21.             height: 50vh;
  22.             background-color: #fff;
  23.             transform: translate(-50%, -50%);
  24.             }
  25.             .rolling_square div {
  26.             position: absolute;
  27.             width: 50%;
  28.             height: 50%;
  29.             background-color: #ff5533;
  30.             animation: roll var(--duration) ease-in infinite;
  31.             animation-play-state:
  32.             }
  33.             @keyframes roll {
  34.             0% {
  35.             transform-origin: top right;
  36.             transform: translate(0%, 0%);
  37.             }
  38.             25% {
  39.             transform-origin: top right;
  40.             transform: rotate(-90deg);
  41.             }
  42.             25.000001% {
  43.             transform-origin: bottom right;
  44.             transform: translate(100%, 0) rotate(0deg);
  45.             }
  46.             50% {
  47.             transform-origin: bottom right;
  48.             transform: translate(100%, 0%) rotate(-90deg);
  49.             }
  50.             50.000001% {
  51.             transform-origin: bottom left;
  52.             transform: translate(100%, 100%) rotate(0deg);
  53.             }
  54.             75% {
  55.             transform-origin: bottom left;
  56.             transform: translate(100%, 100%) rotate(-90deg);
  57.             }
  58.             75.000001% {
  59.             transform-origin: top left;
  60.             transform: translate(0%, 100%) rotate(0deg);
  61.             }
  62.             100% {
  63.             transform-origin: top left;
  64.             transform: translate(0%, 100%) rotate(-90deg);
  65.             }
  66.             }
  67.             .slidecontainer {
  68.             position: absolute;
  69.             left: 50%;
  70.             top: 24%;
  71.             transform: translate(-50%, -50%);
  72.             width: 45vh;
  73.             display: flex;
  74.             flex-direction: row;
  75.             }
  76.             .slidecontainer::before {
  77.             transform: translateY(-60%);
  78.             font-family: consolas;
  79.             font-size: 20px;
  80.             color: #fff;
  81.             content: attr(data-bpm) " BPM";
  82.             }
  83.             .slider {
  84.             -webkit-appearance: none;
  85.             width: 100%;
  86.             height: 10px;
  87.             border-radius: 5px;
  88.             background: #ddd;
  89.             outline: none;
  90.             }
  91.             .slider::-webkit-slider-thumb {
  92.             -webkit-appearance: none;
  93.             appearance: none;
  94.             width: 15px;
  95.             height: 15px;
  96.             border-radius: 50%;
  97.             background: #ff5533;
  98.             cursor: pointer;
  99.             }
  100.         </style>
  101.         <script>
  102.             var bpmSlider,met;
  103.            
  104.             window.onload = () => {
  105.                 bpmSlider = document.getElementById("bpm-slider");
  106.                 met = document.querySelector(".rolling_square div");
  107.                
  108.                 setInterval(() => {
  109.                     let bpm = bpmSlider.value;
  110.                     met.style.setProperty('--duration', `calc(240s / ${bpm})`);
  111.                     document.querySelector(".slidecontainer").setAttribute("data-bpm", bpm);
  112.                 });
  113.                
  114.                 document.querySelector(".rolling_square").onclick = () => {
  115.                     let playing = getComputedStyle(met).getPropertyValue("animation-play-state") == "running";
  116.                     if (playing) {
  117.                         met.style.setProperty("animation-play-state", "paused");
  118.                         met.style.setProperty("animation", "none");
  119.                         setTimeout(() => {
  120.                             met.style.setProperty("animation", "roll var(--duration) ease-in infinite");
  121.                             met.style.setProperty("animation-play-state", "paused");
  122.                         });
  123.                         return;
  124.                     }
  125.                     met.style.setProperty("animation-play-state", "running");
  126.                 }
  127.             }
  128.         </script>
  129.     </head>
  130.     <body>
  131.         <div class='slidecontainer' data-bpm='120'>
  132.             <input type='range' min='10' max='360' value='120' class='slider' id='bpm-slider'>
  133.         </div>
  134.         <div id='metronome' class='rolling_square'>
  135.             <div id='ticker'></div>
  136.         </div>
  137.     </body>
  138. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement