]> littlesong.place Git - littlesongplace.git/commitdiff
Use range slider for player position
authorChris Fulljames <christianfulljames@gmail.com>
Wed, 5 Feb 2025 12:22:18 +0000 (07:22 -0500)
committerChris Fulljames <christianfulljames@gmail.com>
Wed, 5 Feb 2025 12:22:34 +0000 (07:22 -0500)
static/player.js
static/styles.css
templates/base.html

index 55544c1578709d15c9322fd8025d4b9889518201..c55fdf065d3c390febd0ca1efe8d53187d5f11da 100644 (file)
@@ -132,67 +132,16 @@ function getTimeString(time) {
 // Update the player while the song plays
 function songUpdate() {
     var audio = document.getElementById("player-audio");
-    var bar = document.getElementById("player-position-bar");
-    var dot = document.getElementById("player-position-dot");
-    var songProgress = audio.currentTime / audio.duration;
-    var maxPosition = bar.offsetWidth - dot.offsetWidth
-    var dotPosition = songProgress * maxPosition;
-
-    dot.style.left = `${dotPosition}px`;
-    dot.style.visibility = "visible";
-
-    document.getElementById("player-current-time").textContent = getTimeString(audio.currentTime);
-    document.getElementById("player-total-time").textContent = getTimeString(audio.duration);
-}
-
-// Mouse scrub state
-var m_isScrubbing = false;
-var m_scrubPosition = 0;
-
-// Handle a mouse event that scrubs the song position
-function songScrub(event) {
-    var audio = document.getElementById("player-audio");
-    var bar = document.getElementById("player-position-bar");
-    var dot = document.getElementById("player-position-dot");
-    var maxPosition = bar.offsetWidth - dot.offsetWidth
-    if (event.type == "mousedown") {
-        // Start scrub
-        m_isScrubbing = true;
-        if (event.target === dot) {
-            // Clicked dot - start scrub, but don't move yet
-            var songProgress = audio.currentTime / audio.duration;
-            m_scrubPosition = songProgress * maxPosition;
-        }
-        else {
-            // Clicked outside of dot, set dot position immediately
-            var dotPosition = event.offsetX - (dot.offsetWidth / 2);
-            updateScrubPosition(dot, audio, dotPosition, maxPosition);
-        }
-    }
-    else if (["mouseup", "mouseleave"].includes(event.type)) {
-        // End scrub
-        m_isScrubbing = false;
+    var position = document.getElementById("position-slider");
+    if (audio.duration) {
+        position.value = audio.currentTime / audio.duration;
     }
-    else if (event.type == "mousemove" && m_isScrubbing) {
-        // Scrub
-        var dotPosition = m_scrubPosition + event.movementX;
-        updateScrubPosition(dot, audio, dotPosition, maxPosition);
+    else {
+        position.value = 0;
     }
 
-    // Prevent drag event from being used for selection
-    if (event.stopPropagation) event.stopPropagation();
-    if (event.preventDefault) event.preventDefault();
-    event.cancelBubble = true;
-    event.returnValue = false;
-}
-
-// Update scrub dot position
-function updateScrubPosition(dot, audio, dotPosition, maxPosition) {
-    if (dotPosition < 0) { dotPosition = 0; }
-    if (dotPosition > maxPosition) { dotPosition = maxPosition; }
-    dot.style.left = `${dotPosition}px`;
-    m_scrubPosition = dotPosition;
-    audio.currentTime = audio.duration * (dotPosition / maxPosition);
+    document.getElementById("player-current-time").textContent = getTimeString(audio.currentTime);
+    document.getElementById("player-total-time").textContent = getTimeString(audio.duration);
 }
 
 // Add event listeners
@@ -217,23 +166,18 @@ document.addEventListener("DOMContentLoaded", (event) => {
     })
 
     // Audio position scrubbing
-    var playerPosition = document.getElementById("player-position");
-    playerPosition.addEventListener("mousedown", songScrub);
-    playerPosition.addEventListener("mouseup", songScrub);
-    playerPosition.addEventListener("mouseleave", songScrub);
-    playerPosition.addEventListener("mousemove", songScrub);
-
-    // Song queue
-    for (const element of document.getElementsByClassName("song")) {
-        m_allSongs.push(element);
+    document.getElementById("position-slider").oninput = function(event) {
+        audio.currentTime = audio.duration * event.target.value;
     }
 
     // Volume
-    var vol = document.getElementById("volume-slider");
-    vol.oninput = function() {
-        console.log("updateVolume", vol);
-        audio.volume = vol.value;
+    document.getElementById("volume-slider").oninput = function(event) {
+        audio.volume = event.target.value;
     }
 
+    // Song queue
+    for (const element of document.getElementsByClassName("song")) {
+        m_allSongs.push(element);
+    }
 });
 
index 5253faa3f599e1ce6908fc9b8e056f09b79bb668..aa3df318faa9f9aa713391d7b5b54933255b50da 100644 (file)
@@ -363,33 +363,26 @@ div.player-info {
     border: none;
 }
 
-#player-position {
-    display: inline-block;
-    position: relative;
-    height: 32px;
-    width: 50%;
+#position-slider {
+    width: 200px;
 }
 
-#player-position-bar {
-    position: absolute;
-    display: inline-block;
-    background-color: var(--black);
-    left: 100;
-    top: 14px;
-    width: 100%;
-    height: 4px;
-    border-radius: 2px;
+@media screen and (max-width: 480px) {
+    #position-slider {
+        width: 20%;
+    }
 }
 
-#player-position-dot {
-    position: absolute;
-    display: inline-block;
-    background-color: var(--purple);
-    top: 6px;
+#position-slider::-webkit-slider-thumb {
+    height: 20px;
     width: 20px;
+    border-radius: 10px;
+}
+
+#position-slider::-moz-range-thumb {
     height: 20px;
-    border-radius: 50%;
-    cursor: pointer;
+    width: 20px;
+    border-radius: 10px;
 }
 
 .player-button img {
index 4c1e82a392ced391a3a7cdc80a4dfd59a7c00a04..dfb6be5a364a8d7831de6088f48a98b6c32994d7 100644 (file)
                     <button onclick="songNext()" class="player-button">
                         <img src="/static/lsp_btn_next02.gif" alt="Next">
                     </button>
-                    <div id="player-position">
-                        <span id="player-position-bar"></span>
-                        <span id="player-position-dot"></span>
-                    </div>
+                    <input id="position-slider" name="song-position" type="range" min="0" max="1" step="any" value="0"/>
                     <span class="player-time" id="player-current-time">0:00</span>
                     <span class="player-time-sep">/</span>
                     <span class="player-time" id="player-total-time">0:00</span>