CSS Nesting Nedir?

0 Hisse senetleri
0
0
0
0

giriiş

CSS ön işlemcisiyle çalışmış bir ön uç geliştiriciyseniz, muhtemelen iç içe yerleştirme özelliğiyle karşılaşmış veya kullanmışsınızdır. Bu popüler bir özellikti ve benim için CSS ön işlemcisi kullanmamı sağlayan özelliklerden biriydi.

Bu yıl, yerel CSS yerleştirme tüm büyük tarayıcılarda desteklendi: Chrome, Firefox ve Safari. Bu, CSS yazmayı kolaylaştıran temel bir CSS özelliğidir. Bu makalede, CSS yerleştirme hakkında şimdiye kadar öğrendiklerimi belgeleyecek ve bulgularımı kullanım örnekleri ve örneklerle birlikte sizinle paylaşacağım.

Heyecanınız ve odaklanmanız dışında uymanız gereken hiçbir ön koşul yok.

CSS'de yuvalama, birçok geliştirici için uzun zamandır beklenen bir özellikti. Eskiden Sass veya Less gibi CSS ön işlemcilerine güveniyorduk. Size kısaca bir genel bakış sunayım:

Aşağıdaki örneği ele alalım. .nav__item seçicisinde bir simgemiz var.

.nav__item {
.icon {
display: flex;
padding: 1rem;
}
}

Yukarıdaki kod geçerli bir Sass kodudur. Derlendiğinde tarayıcı için şöyle görünecektir:

.nav__item .icon {
display: flex;
padding: 1rem;
}

Yerel CSS iç içe yerleştirmeyle, aynı CSS olduğu gibi çalışacaktır. İşte yerel CSS iç içe yerleştirme ile tarayıcının DevTools'u arasındaki karşılaştırmayı gösteren bir şekil.

Tarayıcının CSS'i, CSS'de görüntülendiği gibi (neredeyse) nasıl görüntülediğine dikkat edin.

Bu CSS Sass'a derlenseydi, tarayıcı bunu aşağıdaki gibi görüntülerdi:

CSS Yuvalamanın Faydaları

Bana göre, iç içe CSS'i kullanışlı kılan geçerli nedenler var:

  • CSS'in okunması daha kolaydır.
  • Birlikte gruplama stili
  • Belirli stilleri sınırlama
  • Sınıfları veya kimlikleri olmayan HTML öğelerini şekillendirme.

CSS NESTING kuralları

CSS yuvalama konusunda sizi eğitmek için, çeşitli CSS sorunlarına dair görsel örnekler sunmaya ve yuvalamanın bunları çözmeye nasıl yardımcı olabileceğini göstermeye çalışacağım.

Öncelikle & işaretini (ampersand) öğrenmeniz gerekiyor. Bu sembolün gerekli olduğu birçok durum vardır.

Sınıf veya kimliği olmayan bir öğeyi iç içe yerleştirme

Bu örnekte, öğe <a> .nav__item ile biçimlendirilmiştir. CSS&#039;nin geçerli olması için &lt;head&gt; işaretinin kullanılması isteğe bağlıdır.

.nav__item {
  & a {
    display: block;
    padding: 1.5rem 1rem;
  }
}

/* Same as: */
.nav__item a {
}

Ayrıca onay işaretinden de çıkabilirsiniz:

.nav__item {
a {
display: block;
padding: 1.5rem 1rem;
}
}
/* Same as: */
.nav__item a {
}

Bunun yeni bir güncelleme olduğunu ve "Rahat CSS İç İçe Yerleştirme" olarak adlandırıldığını unutmayın. En son Chrome Canary ve Safari Teknoloji Önizleme sürümlerinde çalışır. Adam Argyle'ın Rahat İç İçe Yerleştirme hakkındaki bu gönderisine göz atın.

Bir öğeyi bir sınıfla iç içe yerleştirme

Öncekiyle aynı örneği ele alalım, ancak öğenin şu olduğunu varsayalım: <a> Bir HTML sınıfı var.

.nav__item {
.link {
display: block;
padding: 1.5rem 1rem;
}
}
/* Same as: */
.nav__item .link {
}

