İki rakip söz dizimi, hangisinin spesifikasyon adayı olarak desteklenmesi gerektiğini belirlemenize yardımcı olmanızı bekliyor.
CSS iç içe yerleştirme, CSS'nin bir kural kümesinin içine eklenmesine olanak tanıyan kullanışlı bir söz dizimi eklemesidir. SCSS, Less veya Stylus kullandıysanız bu durumun birkaç farklı versiyonunu görmüşsünüzdür:
.nesting {
color: hotpink;
> .is {
color: rebeccapurple;
> .awesome {
color: deeppink;
}
}
}
Ön işlemci tarafından normal CSS'ye derlendikten sonra aşağıdaki gibi normal CSS'ye dönüşür:
.nesting {
color: hotpink;
}
.nesting > .is {
color: rebeccapurple;
}
.nesting > .is > .awesome {
color: deeppink;
}
Bu söz diziminin resmi bir CSS sürümü üzerinde çalışıyoruz ve topluluğun yardımıyla bu tercihi netleştirmek istiyoruz. Bu yayının geri kalanında, söz dizimi seçenekleri tanıtılacak. Böylece, sonunda ankete katılmak için gerekli bilgilere sahip olacaksınız.
Neden yukarıda gösterilen tam iç içe yerleştirme örneği, CSS iç içe yerleştirme söz dizimi olamaz?
En popüler iç içe yerleştirme söz diziminin olduğu gibi kullanılamamasının birkaç nedeni vardır:
Belirsiz ayrıştırma
Bazı iç içe seçiciler tam olarak özelliklere ve ön işlemcilere benzeyebilir. Bu seçiciler, derleme sırasında çözümlenebilir ve yönetilebilir. Tarayıcı motorları aynı olanaklara sahip olmayacağından seçiciler hiçbir zaman gevşek bir şekilde yorumlanmamalıdır.Ön işlemci ayrıştırma çakışmaları
CSS'nin iç içe yerleştirme yöntemi ön işlemcileri bozmamalıdır veya mevcut geliştirici iç içe yerleştirme iş akışlarını bozmamalıdır. Bu durum, söz konusu ekosistemler ve topluluklar için rahatsız edici ve düşüncesizce olur.:is()bekleniyor
Temel iç içe yerleştirme için:is()gerekmez ancak daha karmaşık iç içe yerleştirme için gerekir. Seçici listeleri ve iç içe yerleştirme hakkında kısa bir giriş için 3. örneğe bakın. Seçici listesinin başlangıcında değil de bir seçicinin ortasında olduğunu düşünün. Bu gibi durumlarda, seçicileri başka bir seçicinin ortasında gruplandırmak için:is()gereklidir.
Karşılaştırdığımız öğelere genel bakış
CSS iç içe yerleştirme özelliğini doğru şekilde kullanmak istiyoruz. Bu nedenle, topluluğu da sürece dahil ediyoruz. Aşağıdaki bölümler, değerlendirdiğimiz üç olası sürümü açıklamaya yardımcı olacaktır. Ardından, karşılaştırma için bazı kullanım örneklerini inceleyeceğiz ve sonunda, genel olarak hangisini tercih ettiğinizi soran kısa bir anket olacak.
1. seçenek: @nest
Bu, CSS Nesting 1'de belirtilen mevcut söz dizimidir. Yeni iç içe seçicileri & ile başlatarak ekleme stillerini iç içe yerleştirmenin kolay bir yolunu sunar. Ayrıca, & bağlamını yeni bir seçicinin içine yerleştirmenin bir yolu olarak @nest özelliğini sunar. Örneğin, konuları yalnızca eklemediğiniz durumlarda bu özellikten yararlanabilirsiniz. Esnek ve minimaldir ancak kullanım alanınıza bağlı olarak @nest veya & hatırlamanız gerekir.
2. seçenek: @nest restricted
Bu, iki iç içe yerleştirme yöntemini hatırlama masrafını azaltmak için daha katı bir alternatiftir. Bu kısıtlı söz dizimi yalnızca @nest sonrasında iç içe yerleştirmeye izin verir. Bu nedenle, yalnızca ekleme kolaylığı sağlayan bir kalıp yoktur. Seçimdeki belirsizliği ortadan kaldırır, iç içe yerleştirme için hatırlaması kolay bir yöntem oluşturur ancak kısa ve öz olma özelliğini geleneksel yaklaşım lehine feda eder.
3. seçenek: Köşeli parantezler
@nest
Tekliflerle ilgili çift söz diziminden veya fazladan karmaşadan kaçınmak için Miriam Suzanne ve Elika Etemad, ek küme parantezlerine dayanan bir alternatif söz dizimi önerdi. Bu, yalnızca iki ek karakterle ve yeni @ kuralları olmadan söz dizimi netliği sağlar. Ayrıca, iç içe yerleştirilmiş kuralların, gerekli iç içe yerleştirme türüne göre gruplandırılmasına da olanak tanır. Bu sayede, benzer şekilde iç içe yerleştirilmiş birden fazla seçici basitleştirilebilir.
1. örnek: Doğrudan iç içe yerleştirme
@nest
.foo {
color: #111;
& .bar {
color: #eee;
}
}
@nest always
.foo {
color: #111;
@nest & .bar {
color: #eee;
}
}
parantez
.foo {
color: #111;
{
& .bar {
color: #eee;
}
}
}
Eşdeğer CSS
.foo {
color: #111;
}
.foo .bar {
color: #eee;
}
2. örnek: Bileşik iç içe yerleştirme
@nest
.foo {
color: blue;
&.bar {
color: red;
}
}
@nest always
.foo {
color: blue;
@nest &.bar {
color: red;
}
}
parantez
.foo {
color: blue;
{
&.bar {
color: red;
}
}
}
Eşdeğer CSS
.foo {
color: blue;
}
.foo.bar {
color: red;
}
3. örnek: Seçici listeleri ve iç içe yerleştirme
@nest
.foo, .bar {
color: blue;
& + .baz,
&.qux {
color: red;
}
}
@nest always
.foo, .bar {
color: blue;
@nest & + .baz,
&.qux {
color: red;
}
}
parantez
.foo, .bar {
color: blue;
{
& + .baz,
&.qux {
color: red;
}
}
}
Eşdeğer CSS
.foo, .bar {
color: blue;
}
:is(.foo, .bar) + .baz,
:is(.foo, .bar).qux {
color: red;
}
4. örnek: Birden fazla düzey
@nest
figure {
margin: 0;
& > figcaption {
background: lightgray;
& > p {
font-size: .9rem;
}
}
}
@nest always
figure {
margin: 0;
@nest & > figcaption {
background: lightgray;
@nest & > p {
font-size: .9rem;
}
}
}
parantez
figure {
margin: 0;
{
& > figcaption {
background: lightgray;
{
& > p {
font-size: .9rem;
}
}
}
}
}
Eşdeğer CSS
figure {
margin: 0;
}
figure > figcaption {
background: hsl(0 0% 0% / 50%);
}
figure > figcaption > p {
font-size: .9rem;
}
5. örnek: Üst öğe yerleştirme veya konu değiştirme
@nest
.foo {
color: red;
@nest .parent & {
color: blue;
}
}
@nest always
.foo {
color: red;
@nest .parent & {
color: blue;
}
}
parantez
.foo {
color: red;
{
.parent & {
color: blue;
}
}
}
Eşdeğer CSS
.foo {
color: red;
}
.parent .foo {
color: blue;
}
6. örnek: Doğrudan ve üst öğe yerleştirme yöntemlerinin karıştırılması
@nest
.foo {
color: blue;
@nest .bar & {
color: red;
&.baz {
color: green;
}
}
}
@nest always
.foo {
color: blue;
@nest .bar & {
color: red;
@nest &.baz {
color: green;
}
}
}
parantez
.foo {
color: blue;
{
.bar & {
color: red;
{
&.baz {
color: green;
}
}
}
}
}
Eşdeğer CSS
.foo {
color: blue;
}
.bar .foo {
color: red;
}
.bar .foo.baz {
color: green;
}
7. örnek: Medya sorgusu iç içe yerleştirme
@nest
.foo {
display: grid;
@media (width => 30em) {
grid-auto-flow: column;
}
}
veya açıkça / genişletilmiş
.foo {
display: grid;
@media (width => 30em) {
& {
grid-auto-flow: column;
}
}
}
@nest always (is always explicit)
.foo {
display: grid;
@media (width => 30em) {
@nest & {
grid-auto-flow: column;
}
}
}
parantez
.foo {
display: grid;
@media (width => 30em) {
grid-auto-flow: column;
}
}
veya açıkça / genişletilmiş
.foo {
display: grid;
@media (width => 30em) {
& {
grid-auto-flow: column;
}
}
}
Eşdeğer CSS
.foo {
display: grid;
}
@media (width => 30em) {
.foo {
grid-auto-flow: column;
}
}
8. örnek: Grupları iç içe yerleştirme
@nest
fieldset {
border-radius: 10px;
&:focus-within {
border-color: hotpink;
}
& > legend {
font-size: .9em;
}
& > div {
& + div {
margin-block-start: 2ch;
}
& > label {
line-height: 1.5;
}
}
}
@nest always
fieldset {
border-radius: 10px;
@nest &:focus-within {
border-color: hotpink;
}
@nest & > legend {
font-size: .9em;
}
@nest & > div {
@nest & + div {
margin-block-start: 2ch;
}
@nest & > label {
line-height: 1.5;
}
}
}
parantez
fieldset {
border-radius: 10px;
{
&:focus-within {
border-color: hotpink;
}
}
> {
legend {
font-size: .9em;
}
div {
+ div {
margin-block-start: 2ch;
}
> label {
line-height: 1.5;
}
}}
}
}
Eşdeğer CSS
fieldset {
border-radius: 10px;
}
fieldset:focus-within {
border-color: hotpink;
}
fieldset > legend {
font-size: .9em;
}
fieldset > div + div {
margin-block-start: 2ch;
}
fieldset > div > label {
line-height: 1.5;
}
9. örnek: "Mutfak Lavabosu" adlı karmaşık iç içe yerleştirme grubu
@nest
dialog {
border: none;
&::backdrop {
backdrop-filter: blur(25px);
}
& > form {
display: grid;
& > :is(header, footer) {
align-items: flex-start;
}
}
@nest html:has(&[open]) {
overflow: hidden;
}
}
@nest always
dialog {
border: none;
@nest &::backdrop {
backdrop-filter: blur(25px);
}
@nest & > form {
display: grid;
@nest & > :is(header, footer) {
align-items: flex-start;
}
}
@nest html:has(&[open]) {
overflow: hidden;
}
}
parantez
dialog {
border: none;
{
&::backdrop {
backdrop-filter: blur(25px);
}
& > form {
display: grid;
{
& > :is(header, footer) {
align-items: flex-start;
}
}
}
}
{
html:has(&[open]) {
overflow: hidden;
}
}
}
Eşdeğer CSS
dialog {
border: none;
}
dialog::backdrop {
backdrop-filter: blur(25px);
}
dialog > form {
display: grid;
}
dialog > form > :is(header, footer) {
align-items: flex-start;
}
html:has(dialog[open]) {
overflow: hidden;
}
Oy verme zamanı
Umarız bu karşılaştırmanın ve değerlendirdiğimiz söz dizimi seçeneklerinin örneklerinin adil olduğunu düşünürsünüz. Lütfen bunları dikkatlice inceleyin ve tercih ettiğinizi aşağıda belirtin. CSS iç içe yerleştirme özelliğini hepimizin kullanacağı ve seveceği bir sözdizimine dönüştürmemize yardımcı olduğunuz için teşekkür ederiz.