Bu makaleyi Safari (15.4) tarayıcısının dialog elementi desteği gelmesi sonrası yazmaya karar verdim. Genel olarak bir işi standartlarla yapabiliyorsam onu tercih ederim. Bu konuda en müzdarip olduğum element <select> elementidir. Tasarımcıların birçok farklı düşüncelerine karşı select elementine bizim müdahale edeceğimiz yerler kısıtlıdır. Her ne kadar ısrar etsek te tasarıma uymak için özel select kütüphanelerine yönelmek zorunda kalıyoruz. Benzer durum dialog/modal/popup için de geçerli. Tabi uzun süre bu işi yapacak bir HTML elementi olmadığı için normal olarak başka yollarla bu işi çözdük.

<dialog> elementi modal ve pop-up olarak adlandırdığımız yapıları kolayca ve bir HTML elementi olarak kodlamamıza olanak sağlar.

En basit hali aşağıdaki gibidir.

<dialog>
  <h3>Konum bilginizi almak için izin istiyoruz</h3>
  <p>Bizimle konumunuzu paylaşır mısınız?</p>
  <div class="actions">
    <button>Tamam</button>
    <button>Kapat</button>
  </div>
</dialog>

Başlangıç durumunda bu içerik sayfada görüntülenmez. Eğer sayfa ilk açılışında görünür olmasını istiyorsak

<dialog open>
...
</dialog>

Sadece open özniteliğini eklemek yeterli oluyor.

Js ile açma kapama

Evet yukarıdaki kodu ekledik. Peki bu modal’ı nasıl açıp kapatacağız. Tabi ki basit iki javascript metoduyla

const openModal = document.querySelector('.open-model');
const closeModal = document.querySelector('.close-modal');
const locationModal = document.getElementById('location-modal');

openModal.addEventListener('click', () => {
  locationModal.showModal();
});

closeModal.addEventListener('click', () => {
  locationModal.close();
});

showModal() ve close() metodlarıyla açma kapa işini kolayca yapabiliyoruz.

showModal() yerine show() metodunu kullanırsak içerik modal olarak değil normak içerik olarak ta sayfa içinde açtırabiliyoruz.

Stil tanımları

<dialog> elementi normal bir HTML elementi gibi stillendirilebilir. Başlangıçta siyah bir kenar çizgisi, içeriğe göre genişlik ve backdrop olmadan gelir. Biz bu tanımları yaparak istediğimiz gibi modal stilleri kodlayabilriz.

dialog::backdrop {
  background: rgba(0,0,0, .5);
}

::backdrop sözde sınıfı yardımıyla modal arkasını istediğimiz gibi stillendirebiliyoruz.

dialog[open] {
  display: flex;
  flex-direction: column;
  animation: lastik .15s cubic-bezier(0, 1.8, 1, 1.8);
}

Yukarıdaki tanımla da modal açılırken istediğimiz animasyonu verebiliyoruz.

Form içeren dialog elementi

Modal içinde form alanlarını kullandığında formun method kısmına method="dialog" tanımlanarak formun gönderildiği durumlarda modal’ında kapanması sağlanır. Form değerini modal’a returnValue olarak geri döner.

closeModal.addEventListener('click', () => {
  locationModal.close();
  outputBox.value = locationModal.returnValue + " modal kapandı - " + (new Date()).toString();
});

Tüm yukardaı anlattıklarımız bir örnek ile uygularsak.

Sonuç

Her zaman standartta olan ögeleri kullanmak bize avantaj sağlar. Tabi gereksinimler bazen farklı yollara itebilir bizi.

Genel olarak <dialog> elementinin artıları

  • Her zaman içeriğin üstünde olacaktır. z-index değeri 99999 olan div’den bile üstte
  • Klavyede hazır tanımlıdır. Enter ile açılır, esc ile kapanır
  • Farklı araçlarda erişebilirlik açısından önemli artıları vardır.
  • Kullanıcı tercihlerine sadık kalır. Karanlık mod durumları mesela
  • Özel stil tanımlarına izin verir.
  • İçeriğinde form kullanılması durumu için farklı davranış desteği vardır.
  • Kullanım basitliği vardır.

Gördüğüm tek negatif yöne

  • Genel modal deneyimlerimizde yapmak istediğimiz backdrop’a tıklayınca modal’ın kapanması durumunu yapamıyoruz. Bu durum kullanıcı deneyimi için bir ihtiyaç mıdır? Tartışılır. Bu konuda Ercüment Laçın bir çözüm gönderdi gayet güzel. Teşekkür edip kodunu paylaşıyorum.
 locationModal.addEventListener("click", event => {
    const rect = locationModal.getBoundingClientRect();
    if (event.clientY < rect.top || event.clientY > rect.bottom ||
        event.clientX < rect.left || event.clientX > rect.right) {
        locationModal.close();
    };
});

