Volume Kontrol UI/UX Desenleri

Modern muzik player'lardan ilham — Pill-bar uyumlu oneriler

Araştırma Raporu

Basit Anlatim (Herkes Icin)

Volume (ses seviyesi) kontrolu, bir muzik calarin en cok kullanilan parcalarindan biridir. Dogru tasarlandiginda kimse fark etmez — yanlis tasarlandiginda herkes sikayet eder.

Bu raporda, Spotify, Apple Music, YouTube Music, SoundCloud, Tidal ve Deezer gibi buyuk platformlarin volume kontrolunu nasil tasarladigini inceledik. Amac: Muzibu'nun rounded-pill (yuvarlak hap) seklindeki player bar'ina dogal olarak uyan bir volume kontrolu bulmak.

Neden onemli? Muzibu kullanicilari gunde 10-15 saat muzik dinliyor. Volume kontrolu gunluk onlarca kez kullaniliyor. Eger slider cok kucuk, hassas degil veya mobilde zor kullaniliyorsa — kullanici deneyimi dogrudan zarar gorur.

Mevcut durum: Su anda Muzibu player'da sadece bir mute/unmute butonu var (ses ac/kapa). Gercek bir volume slider'i yok. Bu eksiklik giderilmeli.

Buyuk Platformlarin Volume Kontrolleri

Spotify (Web + Desktop)

En Populer

