Yerel çift aralıklı giriş
(muffinman.io)@stanko/dual-range-input, iki yerel HTML range input öğesini birleştirerek çift aralıklı bir slider oluşturur ve tarayıcının varsayılan etkileşimlerini ve erişilebilirliğini aynen kullanır- Uygulama, giriş değerlerini senkronize eden yaklaşık 50 satır JavaScript ve CSS üzerine kurulu olduğu için, sürükleme ve erişilebilirliği baştan oluşturan geleneksel yaklaşımlardan daha basittir
- İki girişin
min,maxdeğerleri ve genişliği, seçilen değerlerin orta noktasına göre güncellenir; track’e tıklandığında daha yakın olan thumb ilgili değere gider - range input track’i gerçek giriş genişliğinden daha kısa olduğundan, thumb genişliği hesaplamaya eklenir ve fazla genişlik wrapper padding’iyle absorbe edilir
- Tema CSS değişkenleri ve gradient ile ayarlanabilir; seçili aralık rengi, thumb boyutu ve track rengi gibi değerler override edilebilir
Yerel range input ile yapılmış çift slider
@stanko/dual-range-input, iki HTML range input öğesini yan yana yerleştirerek çift aralıklı giriş uygular- Buradaki “yerel”, tek bir tarayıcı kontrolü anlamına değil; iki range input kullanarak tarayıcının varsayılan etkileşimlerini ve erişilebilirlik özelliklerini korumak anlamına gelir
- Uygulama, girişleri senkronize eden yaklaşık 50 satır JavaScript ve görsel tamamlayıcılık için CSS’ten oluşur
- Çıkış noktası, üretken çizim aracında parametrelerin minimum ve maksimum değerlerini ayarlayan bir UI ihtiyacıydı
- Gereksinimler iki taneydi
- Yerel HTML range input kullanmak
- Track’e tıklandığında iki thumb’dan tıklama noktasına daha yakın olanın ilgili değere gitmesi
Değer senkronizasyonu ve tıklama işleme
- İki girişten biri değiştiğinde kütüphane, seçilen iki değer arasındaki orta noktayı hesaplar
- Her girişin
minvemaxöznitelikleri orta noktaya göre ayarlanır - İki girişin genişliği de orta noktaya göre güncellenir
- Her girişin
- Girişlerin orta noktada buluşacak şekilde boyutu ayarlandığından, iki thumb arasına tıklandığında tıklama konumuna yakın olan thumb hareket eder
- İki thumb arasındaki step sayısı tekse, en son kullanılan girişe öncelik verilir
CSS hesaplamaları ve stillendirme
- range input’un track’i, toplam giriş genişliğinden daha kısadır ve tarayıcı thumb’ın dışarı taşmaması için iki yanda boşluk bırakır
- Giriş genişliğini basitçe %25 ve %75 gibi bölmek, gerçek track oranını doğru vermez
- Uygulama, her giriş genişliğine
--dri-thumb-widthekler ve fazla genişliği karşılamak için wrapper’a padding ekler
- Stillendirme, tarayıcının range input CSS stillendirme özelliklerini kullanır
- track ve thumb süslenir; iki track’in birleştiği orta kısımda border radius oluşmaması sağlanır
- Tema, CSS değişkenlerini override ederek oluşturulabilir
- Başlıca değişkenler arasında
--dri-height,--dri-thumb-width,--dri-thumb-color,--dri-track-color,--dri-track-filled-color,--dri-track-border-radiusvb. yer alır
- Başlıca değişkenler arasında
- Seçili aralık CSS gradient ile boyanır
- gradient konumu
--dri-gradient-positiondeğişkeniyle belirtilir - Kod, giriş genişliğini güncellerken bu değişkeni de birlikte günceller
- gradient konumu
- Bu uygulama, özel bir kütüphaneyle sürükleme ve erişilebilirliği baştan oluşturmak yerine, mümkün olduğunca önce yerel öğeleri kullanma yaklaşımıdır
1 yorum
Hacker News yorumları
Bu tür slider’larda ortadaki alanın da her zaman sürüklenebilir olması gerektiğini düşünüyorum. Yani ortadan tutunca iki tutamaç da aynı anda hareket etmeli
Bu arada Unity bunu böyle ele alıyor: https://docs.unity3d.com/StaticFiles/ScriptRefImages/EditorG...
“Her zaman” biraz fazla iddialı bir ifade olabilir
Yazarıyım. HN’de görmek güzel
Burada issue ve hata raporları bırakılmaya başlandığını gördüm; burada saat geç olduğu için yarın bakmayı planlıyorum
Üretken görsel işleri için buna ihtiyacım olduğu için yaptım; sayı girmektense slider’ı sürüklerken görüntünün nasıl değiştiğini görmeyi tercih ediyorum
Mümkün olduğunca minimal tutmaya çalıştım
Şu anda SwiftUI kullanıyorum ve kendi bileşenini yapmak neredeyse fazla kolay. Ama yazarın açıkladığı gibi bu her zaman en iyi yol değil; native bileşenler çoğu zaman oldukça dolu özelliklere sahip oluyor
Yazıyı iOS’te Firefox gibi biraz sıra dışı bir tarayıcıda da denedim ve iyi çalıştı. Çok iyi yapılmış
Kendim denerken hemen bir bug’a denk geldim. Slider’ı 100 - 100 konumuna sürükledikten sonra 99 - 99 yapmaya çalışınca olmuyor
99 - 100’den de gidilemiyor, 98 - 99’dan da gidilemiyor. 99 - 99’a ulaşmanın tek yolu alt sınırı 98’in altına çekmek
98 - 99 durumundayken 97 - 99’a indirirseniz o zaman 99 - 99’a gidilebiliyor
Bu bug her yerde ortaya çıkabilir; 99 - 99 yalnızca slider’ın ucuna yakın olduğu için en kolay yeniden üretilebilen durum. Genel olarak herhangi bir X - X durumunda uçlardan birini 1 adım oynatırsanız, diğer ucu o boşluğun içine çekemiyorsunuz. Aralığı kapatmak için önce diğer ucu daha uzağa sürüklemeniz gerekiyor
Rapor için teşekkürler, mutlaka düzelteceğim
Bunun yerine başka bir görsel bug var. 23-25’ten başlayıp 24-25’e sürükleyince 25’teki sağ tutamaç birkaç piksel hareket ediyor. Sol tutamacı tekrar 23’e getirince sağ tutamaç da geri dönüyor
Harika! HTML input’ta her zaman iki değerli aralık girişi uygulamasına ihtiyaç olduğunu düşünmüşümdür; çünkü oldukça mantıklı
Örneğin “en az X, en fazla Y widget’a sahip ürünleri filtrelemek istiyorum” gibi kullanım senaryoları var
Ancak Firefox’ta vurgulamak istediğim bir bug buldum. Minimum veya maksimum tutamacına her tıkladığınızda değer bir adım yukarı ya da aşağı değişiyor
Tutamacın tam ortasına tıklamaya çalışırsanız değer değişmiyor; ama biraz soluna tıklarsanız seçili değer bir adım azalıyor, biraz sağına tıklarsanız artıyor
Beklenen davranış, değerin yalnızca düğmeyi basılı tutup fare imlecini gerçekten hareket ettirdiğiniz açık bir değiştirme eylemi yaptığınızda değişmesi
Firefox bu tıklamaları track’e doğrudan tıklanmış gibi yorumluyor. Bu kütüphane buna hiç müdahale etmiyor; bu yalnızca Firefox’un çalışma biçimi
Klavye ile çalışması harika. Doğru çalışıyor; Shift-Tab’e basılı tutarsanız geriye de gidebiliyorsunuz
Gerçekten iyi yapılmış; çok küçük bir ayrıntı ama bu etkileşimi doğru uyguladığınız için teşekkürler
Bizim şirketin tasarım sisteminde de bir stajyer buna benzer yan yana yerleştirilmiş bir kavram kanıtı yapmıştı; ama input’lardan birinin pikselleri sürekli hafifçe zıplıyordu ve sonunda düzgün yapamadı
Bu yüzden ikinci bir stajyer üst üste bindirilmiş 2 input range kullanan bir çözüm ortaya koydu
Aralık girişi gerektiğinde hep jQuery UI slider kullanıyordum ve tek bir slider için sayfaya jQuery ile jQuery UI eklemek zorunda kalıyordum. Bu gerçekten güzel
Düzenleme: ESM modülü yerine doğrudan kullanılabilecek normal bir JS dosyasını önceden oluşturma ihtimali var mı?
"export default"satırını kaldırmanız yeterlihttps://cdn.jsdelivr.net/npm/@stanko/dual-range-input@0.9.8/...
CSS’i de unutmayın
https://cdn.jsdelivr.net/npm/@stanko/dual-range-input@0.9.8/...
Bug’ı burada bildirmek uygun mu bilmiyorum. İlk iki örnekteki tutamaçlar dokunma etkileşimini yakalayıp kaydırmayı engelliyor. Sonraki üç örnekte böyle değil
Bunun yan etkisi olarak parmağın altındaki etiketi görünür kılmak için yukarı sürükleyemiyorsunuz; sayfa kayıyor ve etiket parmağın altında kalmaya devam ediyor
Hangi tarayıcı ve işletim sistemini kullandığınızı merak ediyorum. Bu kütüphane native input kullandığı için kaydırmayı engelleme konusunda hiçbir şey yapmıyor
iOS telefonumda, stil uygulanmış olsun olmasın, tüm
input[type=range]öğelerinde kaydırma engelleniyor[1] https://github.com/Stanko/dual-range-input/issues
“Native” kısmı tartışmaya açık. Kütüphanenin iki native HTML range input kullandığı, bu yüzden native etkileşim ve erişilebilirlik özelliklerinin korunduğu söyleniyor; ama benim ölçütüm net
Amaçlandığı gibi çalışması için JavaScript gerekiyorsa artık native değildir
Yine de yazarın ne demek istediğini anlıyorum. JS ile hareket eden bir div yığını doğrudan uygulamak yerine normal slider’ları birleştirdiği için native çözüme çok daha yakın. Akıllı CSS JavaScript’in yerini alamıyorsa, muhtemelen mümkün olan en yakın yol bu
Native olup olmamasından bağımsız olarak, böyle bir widget kullanılabilir olduğunda çok faydalı ve bu alanda uygulama eksikliği vardı
popoverözelliği çıkmadan önce JavaScript olmadan hiç açılamıyorduAyrıca form doğrulama gibi tarayıcının iç doğrulama araçlarını hiç kullanmayan kütüphanelerden ayrı değerlendirmeye değer native vanilla JavaScript yöntemleri de var
https://spodj.intermer.net/ sitesini yaparken böyle bir şey arıyordum
İhtiyacım olan işlevi elde etmek için React’i beceriksizce kullanmak zorunda kaldım; frontend geliştirmede iyi olmadığım için böyle oldu