ソースを参照

Optimized Musicify seek bar

Toby Chui 2 週間 前
コミット
3ec35c7223
1 ファイル変更60 行追加14 行削除
  1. 60 14
      src/web/Musicify/index.html

+ 60 - 14
src/web/Musicify/index.html

@@ -458,6 +458,42 @@
         .seek-bar { background: linear-gradient(to right, var(--accent) 0%, var(--accent) var(--progress, 0%), var(--border) var(--progress, 0%), var(--border) 100%); }
         .volume-bar { background: linear-gradient(to right, var(--accent) 0%, var(--accent) var(--vol-pct, 80%), var(--border) var(--vol-pct, 80%), var(--border) 100%); }
 
+        /* ── Seek bar extended hit-area wrapper (±10 px transparent zone) ── */
+        .seek-bar-wrap {
+            flex: 1;
+            position: relative;
+            height: 4px;
+            cursor: pointer;
+        }
+        .seek-bar-wrap > .seek-bar {
+            flex: unset;
+            position: absolute;
+            top: -10px;
+            left: 0;
+            width: 100%;
+            height: 24px;
+            background: transparent;
+            border-radius: 0;
+        }
+        .seek-bar-wrap > .seek-bar::-webkit-slider-runnable-track {
+            height: 4px;
+            border-radius: 2px;
+            background: linear-gradient(to right, var(--accent) 0%, var(--accent) var(--progress, 0%), var(--border) var(--progress, 0%), var(--border) 100%);
+        }
+        .seek-bar-wrap > .seek-bar::-webkit-slider-thumb {
+            margin-top: -4px;
+        }
+        .seek-bar-wrap > .seek-bar::-moz-range-track {
+            height: 4px;
+            border-radius: 2px;
+            background: var(--border);
+        }
+        .seek-bar-wrap > .seek-bar::-moz-range-progress {
+            height: 4px;
+            border-radius: 2px;
+            background: var(--accent);
+        }
+
         /* Right: extras */
         .player-extras {
             display: flex; align-items: center; gap: 4px;
@@ -1344,13 +1380,18 @@
             <!-- Seek bar -->
             <div class="seek-row">
                 <span class="seek-time" x-text="formatTime(currentTime)"></span>
-                <input type="range" class="seek-bar" min="0" :max="Math.floor(duration) || 100"
-                    :value="Math.floor(currentTime)"
-                    :style="'--progress:' + progressPercent() + '%'"
-                    x-on:mousedown="beginSeek()"
-                    x-on:touchstart="beginSeek()"
-                    x-on:change="endSeek($event.target.value)"
-                    x-on:input="currentTime = parseFloat($event.target.value)">
+                <div class="seek-bar-wrap">
+                    <input type="range" class="seek-bar" min="0" :max="Math.floor(duration) || 100"
+                        :value="Math.floor(currentTime)"
+                        :style="'--progress:' + progressPercent() + '%'"
+                        x-on:mousedown="beginSeek()"
+                        x-on:touchstart="beginSeek()"
+                        x-on:touchmove="currentTime = parseFloat($event.target.value)"
+                        x-on:touchend="endSeek($event.target.value)"
+                        x-on:touchcancel="endSeek($event.target.value)"
+                        x-on:change="endSeek($event.target.value)"
+                        x-on:input="currentTime = parseFloat($event.target.value)">
+                </div>
                 <span class="seek-time right" x-text="formatTime(duration)"></span>
             </div>
         </div>
@@ -1385,13 +1426,18 @@
         <!-- Mobile: seek bar -->
         <div class="mobile-seek-row">
             <span class="seek-time" x-text="formatTime(currentTime)"></span>
-            <input type="range" class="seek-bar" min="0" :max="Math.floor(duration) || 100"
-                :value="Math.floor(currentTime)"
-                :style="'--progress:' + progressPercent() + '%'"
-                x-on:mousedown="beginSeek()"
-                x-on:touchstart="beginSeek()"
-                x-on:change="endSeek($event.target.value)"
-                x-on:input="currentTime = parseFloat($event.target.value)">
+            <div class="seek-bar-wrap">
+                <input type="range" class="seek-bar" min="0" :max="Math.floor(duration) || 100"
+                    :value="Math.floor(currentTime)"
+                    :style="'--progress:' + progressPercent() + '%'"
+                    x-on:mousedown="beginSeek()"
+                    x-on:touchstart="beginSeek()"
+                    x-on:touchmove="currentTime = parseFloat($event.target.value)"
+                    x-on:touchend="endSeek($event.target.value)"
+                    x-on:touchcancel="endSeek($event.target.value)"
+                    x-on:change="endSeek($event.target.value)"
+                    x-on:input="currentTime = parseFloat($event.target.value)">
+            </div>
             <span class="seek-time right" x-text="formatTime(duration)"></span>
         </div>