Tarayıcı Desteği

Chrome explorer Firefox
+ - +

Mobil Tarayıcılar

Chrome Mobil Safari Samsung Internet
+ + +

Kaynaklar

Bu tanımın ortaya çıkışının sebebi: Geliştiriciler tarayıcıların otomatik tanımladığı focus tanımlarının yapılan tasarıma uymadığı veya tam olarak ne amaçla kullanıldığını bilmediği için silmesi ve bunun sonucu olarak erişilebilirlik sorunlarının çıkması.

.link:focus {
	outline: none;
}

Kodunu yazarak tanımlı olan odaklanma halindeki outline çizgisini kaldırıyorduk. Tabi bu erişilebilirlik için ciddi sorunlar oluşturuyor. Birçok site erişilebilirliği önemsemediği için yukarıdaki gibi kodlar yazarak işine devam ediyor.

Standart geliştiriciler bu durumları engellemek için yeni bir tanım geliştirdiler. focus-visible özelliği. focus-visible özelliğinin focus‘tan farkı kullanıcının kullandığı araca göre etki ediyor olması. Kullanıcı mouse ile geldi ise farklı klavyeden geldi ise farklı stil tanımlamamıza olanak sağlıyor.

Aşağıdaki login formu konuyu daha iyi anlamamıza yardımcı olacaktır.

İlk örnekte form içindeki tüm elemanlara focus tanımladık. Klavye ile de mouse ile de geldiğimizde aynı etkiyi yapıp outline çizgisini gösterdi.

İkinci örnekte ise focus ve focus-visible ayrı ayrı tanımladık. İlk örnekte tüm elemanlar her türlü outline gösterirken, ikinci örnekte sadece klavye ile odaklandığımızda outline gösterilmektedir.

.login-form :focus:not(:focus-visible) {
  outline: none;
}

.login-form :focus-visible {
  outline: 3px solid orange;
}

Burada şöyle bir kural var: Bir HTML elemanı klavye ile giriş alanı ise focus-visible tanımı olsa dahi outline çizgileri gösterilmeye devam ediyor. İkinci örnekte ki input[type="text"] elemanı bundan dolayı mouse ile de outline çizgisi göstermektedir.

En son Safari desteğinin de gelmesiyle tarayıcı desteği konusunda sorunu kalmadı.

Kaynaklar

Daha önce bu konuda iki adet yazı paylaşmıştım.

Bu konuda bu üçüncü yazım. Trendyol teknoloji olarak temelli evden çalışma kararını aldı. Tabi bu bazı tercihleri yapmamı kolaylaştırdı. Ek bazı ihtiyaçlar doğdu.

Çalışma ortamım

Soğutma (Samsung Wind-Free Klima)

Samsung klimaTamamen evden çalışma kararı sonrası çalışma odama bir klima almalıyım dedim. Geçen sene ki vantilatör deneyimim bu kararı almamda etkili oldu. Trendyol’un evden çalışma için açtığı 3.000 TL’lik ödeneğinin de yardımıyla Samsung Wind-Free 12000 BTU Inverter Duvar Tipi Klima aldım. Gayet memnunum telefon üzerinden yönetilebilmesi ve Google Home entegrasyonu ve asıl Wind-Free ile sizi çarpmadan serinletmesi güzel. Diğer kullandığım klimaya göre daha sessiz. Biraz pahalı. 9/10 Yeni 🟢

Webcam (Logitech Brio 4k Ultra Hd Webcam)

Logitech Brio 4kİlk evden çalışmaya başladığımda webcam almak çok mantıklı gelmiyordu. Hatta cep telefonlarımızın yeterli olduğunu düşünüyordum. Telefonu bilgisayarın web kamerası olarak tanımlamak adlı bir yazı da yazmıştım. Sonra evden çalışmanın sabitlenmesi ve görüntülü konuşmalarda ki artış nedeniyle bir tane webcam almak gerektiğini düşündüm. Murat Çorlu ve daha sonra Sercan Eraslan‘ın önerisiyle ben de Logitech Brio 4k Ultra Hd Webcam aldım. Her ne kadar toplantılarda karşıya 4k görüntü aktarmasa da ışığı ayarlayan yazılımı ve odaklanma performansı nedeniyle tercih ettim. Gayet memnunum. Biraz pahalı. 9/10 Yeni 🟢

Akıllı Priz

akıllı prizPrizlerin yetmemesi ve akıllı teknolojilerinin hayatımıza girmesiyle akıllı tekli priz almaktansa Aliexpress’ten 4’lü priz + 3 adet usb olan akıllı bir priz aldım. Telefon üzerinden kontrol etmek güzel. Ayrıca toplantı saatlerine ayarladığım otomatik ayarla ışığımı açması sayesinde toplantı hatırlatma özellği de var. USB’leri hızlı şarj destekli olduğu için o da ayrı bir avantaj. Çin’den 3 haftada gelmesi ayrı sevibdirdi beni. 9/10 Yeni 🟢