Gorsel Tasarim

  • Yatay, ince (4px yukseklik) cizgisel slider
  • Dolu kisim: beyaz (hover'da yesil #1DB954'e donusur)
  • Bos kisim: koyu gri (#535353)
  • Yuvarlak thumb (12px): normalde gizli, hover'da gorunur
  • Genislik: ~93px (flex: 0 1 93px, aslinda cok dar)
  • Solda speaker ikonu (3 seviye: muted, low, high)

Etkilesim

  • Tikla: O noktaya zipla (direkt)
  • Surukle: Surekli ayarlama
  • Mouse scroll: Hassas artis/azalis
  • Ikon tik: Mute toggle
  • Logaritmik egri (son guncelleme)
  • Hover'da track kalinligi 4px → 6px
Artilari: Minimal, temiz, hover micro-animasyon, accent renk degisimi
Eksileri: Cok dar (93px), mobilde slider yok (sadece cihaz sesi), hassasiyet sikayetleri

Canli Demo (hover edin):

Apple Music (Web + macOS)

Gorsel Tasarim

  • Yatay pill-seklinde track (6px, tamamen yuvarlatilmis)
  • Dolu kisim: pembe/kirmizi gradient (#fb5c74)
  • Bos kisim: seffaf gri
  • Buyuk beyaz thumb (18px), golge efekti, her zaman gorunur
  • macOS'ta ikon tikla → slider popup acilir

Etkilesim

  • Tikla + surukle (klasik)
  • Thumb her zaman gorunur (hover gerekmez)
  • iOS/iPad: Cihaz volume butonu + slider yok
  • macOS'ta: Ikon → Popup slider (gizle/goster)
Artilari: Buyuk thumb = kolay tutma, pill sekli dogal, golge derinlik katiyor
Eksileri: Slider her zaman yer kapliyor, mobilde yok, popup iOS'ta tutarsiz

Canli Demo:

YouTube Music (Web)

Gorsel Tasarim

  • Speaker ikonuna hover → dikey popup slider acilir
  • Popup: 36px genis, yuvarlak kose, koyu arka plan
  • Ince dikey track (4px), beyaz fill, kucuk thumb
  • 2025 guncellemesinde mute/unmute'a sadelesildi
  • Ikon tik = mute toggle

Etkilesim

  • Hover → dikey popup → surukle
  • Popup otomatik kapanir (mouse-leave)
  • Klavye: ok tuslari ile artis/azalis
  • Mobilde: cihaz volume butonu
Artilari: Yer kaplamaz (popup), dikey popup dogal hareket, temiz UI
Eksileri: Popup hassas (yanlislikla kapanir), dikey surukle yatay bar'da garip hissedebilir

Canli Demo (dikey popup):

← Dikey popup slider

SoundCloud (Web)

Gorsel Tasarim

  • Speaker ikonu + yatay ince slider (Spotify benzeri)
  • Turuncu accent renk (#f50)
  • 0-100 aralik, varsayilan 50
  • Sabit genislik, her zaman gorunur

Etkilesim

  • Tikla + surukle (klasik)
  • Widget API ile programatik kontrol
  • Mobilde: cihaz volume
Artilari: Basit, anlasilir, herkesçe bilinen
Eksileri: Yer kaplar, yenilikci degil, mobilde yok

Tidal & Deezer (Web)

Her ikisi de Spotify'a cok benzer yatay slider kullanir. Farklar minimal:

  • Tidal: Beyaz fill, hover'da mavi accent, ince track
  • Deezer: Mor/pembe gradient fill, biraz daha genis track
  • Her ikisinde de mobilde volume slider yok
  • Dark theme varsayilan, koyu gri track arka plan

Platform Karsilastirma Tablosu

Platform Tip Yon Thumb Hover Efekt Mobil Scroll Egri
Spotify Inline yatay Yatay Gizli → hover Renk + kalinlik Yok Var Logaritmik
Apple Music Popup / Inline Yatay Her zaman gorunur Minimal Yok Yok Lineer
YouTube Music Dikey popup Dikey Kucuk, gorunur Popup acar Yok Var Lineer
SoundCloud Inline yatay Yatay Gorunur Minimal Yok Yok Lineer
Tidal Inline yatay Yatay Gizli → hover Renk degisimi Yok Var Lineer

Not: Hic bir buyuk platform mobilde in-player volume slider sunmuyor. Hepsi cihaz volume butonuna yonlendiriyor.

7 Volume Kontrol Deseni (Pattern)

01

Inline Yatay Slider (Spotify Stili)

En yaygin desen — Spotify, Tidal, SoundCloud

Gorsel

Ikon + ince yatay cizgi + yuvarlak thumb. Track 4px, hover'da 6px'e buyur. Dolu kisim accent renkte, bos kisim koyu gri.

Etkilesim

Tikla = o noktaya git. Surukle = surekli. Hover = thumb gorunur + renk degisir. Scroll = hassas ayar.

Ekran Uyumu

Desktop: Mukemmel. Tablet: Iyi (yeterli genislik varsa). Mobil: Slider gizlenmeli veya daraltilmali.

Minimal, taninir, yer verimli
Dar alanlarda hassasiyet dusuk, mobilde ince slider zor kullanilir

Pill-bar uyumu:

|
02

Hover-Expand Slider (Gizle/Goster)

Ikon hover'inda slider acilir — YouTube Music varyanti

Gorsel

Normalde sadece speaker ikonu gorunur. Hover/focus olunca yatay slider sola dogru kaydirarak acilir (CSS transition, ~0.3s). Kapatilinca geri cekilir.

Etkilesim

Hover ikonu = slider acar. Ikon tik = mute. Slider surukle = volume ayarla. Mouse-leave = slider geri kapanir (300ms gecikme ile).

Ekran Uyumu

Desktop: Mukemmel (hover dogal). Tablet: Iyi (touch = hover tetikler). Mobil: Ikon'a tap ile acilir (toggle modu).

Yer tasarrufu, temiz UI, pill bar'a dogal uyum, mobilde de calisir
Mouse-leave hassasiyeti (yanlislikla kapanabilir), gecikme gerekli

Canli Demo (hover edin):

|

↑ Speaker ikonuna hover edin — slider kayarak acilir

03

Dikey Popup Slider

Ikon ustune dikey slider popup — YouTube Music / VLC

Gorsel

Speaker ikonunun ustune dikey, dar, yuvarlak kose (pill) popup cizar. Icinde dikey slider: bos kisim ustte, dolu kisim altta.

Etkilesim

Hover veya tap ile popup acar. Yukariya surukle = sesi artir. Asagiya surukle = sesi azalt. Disari tikla = kapat.

Ekran Uyumu

Desktop: Iyi ama yatay bar'da dikey popup garip durabilir. Tablet/Mobil: Yer kaplamaz ama popup konum sorunu olabilir.

Hic yer kaplamaz, cogu video player'da taninir
Yatay pill bar icinde dikey popup yabanci hissedebilir, overlay z-index sorunlari
04

Sadece Ikon (Cihaz Sesine Yonlendir)

Slider yok, sadece mute toggle — Spotify Mobile, Apple Music Mobile

Gorsel

Sadece speaker ikonu. Sesi acik/kapali gosterir. Baska gorsel element yok.

Etkilesim

Tek tik = mute/unmute. Volume ayari = cihaz fiziksel butonlari ile.

Ekran Uyumu

Tum ekranlarda calisir. Ama masaustunde yetersiz — kullanici in-app volume bekler.

En az yer, en basit, hata yapma ihtimali sifir
Desktop'ta yetersiz, kullanicinin beklentisini karsilamaz, "slider nerede?" sorusu
Bu Muzibu'nun su anki durumu. Sadece mute butonu var, slider yok. Yetersiz.
05

Segmentli Bar (LED Gostergesi)

Dikey cubuklar siralanir — VU meter ilhami

Gorsel

10-15 adet dikey cubuk, soldan saga yukselen. Aktif olanlar accent renk, pasifler koyu gri. Her cubuk bir seviye (ornegin 10 cubuk = %10 artis).

Etkilesim

Bir cubuga tikla = o seviyeye git. Surukleme ile cubuklar uzerinden gecis. Hover'da cubuk parlak olur.

Ekran Uyumu

Desktop: Gorsel olarak guclu. Tablet: Orta (touch target kucuk olabilir). Mobil: Zor (cubuklar cok kucuk).

Goze carpan, muzik temasina uygun, eglencelii
Adim bazli (hassas degil), touch target sorunlu, pill bar'da garip durabilir

Canli Demo:

06

Dairesel Kadran (Knob)

SVG ring/arc uzerinde dondurme — Analog ilhami

Gorsel

SVG daire, dolu kisim arc seklinde ilerler (270 derece). Ortada ikon veya sayi. Daire ustunde surukle ile dondurme.

Etkilesim

Daire uzerinde surukle (angular drag). Veya tik ile preset: %25, %50, %75, %100. Scroll ile de donebilir.

Ekran Uyumu

Desktop: Dikkat cekici ama alisik olunmayan. Tablet: Touch ile dondurme zor. Mobil: Pratik degil.

Gorsel olarak etkileyici, farkli, muzik temasina cok uygun
Touch'ta zor, pill bar'a sigmaz, accessibility sorunlu, karmasik JS

Canli Demo (statik):

65
07

Gesture/Swipe Kontrol (Mobil Oncelikli)

Ekranda kaydirarak ses ayarlama — VLC, Gesture uygulamalari

Gorsel

Gorsel bir slider yok. Kullanici ekranin belirli bir bolgesinde yukari/asagi kaydirarak sesi ayarlar. Gecici overlay gostergesi belirir.

Etkilesim

Sol yari: volume. Sag yari: parlaklik (VLC modeli). Veya player alani uzerinde 2-parmak swipe.

Ekran Uyumu

Desktop: Uygulanamaz. Tablet: Mumkun (buyuk ekran). Mobil: Dogal ama ogrenme egrisi var.

UI temiz kalir, tam ekran deneyimi, hizli ayar
Ogrenme egrisi, kesfedilebilirlik dusuk, scroll ile cakisma riski, desktop'ta yok

En Iyi Uygulamalar (Best Practices)

Touch Hedef Boyutu

  • Minimum thumb boyutu: 44x44px (Apple + Google standarti)
  • Track yuksekligi: gorselde 4-6px olsa bile, tiklama alani 44px olmali
  • Invisible hit area: CSS ile gorunmez tiklama genisletmesi

Logaritmik Volume Egrisi

  • Insan kulagi logaritmik duyar, lineer slider yaniltir
  • En iyi yaklasim: y = x^4 (60dB aralik)
  • 0 yakininda lineer roll-off: if(x < 0.1) amp *= x*10
  • Spotify bunu son guncellemede ekledi

Mouse Scroll Destegi

  • Volume alani uzerinde scroll = hassas ayar
  • Adim boyutu: 2-5% per tick
  • Sayfa scroll'u ile cakismayi onle (e.preventDefault + konum kontrolu)

Mobil Strateji

  • Kucuk ekranlarda slider gizle, sadece ikon goster
  • Ikon tap = mute toggle (mobilde en dogal)
  • Hassas volume = cihaz fiziksel butonu
  • Scroll sirasinda slider'i devre disi birak

Erisilebirlik (Accessibility)

  • <input type="range"> kullan (yerlesik ARIA)
  • aria-label="Volume" ekle
  • Klavye: Sol/Sag ok tuslari ile ayarlama
  • tabindex, focus-visible stili

Gorsel Geri Bildirim

  • Speaker ikonu 3+ seviye: muted, low, medium, high
  • Track fill rengi accent ile eslesmeli
  • Hover'da micro-animasyon (thumb gorunme, renk degisimi)
  • Muted durumda ikon + slider gri/sonu

Teknik Detaylar (Gelistiriciler Icin)

Cross-Browser Range Input Stillendirme

/* Reset */
input[type="range"] {
    -webkit-appearance: none;
    appearance: none;
    background: transparent;
    cursor: pointer;
    width: 100%;
    height: 44px;  /* Touch target, gorsel olarak degil! */
}

/* Track - Webkit (Chrome, Safari, Edge) */
input[type="range"]::-webkit-slider-runnable-track {
    height: 4px;
    background: #334155;
    border-radius: 2px;
    transition: height 0.15s;
}
input[type="range"]:hover::-webkit-slider-runnable-track {
    height: 6px;
}

/* Track - Firefox */
input[type="range"]::-moz-range-track {
    height: 4px;
    background: #334155;
    border-radius: 2px;
    border: none;
}

/* Fill (dolu kisim) - Firefox'ta yerlesik */
input[type="range"]::-moz-range-progress {
    background: #60a5fa;
    border-radius: 2px;
    height: 4px;
}

/* Thumb - Webkit */
input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background: #fff;
    margin-top: -4px;
    opacity: 0;
    transition: opacity 0.15s;
    box-shadow: 0 1px 4px rgba(0,0,0,0.3);
}
input[type="range"]:hover::-webkit-slider-thumb {
    opacity: 1;
}

/* Thumb - Firefox */
input[type="range"]::-moz-range-thumb {
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background: #fff;
    border: none;
    box-shadow: 0 1px 4px rgba(0,0,0,0.3);
}

Webkit Fill Rengi (JS ile)

// Webkit'te ::-moz-range-progress yok
// JS ile gradient background kullan
function updateSliderFill(input) {
    const pct = (input.value - input.min) / (input.max - input.min) * 100;
    input.style.background = `linear-gradient(
        to right,
        #60a5fa 0%, #60a5fa ${pct}%,
        #334155 ${pct}%, #334155 100%
    )`;
}

// Muted durumda gri yap
function updateSliderMuted(input, isMuted) {
    if (isMuted) {
        input.style.background = '#334155';
    } else {
        updateSliderFill(input);
    }
}

Logaritmik Volume Hesaplama

// Slider pozisyonu [0, 1] -> Gercek amplitude [0, 1]
// x^4 yaklasimi (~60dB dynamic range)
function sliderToAmplitude(x) {
    // x = slider pozisyonu (0.0 - 1.0)
    if (x <= 0) return 0;
    if (x >= 1) return 1;

    // Sifir yakini icin lineer roll-off
    if (x < 0.1) return x * 10 * Math.pow(0.1, 4);

    return Math.pow(x, 4);
}

// Gercek amplitude -> Slider pozisyonu (ters)
function amplitudeToSlider(amp) {
    if (amp <= 0) return 0;
    if (amp >= 1) return 1;
    return Math.pow(amp, 0.25); // 4. kök
}

// Kullanim:
// slider 50% = sliderToAmplitude(0.5) = 0.0625 (cok sessiz)
// slider 80% = sliderToAmplitude(0.8) = 0.4096 (orta)
// slider 100% = sliderToAmplitude(1.0) = 1.0 (tam)

Kaynak: dr-lex.be/volumecontrols — Insan kulagi %50 slider pozisyonunu "yarim ses" olarak algilamaz (lineer'de ~%13 algilar). x^4 egrisi bu algiya yaklasir.

Hover-Expand Deseni (Onerilen)

<!-- Alpine.js ile -->
<div class="flex items-center"
     x-data="{ showSlider: false }"
     @mouseenter="showSlider = true"
     @mouseleave="setTimeout(() => showSlider = false, 300)">

    <!-- Speaker Ikonu -->
    <button @click="$store.player.toggleMute()"
            class="w-9 h-9 flex items-center justify-center
                   text-white/60 hover:text-white transition-colors">
        <i class="fas"
           :class="{
               'fa-volume-mute': $store.player.isMuted,
               'fa-volume-off': !$store.player.isMuted && $store.player.volume < 30,
               'fa-volume-down': !$store.player.isMuted && $store.player.volume >= 30 && $store.player.volume < 70,
               'fa-volume-up': !$store.player.isMuted && $store.player.volume >= 70
           }"></i>
    </button>

    <!-- Kaydirarak Acilan Slider -->
    <div class="overflow-hidden transition-all duration-300 ease-out"
         :style="showSlider ? 'width: 100px; opacity: 1' : 'width: 0; opacity: 0'">
        <input type="range"
               min="0" max="100" step="1"
               :value="$store.player.volume"
               @input="$store.player.updateVolume($event.target.value)"
               @wheel.prevent="$store.player.updateVolume(
                   Math.max(0, Math.min(100, $store.player.volume + ($event.deltaY < 0 ? 5 : -5)))
               )"
               aria-label="Volume"
               class="volume-slider w-[88px] mx-1.5" />
    </div>
</div>

Mevcut Dosya Konumlari

Player Blade resources/views/themes/muzibu/components/player.blade.php
Player JS public/themes/muzibu/js/player/core/player-core.js
Volume State Alpine.store('player').volume (0-100)
Mevcut Volume Satir 288-292: Sadece mute/unmute butonu (slider yok!)
updateVolume() player-core.js satir 2735 (mevcut, calisiyor)
setVolume() player-core.js satir 2776 (event-based, mevcut)

Muzibu Icin Oneri: Hibrit Yaklasim

Onerilen Pattern: "Hover-Expand Inline Slider"

Spotify'in inline slider'i + YouTube Music'in hover-show mantigi = En iyi kombinasyon.

Desktop

  • Speaker ikonuna hover = slider kayarak acilir (100px)
  • Ikon tik = mute toggle
  • Slider surukle = volume ayarla
  • Mouse scroll = hassas +/- 5%
  • Hover'da accent renk + thumb gorunme

Tablet

  • Ikon'a tap = slider acilir (toggle)
  • Ikon'a uzun bas (long-press) = mute
  • Slider surukle = volume ayarla
  • Baska yere tap = slider kapanir
  • 44px touch target

Mobil

  • Sadece speaker ikonu (slider gizli)
  • Tap = mute/unmute
  • Volume ayari = cihaz butonu
  • Tum buyuk platformlar bunu yapiyor
  • Yer tasarrufu kritik

Neden Bu Pattern?

  • Pill bar'a dogal uyum (yatay kaydirma)
  • Yer kaplamaz (normalde gizli)
  • Tum ekran boyutlarinda calisir
  • Mevcut JS altyapisi yeterli (updateVolume mevcut)
  • CSS transition = performans dostu
  • Spotify + YouTube Music'ten taninir
  • Accessibility: native range input + ARIA

Dikkat Edilecekler

  • Mouse-leave delay: 300ms (cok hizli kapanma onlemi)
  • Logaritmik egri: x^4 yaklasimi uygula
  • Safari: -webkit-slider-thumb margin-top dikkatli ayarla
  • Touch: scroll sirasinda slider'i devre disi birak
  • Performance: Debounce volume update (16ms = 60fps)
  • Memory: removeEventListener for scroll handler
  • Breakpoint: <768px = slider gizle, sadece ikon

Final Mockup — Pill Bar icinde Volume Kontrolu

Desktop (hover edin):

| 2:34
5:12 |

Mobil (slider gizli):

|

Uygulama Adimlari (Tahmini)

1

player.blade.php — HTML/Alpine Yapisini Ekle

Mevcut mute butonunu hover-expand pattern ile degistir. input[type="range"] + Alpine x-data ile slider state.

2

CSS Stillendirme

Cross-browser range input stili. Webkit + Firefox + Safari thumb/track. Hover animasyonu. Dark theme renkleri.

3

Speaker Ikonu Dinamik Degisimi

4 seviye: muted, low (<30), medium (30-70), high (>70). Mevcut 2 seviye yetersiz.

4

Mouse Scroll Destegi

Volume container uzerinde wheel event dinle. +5/-5 adim. preventDefault ile sayfa scroll onleme.

5

Logaritmik Egri (Opsiyonel)

player-core.js icinde updateVolume()'a x^4 egrisi. Oncesi/sonrasi karsilastirmasi ile karar ver.

6

Responsive Breakpoints

<768px: slider gizli, sadece ikon. ≥768px: hover-expand. ≥1024px: her zaman gorunur (opsiyonel).

7

Test (Safari + Chrome + Mobil)

Puppeteer ile basic test. Manuel Safari iPad test. Memory leak kontrolu (15 saat oturum).

Kaynaklar

1 Mart 2026 • Muzibu.com.tr