2015-05-28 23 views
10

OOCSS ile ilgili bir sorunum var. Daha taşınabilir olması gerekiyordu, ama genellikle nasıl şeyler yaptığımla kıyaslandığında, onu daha az buluyorum.SMACSS, BEM ve OOCSS taşınabilir değil mi?

Benim örnek:

Ben bir widget Yorum var. Ana içerik gövdesinde (beyaz bir arka plana sahip), referansın siyah bir yazı tipi vardır. Ancak altbilgisinde (mavi bir arka plana sahip), referansın beyaz bir yazı tipine ihtiyacı vardır.

OOCSS önce, böyle bir şey yapacağını: Bu "eski" yaklaşımıyla

#main-content .testominial { 
    color: #000000; 
} 
#footer .testominial { 
    color: #FFFFFF; 
} 

, ben altbilgisine içerik alandan benim widget'ı sürükleyebileceğinizi ve renkleri işe basitçe olur - İstemem widget'in CSS veya DOM sınıflarımı değiştirmem gerekiyor. Yeni OOCSS/BEM ile

, ben kimliği (veya yere) için çift .testimonial sınıf gerekiyordu DEĞİL am ziyade ben şöyle alt sınıf olmalıdır:

.testominial { 
    color: #000000; 
} 
.testominial--footer { 
    color: #FFFFFF; 
} 

sorun Artık DOM'a gitmeden ve referans widget'ındaki sınıfları değiştirmeden, referans alanımı içerik alanından altbilgiye sürükleyemem. - Bir geliştirici tarafından manuel müdahale gerektirdiğinden, LESS taşınabilirdir; Bir editör önce onu sürükleyebilir ve stil otomatik olabilir.

Bir şey mi eksik? Orada gerçek bir gerçek dünya örneği yok mu?

+0

Evet, işte bu yüzden bu modellere sahip bir kamyonum yok, CSS seçicilerinin nasıl çalışacaklarına dair temel olarak tahıllara karşı çıkıyorlar. – Alohci

+0

imo, BEM/OOCSS'nin amacı, bir 'bileşen' de bir değişiklik yapma ve ekranın başka bir yerde 'kırılma' olmasının 'istenmeyen sonuçları' önlemektir. Bunu, sınıf isimlerine göre CSS 'çağlayanını' sınırlandırarak yapar. Bunun tekrar kullanılmasına yardımcı olması bir avantajdır. Kesinlikle bakım yapılmasına yardımcı olur. Ayrıca, CSS'nin ne yaptığı ve neyi etkileyeceği konusunda mantıklıdır, ben bir tasarımcıdan ziyade bir CSS uzmanı değil, programcıyım. –

+0