Elektrik destek sistemi

Elektrik kesintisinde modem çalıştırmaElektrik destek sistemi de nedir? Elektrikler gittiğinde internetin de gitmesi sorun. Elektrikler gidince bilgisayarın şarjı belli bir saat beni idare ediyor olması güzel. Burada sorunum internet ile ilgili, internetin kesilmesi beni mobil ağa yönlendiriyordu. Youtube’da elektrikler kesilse de modemi idare edebilecek sistemler konusunda 3-5 video seyrettikten sonra bende böyle birşey yapmalıyım dedim.

Üç parça alet aldım

Üçünü birleştirip bir destek sistemi oluşturdum. Şimdiye kadar bir kere lazım oldu ama elektrikler gittiğinde alternatif bir çözümümün olması beni rahatlatıyor. Ayrıca tümleşik çözümlere göre avantajı güç kaynağını başka amaçlar için de kullanabiliyorum.

Not: Fiber modemler ve Kablonet modemlerinde işe yaramıyor diyorlar.

Type-c 90 derece aparatı (Mykablo Type-c 90 Derece Dişi-erkek)

type-c 90MacOs bilgisayarımı mönitör kablosu ile şarj ediyorum. Yani hem görüntü aktarıp hem şarj için kullanıyorum. Ancak şöyle bir sorun oluyor; kablo direk makineye girdiği için sağdaki harici mönitörün önüne geliyordu. Bunun için Sercan2ın önerdiği şu aparatı aldım ve iş çözüldü.

Sandalye (Ikea MARKUS)

Geçen yazıda bahsettiğim sorunlar devam ediyor. Ancak kullandıkça biraz daha ısınıyorum. Biraz daha iyi bir alternatifi bulursam değiştirebilirim. Herman Miller, Mirra 2 gözüm var ama çok pahalı. 🟡 7/10

Mouse (Logitech MX Vertical Advance Ergonomic Mouse)

Hala tek geçeceğim fare. 10/10 Devam 🟢

Telefon Tututucu (Benks Masaüstü Telefon Tutucu)

Telefon tutucu ile de devam ediyorum. Şirketin gönderdiği ufak tahta telefon tutucu da gayet iş görüyor. 8/10 Devam 🟢

Monitör (Dell UltraSharp 24 USB-C U2419HC)

Daha büyükleri ve oval olanlar ilgimi çekse de bu da gayet iş görüyor. 8/10 Devam 🟢

Masa (Ikea BEKANT)

Ikea SKARSTA gibi yükseltilebilir olanı görsem yine alabilirim ancak bu da gayet güzel.

Devam 9/10 🟢

Kulaklık (Huawei FreeBuds 3 Bluetooth kulaklık)

Huawei kulaklıktan memnunum. Yenileri çıktı ama benim kullandığımın üzerine ek güzel bir özelliklerini göremedim. 9/10 Devam 🟢

İnternet (Vodafone Evde internet + Turkcell SuperBox)

Superbox’tan memnunum ancak fiyat vergiler dahil olunca 141 tl oldu. Bazı saatlerde hızda dalgalanmalar oluyor. Fiber bu mahalleye uzun süre gelmeyeceğini düşünürsek SuperBox’a mecburum.

Fiber gelmedi ama VDSL gelmiş bizim bölgeye onu alıp deneyeceğim. Gelmiş ama bizim buraya veremiyorlarmış. Ben yine Superbox + ADSL ile devam 6 / 10 🟡

Klavye (Apple 1. Nesil Kablosuz klavye)

Klavye konusunda çok rahatsız değilim. Ama pil sorunu ve ergonomi nedeniyle yeni bir arayış içindeyim. Bu sıralar ayrık mekanik klavyeler ilgimi çekiyor.

Fatih Kadir Akın’ın klavyeleri hoş ama ben kendim bunları yapamıyacağım için alırsam Çin’den almayı düşünüyorum. 6 / 10 🟡

Dizüstü Bilgisayar Standı (Dock Ağır Alüminyum Stabil Macbook Notebook Tam Ayarlı Büyük Laptop Standı)

Çok memnunum 9/10 Devam 🟢

Işık (SAYWİN Ring Light ve IKEA Tertial)

enter image description hereIşık konusunun önemini sonradan anladım. Kamera kararı sonrası daha da önem kazandı. Ikea’nın Tertial masa lambası hem uygun fiyatlı hemde gayet güzel ışık veriyor. Burada kullanırken lambayı ters çevirip duvara ışığı vurdurup daha yumuşak bir ışık alıyorum. 8 / 10 Devam 🟢

Kütüphane / raf / saklama alanı

Memnunum 8/10 Devam 🟢