Burada sembol kullanmanıza gerek yok. Sınıf adı da gayet iyi iş görecektir.

CSS birleştiricilerini iç içe geçirme

CSS Native Nesting'in avantajlarından biri de kombinatör kullanımıdır. Bazı örneklere bakalım.

Aşağıdaki örnekte, aynı sınıfa sahip başka bir öğeden önce gelen .nav__item sınıfına sahip herhangi bir öğeyi seçmek istiyorum. Bu amaçla bitişik kardeş seçiciyi kullandım.

Yerel CSS iç içe yerleştirmede, bunu taklit etmek için "ve" simgesini kullanabiliriz. Dikkat ettiyseniz, bunu iki kez tekrarladım.

.nav__item {
& + & {
border-left: 2px solid;
}
}

Sihir, ve işaretinin ikinci yinelemesinde gerçekleşiyor. Burada tarayıcı, bitişik kardeş seçiciyi kullanmak istediğimi anlıyor. Bunu gösteren bir şekil göstereyim:

İç içe yerleştirmenin bir başka örneği de çocuk birleştiricisidir. Bir öğenin doğrudan çocuğunu seçebilir.

.nav__item {
> a {
padding: 1rem;
}
}

Ampersand sembolü

.nav__item {
& a {
color: blue;
}
}

Bu, orijinal CSS iç içe yerleştirme spesifikasyonunda gerekliydi. Safari TP 179+ ve Chrome Canary 120'de, iç içe yerleştirilmiş öğeler için "ve" işareti artık gerekli değildir.

Sonuç olarak aşağıdaki çalışmalar ortaya çıkmaktadır:

.nav__item {
a {
color: blue;
}
}

Tek sorun, işaretlemeyi ve işaretlemeyi içermesi gereken şartnamenin önceki sürümüne geri dönmeniz gerekmesidir.

Örneklerle iç içe geçirme: Etkin, Odaklanma, Gezinme

:active, :focus ve :hover kullanıcı eylemiyle etkinleştirilen CSS sözde sınıflarıdır.

CSS iç içe yerleştirme ile, kod tekrarını önlemek için hepsini aynı anda iç içe yerleştirebiliriz. Örnek olarak :hover'ı ele alalım:

button {
&:hover {
background-color: var(--bg-color);
}
&:focus {
outline: solid 2px;
}
}

Yuvalama için ön işlemci kullanıldığında fark, tarayıcının bunu aşağıdaki gibi işlemesidir:

button:hover {
background-color: var(--bg-color);
}
button:focus {
outline: solid 2px;
}

CSS yuvalamanın Chrome, Safari ve Firefox'ta nasıl görüntülendiğine bir bakalım.

CSS nesting için DevTools UX hakkında bazı düşüncelerim var ve bunları makalenin ilerleyen kısımlarında ele alacağım.

Örneklerle İç İçe Yerleştirme: İçerik Gönderme

İç içe CSS'i test etmenin ilk örneklerinden biri, bir gönderinin gövde içeriğini biçimlendirmektir. Başlıklar, metinler, görseller, alıntılar ve daha fazlasını içeren bir makale düşünün.

Manşetler

Başlıkları genellikle aşağıdaki gibi biçimlendiriyoruz:

.post-content h1,
.post-content h2,
.post-content h3,
.post-content h4 {
/* styles here */
}

İç içe CSS ile daha kolay:

.post-content {
h1,
h2,
h3,
h4 {
color: var(--heading-color);
font-weight: var(--heading-font-bold);
margin-bottom: var(--size-2);
}
}

Aynı şeyi :is() seçicisini kullanarak da yapabiliriz.

.post-content {
:is(h1, h2, h3, h4) {
color: var(--heading-color);
font-weight: var(--heading-font-bold);
margin-bottom: var(--size-2);
}
}

Paragraf öğesi

Yaygın bir durum, bir paragrafın içindeki bir bağlantının biçimlendirilmesidir. Bu durumda, CSS iç içe yerleştirme harika çalışır.

.post-content {
& p {
color: var(--color-black);
& a {
font-weight: bold;
text-decoration: underline;
}
}
}

Bağlantının ayrıca bir gezinme veya odaklanma efektine ihtiyacı olabilir.

