Dialog

Kalıcı iletişim kutusu, bir web sayfasında bulunan özel bir pop-up kutusu türüdür: kullanıcının kendisine odaklanmasını engelleyen bir pop-up. İletişim kutusu oluşturmak için bazı geçerli kullanım alanları vardır, ancak bunu yapmadan önce dikkat edilmesi gereken çok nokta vardır. Kalıcı iletişim kutuları, kullanıcıları belirli içeriğe odaklanmaya zorlar ve en azından geçici olarak sayfanın geri kalanını göz ardı eder.

İletişim kutuları kalıcı (yalnızca iletişim kutusundaki içerikle etkileşim kurulabilir) veya modal (iletişim kutusu dışındaki içeriklerle etkileşime geçmek mümkündür) olabilir. Kalıcı iletişim kutuları sayfa içeriğinin geri kalanının üstünde görüntülenir. Sayfanın geri kalanı inert olarak görünür ve varsayılan olarak yarı şeffaf bir arka plan ile gizlenir.

İletişim kutusu oluşturmak için kullanılan anlamsal HTML <dialog> öğesi; anlamlar, klavye etkileşimleri ve HTMLDialogElement arayüzünün tüm özellikleri ile yöntemleriyle gelir.

Aşağıda, kalıcı <dialog> örneği verilmiştir. "Kalıcı iletişim kutusunu aç" düğmesi olan iletişim kutusunu açın. İletişim kutusunu açtıktan sonra kapatmanın üç yolu vardır: Escape tuşu, formmethod="dialog" ayarı olan bir düğmeyle form gönderme (veya formda method="dialog" seçeneği belirlenmişse) ve HTMLDialogElement.close() yöntemi.

HTMLDialogElement üç temel yönteme ve HTMLElement'dan devralınan tüm yöntemlere sahiptir.

dialog.show() /* opens the dialog */
dialog.showModal() /* opens the dialog as a modal */
dialog.close() /* closes the dialog */

Bu <dialog>, HTMLDialogElement.showModal() yöntemi ile açıldığı için kalıcı bir iletişim kutusudur. Kalıcı iletişim kutusunun açılması, iletişim kutusunun kendisi dışındaki her şeyi devre dışı bırakır ve belirsizleştirir. İletişim kutusunun dışında kullanıcı arayüzünün üzerine geldiğinizde tüm öğelerin, pointer-events: none; ayarlanmış gibi davrandığını görürsünüz. İletişim kutusunu açan düğme bile etkileşimlere yanıt vermez.

İletişim kutusu açıldığında odak, iletişim kutusuna taşınır. Odak, ilgili iletişim kutusunda sıralı klavyeyle gezinme sırasındaki ilk öğeye ayarlanır. tab tuşuna art arda basarsanız kalıcı iletişim kutusu açıkken yalnızca iletişim kutusundaki içeriğe odaklanılabilir. İletişim kutusu açık olduğu sürece kalıcı iletişim kutusunun dışındaki her şey durağandır.

Kalıcı veya kalıcı olmayan bir iletişim kutusu kapatıldığında odak, iletişim kutusunu açan öğeye döndürülür. Kullanıcı işlemine dayalı olmayan bir iletişim kutusunu programatik olarak açarsanız tekrar düşünün. Gerekirse odağın, özellikle kullanıcı etkileşimde bulunmadan iletişim kutusunu kapatırsa açılan iletişim kutusu açılmadan önceki yere geri verildiğinden emin olun.

Etkin iletişim kutuları dışındaki bir öğeyi ve tüm alt öğelerini devre dışı bırakmak için kullanılabilecek genel bir inert özelliği vardır. showModal() kullanılarak kalıcı bir iletişim kutusu açıldığında eylemsizlik veya devre dışı bırakma özellikleri ücretsiz olarak sunulur; özellik açıkça ayarlanmamıştır.

İletişim kutusu dışındaki her şeyi gizleyen arka planın stili, ::backdrop sözde öğesi kullanılarak ayarlanabilir. Arka plan, yalnızca .showModal() yöntemiyle <dialog> gösterildiğinde görüntülenir. Bu sözde öğe, FullScreen API kullanıldığında (ör. bir videoyu ekran veya monitörle aynı en boy oranına sahip olmayan tam ekran modunda izlerken) gösterilen arka plan da dahil olmak üzere tüm arka planlarla eşleşir.

Kalıcı iletişim kutuları

HTMLDialogElement.show() de benzer şekilde bir iletişim kutusu açar, ancak arka plan eklemeden veya herhangi bir şeyin durağanlaşmasına neden olmaz. Escape tuşu, modal olmayan iletişim kutularını kapatmaz. Bu nedenle, modal olmayan iletişim kutusunu kapatma yöntemi eklediğinizden emin olmanız daha da önemlidir. Bunu yaparken, diyalogun dışında kalan kısımlarda, odak noktasının iletişim kutusunu açan öğeye odaklanacağını fark edin. Bu öğe, en iyi kullanıcı deneyimi olmayabilir.