@RyanVincent Yeniden kullanım sadece bir bonus değildir. [En iyi uygulamalarımız bizi öldürüyor] 'da Nicole Sullivan'ın güçlü bir argümanıdır (http://www.slideshare.net/stubbornella/our-best-practices-are-killing-us) (OOCSS). Ve, BEM bir "web uygulamaları oluşturmak için bir teknoloji", BEM, yeniden kodlama, kod faktörizasyonu yapmak için yardımcı olur. – Paleo

cevap

5

testimonial adının yanı sıra footer işaretini de dikkate almanız gerekir.sınıflar kendi sayfa bağlamı tamamen bağımsızdır örnekte

.primary-box { } 
.primary-box--reduced { } 
.primary-box--standout { } 

:

Bu örneği ele alalım. Sonuç, sınıfların tamamen yeniden kullanılabilir olmasıdır. Sayfadaki herhangi bir kutu, yukarıdaki sınıfları alabilir ve tam olarak tanımlandığı şekilde biçimlendirilmesini bekleyebilir.

Örneğin, olabilir:

<header> 
    <div class='primary-box primary-box--reduced'></div> 
</header> 
<div class='content-box'> 
    <p class='primary-box primary-box--standout'></p> 
</div> 
<footer> 
    <div class='primary-box primary-box--reduced'></div> 
</footer> 

tasarımcı, kendine güvenen geri gelir ve çarpıcı kutularının dolgu bunları bu stilleri doğrudan gitmek ve ince ayar yapabilirsiniz tweaks Şimdi zaman o sadece olacak alanlar Etkilenenler, HTML'de bu sınıflara sahip alanlar olacaktır. Ayrıca, <header> numaralı telefondan, .primary-box--reduced numaranızdan hareket ettirmeye karar verdiğinizde, bunun üstüne ya da altbilgiye yerleştirilen menü çubuğuna, stillerin tamamen geleceğinden emin olabilirsiniz. Eğer bir yere başka bir öğe, belki bir primary-box--standout veya başlığında sadece bir varsayılan primary-box gerektiğinde

, şunu oluşturmak ve sınıfları eklemek, bunlar stilleri tamamen izleyecektir.

Beklenmeyen stilleri hiçbir zaman devralmayacaksınız.

Bu çok gerçek bir dünya örneğidir, yakın zamanda inşa ettiğim bir site neredeyse böyle inşa edilmiştir, hemen hemen hepsini söylüyorum çünkü hala öğreniyorum, ama en az sorunla karşılaştığım bitleri garanti edebilirim. Çok akışkan tasarımları ile hızlı hareket eden proje, spesifik olmayan içerikli projelerdi. Önemli olan, bağlam eksikliğidir. İlk örnekte, .testimonial--footer çok bağlam bağımlıdır, gerçekten yalnızca altbilgideki referanslarda kullanmanız gerekir.

Ve sihirli CSS Wizardry cover this exact topic

DÜZENLEME tarafından sanki

: benim cevap yapılan bir yorum ile yardımcı olmak için bu örneği eklendi. Bu, BEM veya OOCSS değil, ancak the SMACSS approach'a biraz daha yakın. Ben css ile sorunların üstesinden nasıl ve melez BEM/SMACSS yaklaşımdır:

sırayla Loaded:

  • modül dosyaları gibi .primary-box
  • sayfa bölümü dosyaları gibi .header veya .call-to-action
  • Her dosya daha sp alır böyle

.about-us olarak veya .contact

  • sayfa dosyaları, ecific, aynı anda daha karmaşık ve modüller inşa ederken. Daha spesifik bir iç içe sınıf gösterimi kullanılarak modül stilleri aşırı binmek hangi

    .header { 
        .primary-box { 
        color: #000; 
        } 
    } 
    

    : Yukarıdaki örneklere Bina ve umarım OP yardımcı sen gibi stilleri görebiliyordu.Hala .header gibi bir sınıf adını kullanarak önleyeceğini unutmayın - bu yeniden kullanılabilir oluyor gibi her yerde karışıklık

    Sonraki olmadan daha iyi olurdu .banner-standout, hatta görebiliyordu:

    .about-us { 
        .header { 
        .primary-box { 
         color: #f00; 
        } 
        } 
    } 
    

    bulduğum bu çok iyi çalışıyor BEM'in bağlam özgürlüğünü korurken bağlam için gerçek projelerde, bu zinciri de modüllere itmek için mümkün olduğunca çok teşvik ediyorum. Yeni bir genel sayfa bölümü veya modülü tanıyıp isimlendirmeyi ve dosyaları uygun şekilde yeniden düzenlerseniz hayat daha kolay olur. Kodun özenle düzeltildiği bir projede, sayfa dosyalarında hiçbir şeyim yok.

  • +0

    Teşekkürler Toni, daha fazla örnek görmek çok güzel, ama soruyu özlü kılmaya çalışmamıza rağmen, ana kaygımın hala gözden kaçırıldığını düşünüyorum. Benim amacım, bağlamıma bağımlı olmak için bloklarıma ihtiyacım var. Benim htmlimi nereye koyduğumu söylüyorsun, üsluplar gelecek, ama istemediğim şey bu. Altbilgide yazı tipi renginin beyaz olması gerekir, ancak ana gövdenin siyah olması gerekir, böylece * bir bağlam bağımlılığıdır. Şu anda, ekran etrafında widget'ları sürükledik ve eski yaklaşımda (örneğime bakın), ebeveyn kimliği onu yönetirken widget'leri manuel olarak değiştirmemiz gerekmedi. – gjok

    +0

    Bu yazıdaki cevaba bir bakın: http://stackoverflow.com/questions/22566179/bem-block-naming-nesting , karşı karşıya olduğum ıslanabilirlik probleminin mükemmel bir örneğini gösterir. 'content' div'ini 'sidebar' div'ına taşıyacak olsaydınız, 'nav - content' sınıflarını tüm alt öğeler için 'nav - sidebar' ile el ile değiştirmeniz gerekir. . - Bu, taşınabilir olmamakla mening ettiğim şey. teşekkürler - lütfen yardım edin. – gjok

    +0

    @gjok - lütfen düzenlemeye bakın, kullanmış olduğum pratik bir örnek ekledim, bu bağlamda önemli olan durumlarda, BEM'in gücünün kullanılmasına izin verebilir –

    2

    Bu "eski" yaklaşımla, widget'ımı içerik alanından altbilgiye sürükleyebilirim ve renkler basitçe çalışır - Widget'ın CSS veya DOM sınıflarımı değiştirmem gerekmez.

    siz "sürükle" konteyner .main-footer için konteyner .main-content den eleman .testominial, yani sen DOM değiştirmek ise

    . Böylece, değiştiriciyi CSS sınıflarında da güncelleyebilirsiniz, ek bir ücret yoktur.

    BEM'in amacı, CSS sınıflarını tekrar kullanılabilir hale getirmektir. Aşağıdaki değiştiriciler çeşitli ortamlarda yeniden kullanılabilir.

    CSS:

    .testominial { 
    } 
    .testominial--darkFg { 
        color: #000; 
    } 
    .testominial--lightFg { 
        color: #FFF; 
    } 
    

    HTML: Eski yaklaşımla

    <main class="main-content"> 
        <div class="testominial testominial--darkFg">...</div> 
    </main> 
    <footer class="main-footer"> 
        <div class="testominial testominial--lightFg">...</div> 
    </footer> 
    

    , CSS kodunu yeni bir kapta yeni bir blok .testominial gerektiği her defasında değiştirmek gerekecek. HTML ve CSS güçlü bir şekilde birleştirilmiştir ve bazı CSS kodları çoğaltılacaktır.

    BEM yaklaşımıyla, tasarımcı her defasında yeni bir blok görünümünün varyasyonunu ekleyeceği zaman bir miktar CSS kodu eklemeniz gerekecektir. HTML ve CSS daha az birleştirilmiştir ve CSS daha iyi yeniden kullanılır.

    +0

    So @ Teh'i kullanarak HTML'nize bakın parçacığı sayfa etrafında sürüklediğinizde, parçacığı sınıf listesine "testominial - darkFg" veya "testominial - lightFg" sınıfları eklemek MANUELE. Kullanıcılarımız bunu yapamazdı. Kodlama yapmadan sürükleyip bırakabilmeleri için onlara ihtiyacımız var. – gjok

    +0

    CSS'yi doğru yaparsanız, HTML ve CSS tamamen ayrılmaz. Seçiciler iki dünya arasındaki bağlamayı sağlamışlardı ve kaskat ve özgüllük, BEM tarafından maskelenen zengin bir bağ dili sağlar. – Alohci

    +1

    @gjok Belki BEM kullanım durumunuza uygun değil mi? Widget'ınızın görünümünü konteynerin işlevine uyarlaması gerekiyorsa, o zaman saf bir BEM metodolojisi kullanamazsınız. Tanım olarak, BEM'de, bloklar bağlam içermez. – Paleo