.post-content {
& p {
color: var(--color-black);
& a {
font-weight: bold;
text-decoration: underline;
&:hover {
/* hover styles */
}
}
}
}

Medya sorgularını da iç içe geçirebiliriz.

.post-content {
& p {
/* base styles */
@media (min-width: 400px) {
/* do something */
}
}
}

Bazı durumlarda, bir CMS bir unsur olabilir <p> başka bir öğeye sarın ve stil amaçları için yalnızca doğrudan öğeler için kullanılmalıdır <p> Stilini belirle.

.post-content {
/* Select the direct <p> elements */
> p {
/* base styles */
}
}

Blok alıntı

Bu örnekte, alıntı kendi özel stilini alır ve öğe <p> Alıntı içerisinde alt kenar boşluğunu sıfırlamak için seçin.

.post-content {
& blockquote {
/* custom quote styling */
& p {
margin-bottom: 0;
}
}
}

Gönderi şekli

Gönderi formu bir resim ve bir

Resim açıklamasını göstermek isteğe bağlıdır.

Benim örneğimde, eğer

Bir başlığı var, onu farklı bir şekilde biçimlendirmem gerekiyor. Bu, CSS'de :has() komutu kullanılarak mümkün.

.post-content {
& figure {
& img {
/* the figure's image styles */
}
/* changes to the <figure> container, if it has a figcaption element */
&:has(figcaption) {
display: flex;
align-items: start;
}
& figcaption {
/* caption styling */
}
}
}

Gönderi listesi

Sonuncusu hariç tüm liste öğelerine kenarlık eklemem gerekiyor. Bu amaçla :not() seçicisini kullandım.

.post-content {
li {
&:not(:last-child) {
border-bottom: 1px solid;
}
}
}

:not() fonksiyonunu kullanabilmek için, önüne bir ve işareti eklememiz gerekir.

Başlıklar için özel aralık

Aşağıdaki mesafe olmalıdır <h3> Ve <h4> Bunlardan birinin ardından bir kod parçası gelirse azaltacağım.

.post-content {
& h3 + [class*="language-"],
& h4 + [class*="language-"] {
margin-top: 0.5rem;
}
}

Bu pratik örnekte gördüğünüz gibi, özellikle CSS ön işlemcisi geçmişiniz varsa, CSS yuvalama kullanmak basittir.

Örnekle iç içe geçirme: Kart bileşeni

İstenilen stilleri elde etmek için CSS yuvalama kullanan basit bir kart bileşenini göstereceğim.

Varsayılan veya temel stillere sahip bir .card öğesi olduğunu varsayarak, iç içe CSS kullanımını göstereceğim.

.card {
/* default card styles */
}

İÇ İÇE KONTAYNER SORGULARI

Eğer konteyner genişliği 400px'den büyükse, kartın esnek bir konteynera dönüşmesini istiyorum.

.card {
/* default card styles */
/* if the container width is 400px or bigger */
@container card (min-width: 400px) {
display: flex;
}
}

Bir paragraf öğesinin stilini belirleme

Paragraf öğesini şu şekilde kullanmak istiyorum: <h3> Bu şekilde elemana kenar boşlukları ve dolgu uygulayabilirim. <p> Ekleyeceğim. Eğer orada değilse, kullanıcı arayüzünde ekstra boşluk olmayacaktır.

.card__content {
& h3 + p {
border-top: 1px solid #000;
padding-top: 0.5rem;
margin-top: 0.5rem;
}
}

Konteyner genişliği 400 piksel veya daha fazla olduğunda, .card__content öğesi de esnek bir konteynere dönüştürülmelidir.

.card__content {
& h3 + p {
border-top: 1px solid #000;
padding-top: 0.5rem;
margin-top: 0.5rem;
}
@container card (min-width: 400px) {
display: flex;
flex-direction: column;
justify-content: center;
}
}

Örnekle iç içe yerleştirme: Form girişi

Yaygın bir durum, giriş yer tutucusunun biçimlendirilmesidir. Sorun, her tarayıcı sağlayıcısının kendi önekinin olmasıdır (ha, 2023).

Önek stilleri iki nokta üst üste gerektirdiğinden & simgesini kullanmalıyız, aksi takdirde stiller bozulur.