İletişim kutusunu kapatma düğmesi spesifikasyon tarafından resmi olarak zorunlu kılınmasa da bunu gerekli olarak düşünebilirsiniz. Escape tuşu kalıcı iletişim kutusunu kapatır ancak modal olmayan iletişim kutusunu kapatmaz. Odaklanabilen görünür bir düğme, erişilebilirliği ve kullanıcı deneyimini iyileştirir.

İletişim kutusunu kapatma

İletişim kutusunu kapatmak için HTMLDialogElement.close() yöntemine ihtiyacınız yoktur. JavaScript'e hiç ihtiyacınız yoktur. <dialog> öğesini JavaScript olmadan kapatmak için <form> üzerinde method="dialog" veya düğme üzerinde formmethod="dialog" ayarlarını yaparak iletişim yöntemi içeren bir form ekleyin.

Bir kullanıcı dialog yöntemiyle gönderim yaptığında, kullanıcı tarafından girilen verilerin durumu korunur. Gönderme etkinliği varken (novalidate ayarlanmadığı sürece form, kısıtlama doğrulamasından geçer) kullanıcı verileri silinmez veya gönderilmez. JavaScript'siz bir kapat düğmesi şu şekilde yazılabilir:

<dialog open>
  <form method="dialog">
    <button type="submit" autofocus>close</button>
  </form>
</dialog>

Bu örnekte, <button> kapanışında autofocus özelliğinin ayarlandığını fark etmiş olabilirsiniz. Bir <dialog> içinde ayarlanmış autofocus özelliğine sahip öğeler, sayfa yüklenirken odak almayacak (sayfa görünür iletişim kutusuyla yüklenmediği sürece). Ancak iletişim kutusu açıldığında odaklanır.

Varsayılan olarak, bir iletişim kutusu açıldığında iletişim kutusundaki farklı bir öğe autofocus özelliği ayarlanmamışsa iletişim kutusundaki ilk odaklanılabilir öğeye odaklanılır. Kapat düğmesinde autofocus özelliğinin ayarlanması, iletişim kutusu açıldığında odağın almasını sağlar. Ancak, <dialog> içinde autofocus dahil olmak üzere yalnızca çok dikkatli bir şekilde yapılmalıdır. Dizide, otomatik odaklanmış öğeden önce gelen tüm öğeler atlanır. Bu özelliği, odak noktası dersinde daha ayrıntılı olarak ele alacağız.

HTMLDialogElement arayüzü bir returnValue özelliği içerir. Bir formu method="dialog" ile gönderdiğinizde returnValue, formu göndermek için kullanılan gönder düğmesinden (varsa) name değerine ayarlanır. <button type="submit" name="toasty">close</button> yazmış olsaydık returnValue toasty olurdu.

Bir iletişim kutusu açıldığında boole open özelliği mevcuttur. Bu, iletişim kutusunun etkin olduğu ve etkileşim kurulabileceği anlamına gelir. .show() veya .showModal() yerine open özelliği eklenerek bir iletişim kutusu açıldığında iletişim kutusu kalıcı olur. HTMLDialogElement.open özelliği, iletişim kutusunun etkileşim için kullanılabilir olup olmamasına bağlı olarak true veya false değerini döndürür (kalıcı olup olmamasına değil).

İletişim kutusu açmak için tercih edilen yöntem JavaScript olsa da, sayfa yüklenirken open özelliğini dahil edip daha sonra bunu .close() ile kaldırmak, iletişim kutusunun JavaScript kullanılamadığında bile kullanılabilir durumda olmasına yardımcı olabilir.

Ek Bilgiler

tabindex kullanma

İletişim kutusunu açmak için etkinleştirilen öğe ve içerdiği kapat düğmesi (ve muhtemelen başka içerik) odağı alabilir ve etkileşimlidir. <dialog> öğesi etkileşimli değil ve odaklanmaz. tabindex özelliğini iletişim kutusunun kendisine eklemeyin.

ARIA rolleri

Örtülü rol: dialog. İletişim kutusu, onay veya başka bir kullanıcı yanıtı gerektiren önemli bir mesajı bildiren onay penceresiyse role="alertdialog" değerini ayarlayın. İletişim kutusu, erişilebilir bir ada da sahip olmalıdır. Erişilebilir özellikli ad için görünür metin sağlayabiliyorsa aria-labelledby="idOfLabelingText" özelliğini ekleyin.

CSS varsayılanları

Tarayıcıların dialog için varsayılan stil sağladığını unutmayın. Firefox, Chrome ve Edge, kullanıcı aracısı stil sayfalarında color: CanvasText; background-color: Canvas; ve Safari, color: black; background-color: white; değerini ayarlar. color öğesi body veya :root öğesinden değil dialog öğesinden devralınır. Bu beklenmedik bir durum olabilir. background-color özelliği devralınmaz.

Öğrendiklerinizi sınayın

Diyalog öğesi hakkındaki bilginizi test edin.

Diyaloğun arkasındaki alanın stilini nasıl belirlersiniz?

::background sözde öğesiyle.
Tekrar deneyin.
::backdrop sözde öğesiyle.
Doğru.
background mülküyle.
Tekrar deneyin.