Yayın tarihi: 6 Kasım 2024
Chrome 131'den itibaren <details> ve <summary> öğelerinin yapısını stilize etmek için daha fazla seçeneğiniz var. Artık açıklama veya akordeon widget'ları oluştururken bu öğeleri kullanabilirsiniz.
Özellikle Chrome 131'de yapılan değişiklikler, bu öğelerde display özelliğinin kullanılmasını sağlar ve genişleyen ve daralan kısmı stilize etmek için ::details-content sözde öğesini ekler.
<details> öğesinde display ayarını yapma
Geçmişte <details> öğesinin görüntüleme türünü değiştirmek mümkün değildi. Bu kısıtlama artık kaldırıldı. Örneğin, <details> öğesinde ızgara veya esnek düzenler kullanabilirsiniz.
Aşağıdaki örnekte exclusive accordion, yan yana yerleştirilmiş birkaç <details> öğesinden oluşmaktadır. <details> öğelerinden biri genişletildiğinde içeriği <summary> öğesinin yanına yerleştirilir.
Demo
Kayıt
Bu, <details> öğesinde esnek düzen kullanılarak ve aşağıdaki CSS kullanılarak elde edilir:
details {
display: flex;
flex-direction: row;
}
grid gibi diğer görüntüleme değerlerine de izin verilir.
display: inline kullanımıyla ilgili not
Beklenmedik bir sonuç verebilecek display değeri inline'dir. Çalışmadığı için değil, HTML ayrıştırıcı sınırlamaları nedeniyle.
Bir paragrafın içine <details> öğesi yerleştirildiğinde, HTML Standardı'nın 13.2.6.4.7 bölümünde tanımlandığı gibi HTML ayrıştırıcısı önce açık paragrafı kapatmaya zorlanır:
Etiket adı şu öğelerden biri olan bir başlangıç etiketi: "address", "article", "aside", "blockquote", "center", "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul"
Açık öğeler yığınında düğme kapsamında bir p öğesi varsa p öğesini kapatın. Jeton için bir HTML öğesi ekleyin.
Bu nedenle, display: inline ayarını yapmış olsanız bile <details> akışı engelleme yönünde olur.
Örneğin, aşağıdaki işaretleme
<p>Hello <details>…</details> world</p>
Ayrıştırmadan sonra şu hale gelir:
<p>Hello </p><details>…</details> world<p></p>
Chrome Geliştirici Araçları'nı kullanarak ayrıştırılmış işaretlemeyi inceleyerek bu demoda kendiniz görebilirsiniz.
Bu durumun yalnızca <details> öğesinin <p> öğesinin içine yerleştirilmesi için geçerli olduğunu unutmayın. display: inline simgesini <div> içindeki <details> üzerinde kullanmak sorunsuz çalışır.
::details-content sözde sınıfı
Tarayıcılarda <details> öğesi, Shadow DOM kullanılarak uygulanır. Özette bir <slot> (varsayılan özet alt öğesiyle) ve kalan tüm içeriklerde bir <slot> bulunur. Bu, <summary> öğesi hariç <details> öğesinin tüm alt öğeleri anlamına gelir.
<details>
↳ #shadow-root (user-agent)
<slot id="details-summary">
<summary>Details</summary>
<!-- The summary goes here -->
</slot>
<slot id="details-content">
<!-- All content goes here -->
</slot>
</details>
<details> üzerinde daha fazla görüntüleme türü kullanmanın yanı sıra içerik alanı artık ::details-content sözde öğesi kullanılarak da hedeflenebilir. <details> öğesinin içeriğini sarmalayan kapsayıcıyı biçimlendirmek için bu sözde öğeyi kullanabilirsiniz.
details::details-content {
border: 5px dashed hotpink;
}
Ayarlanan stili yalnızca <details> öğesi açık durumdayken uygulamak için [open] seçiciyi önüne ekleyin.
[open]::details-content {
border: 5px dashed hotpink;
}
<details> öğesi [open] durumundayken yalnızca ::details-content sözde öğesine stil uygulamanız önerilir.
Demo
Kayıt
::details-content öğesinin display türü, UA stil sayfasında block olarak ayarlanmıştır. Daha önce ise display: contents olarak ayarlanıyordu. Bu değişiklik, height: 100%'ya dayalı açıklanmış içerikler gibi bazı durumlarda aleyhinize çalışabilir. Bu durum sizin için sorun teşkil ediyorsa display türünü tekrar contents olarak ayarlayarak bu sorunu giderebilirsiniz. Örneğin: details[open]::details-content { display: contents; }.
::details-content sözde öğesine animasyon ekleme
<details> öğesinin içeriğini genişlerken animasyonlu hâle getirebilirsiniz. Aşağıdaki örnekte genişlik, 0px değerinden 300px değerine animasyonla değiştiriliyor.
::details-content {
transition: width 0.5s ease, content-visibility 0.5s ease allow-discrete;
width: 0;
}
[open]::details-content {
width: 300px;
}
width özelliğinin yanı sıra content-visibility özelliği de taşınmalıdır. Bunun nedeni, User-Agent stil sayfasında tanımlandığı gibi, değerinin açılmamış ve açılmış durum arasında değişmesidir. Bu özellik ayrı ayrı animasyon oluşturulabilen bir özellik olduğundan çalışması için allow-discrete anahtar kelimesini kullanmanız gerekir.
Daha önce paylaşılan özel akordeon demosuna eklenen sonuç şu şekilde olur:
Demo
Kayıt
height simgesi de animasyonlu olabilir. height: auto animasyonunu kullanmak için interpolate-size veya calc-size() kullanmanız gerekir. Ayrıca, içeriğin ::details-content sözde öğesinden taşmasını önlemek için overflow: clip uygulayın.
::details-content {
transition: height 0.5s ease, content-visibility 0.5s ease allow-discrete;
height: 0;
overflow: clip;
}
/* Browser supports interpolate-size */
@supports (interpolate-size: allow-keywords) {
:root {
interpolate-size: allow-keywords;
}
[open]::details-content {
height: auto;
}
}
/* Fallback for browsers with no interpolate-size support */
@supports not (interpolate-size: allow-keywords) {
[open]::details-content {
height: 150px;
overflow-y: scroll; /* In case the contents should be taller than 150px */
}
}
Material UI'ın akordeonundan esinlenerek oluşturulan aşağıdaki demoda kodu çalışırken görebilirsiniz. Her bir <details> öğesinin içeriği güzel bir şekilde animasyonla gösterilir.
Demo
Kayıt
::details-content desteği olmayan tarayıcılarda bileşen sorunsuz çalışmaya devam eder. Ziyaretçilerin görmediği tek şey animasyondur.
Özellik algılama
CSS'de ::details-content sözde öğesi için özellik algılama desteğini kullanmak üzere aşağıdaki snippet'i kullanın.
@supports selector(::details-content) {
…
}
Bu algılamayı, ziyaretçinizin kullandığı tarayıcının ek görüntüleme değerlerini destekleyip desteklemediğini anlamak için de kullanabilirsiniz.
Erişilebilirlikle ilgili dikkat edilmesi gereken noktalar
::details-content sözde öğesinin kullanıma sunulması ve görüntüleme türünü değiştirme özelliği, <details> öğesinin erişilebilirliğini etkilemez.
En azından Chromium tabanlı tarayıcılarda ve HTML Standardı'na göre, <details> öğesi aranabilir ve tarayıcı, sayfada bulma, ScrollToTextFragment ve öğe parçası gezinme işlemlerine yanıt olarak gizli içeriklerine kaydırmaya çalıştığında otomatik olarak genişler. Bu durum değişmez.
Ancak, özel akordeonları kullanmadan önce kullanıcılar için yararlı mı yoksa zararlı mı olduğunu göz önünde bulundurun. Özel bir akordeon kullanmak içeriğin kapladığı görsel alanı azaltır ancak kullanıcıların tüm bilgileri tüketmek için birçok öğeyi açması gerekebilir. Bu durum, aynı anda birden fazla öğeye bakmak isteyen kullanıcıları rahatsız edebilir.
İşaretçiyi stilize etme
Gecko ve (mevcut) Chromium'un kullandığı bir yaklaşım ile WebKit'in (daha önce Chromium ile paylaşılan) kullandığı bir yaklaşım olmak üzere iki farklı yaklaşım olduğundan liste işaretçisinin stilini belirleme şu anda birlikte çalışılamaz.
Özellik birlikte çalışabilir hale geldiğinde, işaretçinin stilini nasıl belirleyeceğiniz konusunda size daha fazla kontrol olanağı sunmayı amaçlıyoruz.
Daha fazla demo
Son olarak, inceleyebileceğiniz diğer bazı demoları aşağıda bulabilirsiniz. Hepsi ::details-content kullanıyor.
UIKit Accordion
Demo
Kayıt
Bu demo, UIKit Accordion'dan sonra oluşturulmuştur. Kod, daha önce paylaşılan Material UI akordeon koduyla neredeyse aynıdır.
Kısmen açılan açıklama widget'ı
Demo
Kayıt
Bu demoda, içeriği ekranda zaten görünür olan, kısmen açılmış bir açıklama widget'ı yer alıyor. Bunu sağlamak için content-visibility her zaman visible olarak ayarlanır. Hesaplama yapıldığından height, calc-size() kullanılarak animasyonlu hale getirilir.
::details-content {
content-visibility: visible; /* Make it always visible */
transition: height 0.5s ease;
height: 150px;
overflow: clip;
}
[open]::details-content {
height: calc-size(auto, size + 0.5rem); /* calc-size because we need to add a length */
}
Stil oluşturma kolaylığı için içerik bir sarmalayıcı div'e yerleştirilir. Sarmalayıcı div'e padding gibi düzen stilleri uygulanır ve ::details-content sözde öğesi animasyonlu hale getirilir.