input {
--placeholder-color: #969696;
/* other styles */
&::-webkit-input-placeholder {
color: var(--placeholder-color);
}
&::-moz-placeholder {
color: var(--placeholder-color);
opacity: 1;
}
&:-moz-placeholder {
color: var(--placeholder-color);
}
}

İç içe CSS kullanmak ile ön ek stilini doğrudan onsuz yazmak arasındaki farkın ne olduğunu merak ediyor olabilirsiniz.

/********** Option 1: native nesting **********/
input {
&::-webkit-input-placeholder {
color: var(--placeholder-color);
}
}
/********** Option 2: without nesting **********/
input::-webkit-input-placeholder {
color: var(--placeholder-color);
}

İkisi arasında hiçbir fark yoktur. İkisinin de özellikleri aynıdır (0, 1, 1).

Örnekli İÇ İÇE GEÇME: Bir Öğeyi Üst Öğesi Üzerinden Stillendirme

CSS iç içe yerleştirmeyi kullanarak, bir alt öğenin stilini, bulunduğu yere göre değiştirebiliriz. Örneğin, bir .button öğesi bir .box üst öğesinde bulunuyorsa, tüm genişliği kaplamalıdır.

<div class="box">
<h2>Get access to all features</h2>
<p>Create an account now and get access to all exclusive features.</p>
<a href="/offer" class="button">Create an account</a>
</div>
.button {
.box & {
width: 100%;
}
}
/* equivalent to */
.box .button {
}

CSS Nesting'i Keşfederken Gördüğüm Hatalar

İmzalanmamış genel seçiciyi kullanma

Diyelim ki bir kartımız var ve içindeki tüm öğeleri seçmek istiyoruz. CSS Yerel İç İçe Yerleştirme ile bu işe yaramalı:

.card {
* {
/* styles here */
}
}

Bunun Chrome Stable'da çalışmadığını, ancak Chrome Canary 121, Safari 17.1 ve Firefox 119'da sorunsuz çalıştığını fark ettim.

Çözüm noktalama işaretini eklemektir.

.card {
& * {
/* styles here */
}
}

İmzalanmamış veri niteliklerini kullanma

Bu konuda, onay işareti olmayan bir veri niteliğinin seçilmesi beklenen sonucu vermemektedir.

.card {
[data-type="featured"] {
/* styles here */
}
}

Chrome Stable'da çalışmadığını fark ettim, ancak Chrome Canary 121, Safari 17.1 ve Firefox 119'da gayet iyi çalışıyor.

Bunu düzeltmek için bir virgül eklememiz gerekiyor:

.card {
&[data-type="featured"] {
/* styles here */
}
}

Bu hataların her ikisi de Chrome Canary'de rahat CSS yerleştirme sürümünde düzeltildi.

CSS yuvalama desteğini belirleme

@supports, CSS iç içe yerleştirme desteğini kontrol etmek için kullanılabilir. Bizim durumumuzda, tarayıcının "ve" işaretini tanıyıp tanımadığını kontrol etmek istiyoruz.

@supports selector(&) {
.post-content {
& h2 {
/* styles here. */
}
}
}

Bramus'un bu Codepen'inde destek tanımlamaya yönelik diğer seçenekleri keşfedebilirsiniz.

Bugün, iç içe CSS'i normal CSS'e derleyen PostCSS iç içe yerleştirme eklentisini kullanacağım. Kullanımı güvenli olduğunda eklentiyi kaldıracağım.

CSS Yuvalama için DevTools UX

Tarayıcı DevTools'unda CSS yerleştirme için kullanılan mevcut kullanıcı deneyiminin büyük bir hayranı değilim.

DevTools'da CSS yuvalamanın nasıl olmasını istediğime dair birkaç öneriyi incelediğim ayrı bir makale üzerinde çalıştım.

Sonuç

CSS Nesting, CSS yazımını iyileştiren önemli bir özelliktir. Şu anda Nesting kullanmak mümkündür, ancak destek henüz yeni olduğu için hedef kitlenize karşı dikkatli olmanız gerekir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ayrıca Şunları da Beğenebilirsiniz