Block, Element, Modifier (Blok, Eleman, Değiştirici) metodolojisi (genellikle BEM olarak adlandırılır), HTML ve CSS’deki sınıflar için popüler bir adlandırma kuralıdır. Yandex’deki ekip tarafından geliştirilen hedefi, geliştiricilerin belirli bir projedeki HTML ve CSS arasındaki ilişkiyi daha iyi anlamalarına yardımcı olmaktır.
BEM stilinde yazan bir CSS geliştiricisinin yazabileceklerine bir örnek:
1 2 3 4 5 6 7 8 9 10 11 | /* Block component */ .btn {} /* Element that depends upon the block */ .btn__price {} /* Modifier that changes the style of the block */ .btn--orange {} .btn--big {} |
Bu CSS yönteminde blok, yeni bir bileşenin üst düzey soyutlamasıdır, örneğin bir button: .btn{}. bu blok bir ebeveyn olarak düşünülmelidir. Alt öğeler veya öğeler içine yerleştirilebilir ve bunlar, .btn__price{} gibi bloğun adından sonra iki alt çizgiyle gösterilir. Son olarak, değiştiriciler bloğu manipüle edebilir, böylece tamamen ilgisiz bir modülde değişiklik yapmadan belirli bir bileşeni temalayabilir veya stil uygulayabiliriz. Bu, btn–primary gibi blok adına iki tire eklenerek yapılır.
İşaretleme daha sonra şöyle görünebilir:
1 2 3 4 5 6 | <a class="btn btn--big btn--primary" href="https://tasarimkodlama.com"> <span class="btn__price">10₺</span> <span class="btn__text">Kaydol</span> </a> |
Başka bir geliştirici bu işaretlemeyi yazdıysa ve CSS’ye aşina değildiyse, hangi sınıfların neye ve nasıl bağımlı olduklarından hangi sınıfların sorumlu olduğu konusunda hala iyi bir fikri sahibi olunmasını sağlar. Geliştiriciler daha sonra kendi bileşenlerini oluşturabilir ve mevcut bloğu içeriğine göre değiştirebilir. Çok fazla CSS yazmadan, geliştiriciler potansiyel olarak yalnızca işaretlemedeki bir sınıfı değiştirerek birçok farklı buton kombinasyonu oluşturabilirler:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | <style> /* Block */ .btn { text-decoration: none; background-color: white; color: #888; border-radius: 5px; display: inline-block; margin: 10px; font-size: 18px; text-transform: uppercase; font-weight: 600; padding: 10px 5px; } /* Element */ .btn__price { background-color: white; color: #fff; padding-right: 12px; padding-left: 12px; margin-right: -10px; /* realign button text padding */ font-weight: 600; background-color: #333; opacity: .4; border-radius: 5px 0 0 5px; } /* Element */ .btn__text { padding: 0 10px; border-radius: 0 5px 5px 0; } /* Modifier */ .btn--big { font-size: 28px; padding: 10px; font-weight: 400; } /* Modifier */ .btn--primary { border-color: #0074D9; color: white; background-color: #0074D9; } /* Modifier */ .btn--secondary { border-color: #FF4136; color: white; background-color: #FF4136; } /* Modifier */ .btn--dialog { border-color: #3D9970; color: white; background-color: #3D9970; } body { font-family: "fira-sans-2", sans-serif; background-color: #ccc; } </style> <a href="https://www.tasarimkodlama.com" class="btn"> <span class="btn__text">Button</span> </a> <a href="https://www.tasarimkodlama.com" class="btn btn--dialog btn--big"> <span class="btn__price">3</span> <span class="btn__text">Button</span> </a> <a href="https://www.tasarimkodlama.com" class="btn btn--primary btn--big"> <span class="btn__price">4</span> <span class="btn__text">Button</span> </a> <a href="https://www.tasarimkodlama.com" class="btn btn--secondary btn--big"> <span class="btn__price">9</span> <span class="btn__text">Button</span> </a> |
Başlangıçta bu sözdizimi, her bir buton türü için yeni bir sınıf yapmaktan daha yavaş görünebilir, ancak bu, ele alacağımız birkaç nedenden ötürü durum böyle değildir.
Neden BEM’i düşünmeliyiz?
- Bir bileşenin yeni bir stilini yapmak istiyorsak, hangi değiştiricilerin ve çocukların zaten var olduğunu kolayca görebiliriz. İlk başta herhangi bir CSS yazmamız gerekmediğinin farkında bile olabiliriz, çünkü ihtiyacımız olanı yapan önceden var olan bir değiştirici var.
- CSS yerine biçimlendirmeyi okuyorsak, hangi öğenin diğerine bağlı olduğu hakkında hızlı bir şekilde bir fikir edinebilmeliyiz (önceki örnekte, .btn__price öğesinin .btn’ye bağlı olduğunu görebiliriz, bunun ne olduğunu bilmesek bile.)
- Tasarımcılar ve geliştiriciler ekip üyeleri arasında daha kolay iletişim için bileşenleri sürekli olarak adlandırabilirler. Başka bir deyişle, BEM bir projedeki herkese aynı sayfada olmaları için paylaşabilecekleri bildirici bir sözdizimi verir.
CSS ile ilgili sorunlar
Tabii ki BEM kurallarından koparsanız kimse size kızmayacaktır. Yine de böyle bir CSS seçici yazabilirsiniz:
1 2 3 4 5 | .nav .nav__listItem .btn--orange { background-color: green; } |
BEM’in bazı bölümleri var gibi görünüyor, ancak BEM değil. İç içe seçicileri vardır ve değiştirici neler olup bittiğini doğru bir şekilde tanımlamaz. Bunu yapsaydık, BEM ile çok yardımcı olan özgüllük düzlüğünü bertaraf ederdik.
Bir block(.nav gibi) hiçbir zaman başka bir blok veya değiştiricinin (.btn-info gibi) stillerini geçersiz kılmamalıdır. Aksi takdirde, HTML’yi okumak ve bu bileşenin ne yaptığını anlamak neredeyse imkansız hale gelir; Bu süreçte başka bir geliştiricinin kod tabanına olan güvenini büyük ölçüde sarsmak zorundayız. Bu, HTML için de geçerlidir: Aşağıdaki işaretlemeyi görürseniz ne beklersiniz?
1 2 3 4 5 6 | <a class="btn" href="https://tasarimkodlama.com"> <div class="nav__listItem">Item one</div> <div class="nav__listItem">Item two</div> </a> |
Muhtemelen burada olup bitenler, tamamen ilgisiz bir bloktaki bir öğenin geliştiricinin ihtiyaç duyduğu koda sahip olması, ancak alt öğelerin üst öğe olarak .nav sınıfı gerektirmemesi. Bu, her ne pahasına olursa olsun kaçınılması gereken son derece kafa karıştırıcı ve tutarsız bir kod tabanı sağlar. Bu sorunları şu şekilde özetleyebiliriz:
- İlişkisiz bir blokta değiştiricileri asla geçersiz kılma.
- Çocuk kendi başına mutlu bir şekilde var olabildiğinde gereksiz ebeveyn unsurları yapmaktan kaçınmak.
Bir şeyleri tamamlamak için, BEM’in tüm sorunlarımızı çözmese de, takımdaki herkesin işlerin nasıl geliştirilebileceği konusunda net bir fikre sahip olması gereken ölçeklenebilir ve sürdürülebilir arayüzler oluşturmak için olağanüstü yararlı olduğunu söylemek doğru olur. Bunun nedeni, çok sayıda ön uç geliştirmenin sadece kısa vadede küçük bir sorunu çözen güzel hilelerle ilgili olmamasıdır; kod tabanımızın zaman içinde uyum sağlayabilmesi için geliştiriciler arasında anlaşmalara, vaatlere ve bağlayıcı sosyal sözleşmelere ihtiyacımız var.
1 Yorum