เพื่อนร่วมงานของฉันกำลังผลักดันวิธีการ BEM (Block Element Modifier) สำหรับ CSS ในโครงการที่เขากำลังช่วยเหลือและฉันไม่สามารถเข้าใจสิ่งที่ทำให้ดีกว่า LESS CSS ที่เราเขียนมาหลายปี
BEM เป็นวิธีการ CSS อื่น ๆ ได้แก่ OOCSS และ SMACSS วิธีการเหล่านี้ใช้ในการเขียนโค้ดแบบขยายได้และสามารถนำกลับมาใช้ใหม่ได้
LESS เป็นตัวประมวลผลล่วงหน้า CSS อื่น ๆ ได้แก่ Sass และ Stylus ตัวประมวลผลล่วงหน้าเหล่านี้ใช้เพื่อแปลงแหล่งข้อมูลที่เกี่ยวข้องเป็น CSS แบบขยาย
BEM และ LESS นั้นไม่สามารถเปรียบเทียบได้ว่าเป็น "ดีกว่า" ซึ่งเป็นเครื่องมือที่ให้บริการที่แตกต่าง คุณจะไม่พูดว่าไขควงดีกว่าค้อนยกเว้นเมื่อพิจารณาถึงประโยชน์ในการแก้ปัญหาเฉพาะ
เขาอ้างว่า "ประสิทธิภาพสูง" ...
ประสิทธิภาพจะต้องมีการวัดระหว่างสไตล์ CSS คลาสสิกของ:
.widget .header
และรูปแบบ BEM ของ:
.widget__header
แต่โดยทั่วไปแล้วประสิทธิภาพของตัวเลือก CSS ไม่ใช่คอขวดและไม่จำเป็นต้องปรับให้เหมาะสม
"ประสิทธิภาพ" BEM มักเกี่ยวกับรหัสการเขียนผลงานของนักพัฒนา หากวิธีการ BEM ถูกใช้อย่างสม่ำเสมอและถูกต้องมันเป็นเรื่องง่ายสำหรับกลุ่มนักพัฒนาในการเขียนโมดูลที่แตกต่างพร้อมกันโดยไม่มีการชนของสไตล์
เขาอ้างว่า "การอ่าน" และ "ใช้ซ้ำ" ...
ฉันไม่รู้ว่าฉันจะบอกนักพัฒนาใหม่ว่า BEM สามารถอ่านได้มากขึ้น ฉันสามารถพูดได้ว่ามันมีแนวทางที่ชัดเจนเกี่ยวกับความหมายและโครงสร้างของชั้นเรียน
เห็นชั้นเรียนเช่น
.foo--bar__baz
บอกฉันว่ามีfoo
บล็อกที่อยู่ในbar
สถานะและมีbaz
องค์ประกอบ
ฉันจะบอกว่า BEM นั้นสามารถใช้ซ้ำได้มากกว่าแบบคลาสสิก
หากผู้พัฒนาสองคนสร้างบล็อก ( foo
และbar
) และทั้งสองบล็อกนั้นมีส่วนหัวพวกเขาสามารถนำบล็อกของพวกเขากลับมาใช้ใหม่ได้อย่างปลอดภัยในบริบทที่แตกต่างกันโดยไม่ต้องกังวลว่าจะมีการตั้งชื่อชนกัน
นั่นเป็นเพราะในบริบทที่คลาสสิก.foo .heading
และ.bar .heading
จะขัดแย้งและแนะนำความขัดแย้งเฉพาะที่จะต้องได้รับการแก้ไขอาจจะเป็นกรณี ๆ ไป
ในไซต์ BEM คลาสจะเป็น.foo__heading
และ.bar__heading
ซึ่งจะไม่ขัดแย้งกัน
เขาอ้างว่า "CSS ที่ซ้อนกันเป็นรูปแบบต่อต้าน" "anti-pattern" หมายถึงอะไรและทำไม CSS ที่ซ้อนกันไม่ดี?
"anti-pattern" เป็นรูปแบบการเข้ารหัสที่ง่ายขึ้นสำหรับนักพัฒนาที่ไม่มีประสบการณ์ในการเรียนรู้และใช้งานมากกว่าทางเลือกที่เหมาะสมกว่า
ตราบใดที่ CSS ที่ซ้อนกันไม่ดี: การทำรังจะเพิ่มความเฉพาะเจาะจงของตัวเลือก ยิ่งมีความเฉพาะเจาะจงมากเท่าไหร่ก็ยิ่งพยายามมากเท่านั้น นักพัฒนาที่ไม่มีประสบการณ์มักจะกังวลว่า CSS ของพวกเขาอาจส่งผลกระทบหลายหน้าดังนั้นพวกเขาจึงใช้ตัวเลือกดังนี้:
#something .lorem .ipsum .dolor ul.sit li.amet a.more
เมื่อนักพัฒนาที่มีประสบการณ์จะกังวลว่า CSS ของพวกเขาอาจไม่ส่งผลกระทบต่อหลาย ๆ หน้าดังนั้นพวกเขาจึงใช้ selector เช่น:
.more
เขาอ้างว่า "ทุกคนกำลังมุ่งสู่การใช้ BEM ดังนั้นเราควรทำเช่นกัน" ...
นั่นคือการเข้าใจผิดของ bandwagonดังนั้นให้เพิกเฉยว่านี่เป็นข้อโต้แย้งที่ไม่ดี อย่าตกหลุมกับการเข้าใจผิดเนื่องจากการโต้แย้งที่ไม่ดีในการสนับสนุน BEM ไม่ใช่เหตุผลที่เชื่อได้ว่า BEM ไม่ดี
มีคนช่วยอธิบายรายละเอียดสิ่งที่ทำให้ BEM ดีกว่า LESS บ้างไหม
ฉันกล่าวถึงเรื่องนี้มาก่อน BEM & LESS นั้นไม่เทียบเท่ากัน แอปเปิ้ลและส้ม ฯลฯ
เพื่อนร่วมงานของฉันไม่สามารถโน้มน้าวฉันได้ แต่ฉันไม่รู้ว่าฉันมีทางเลือก แต่ต้องทำตามหรือไม่
ผมขอแนะนำการดูที่ OOCSS, SMACSS และ BEM และชั่งน้ำหนักข้อดีและข้อเสียของวิธีแต่ละ ... เป็นทีม ฉันใช้ BEM เพราะฉันชอบความเข้มงวดในรูปแบบและไม่รังเกียจผู้เลือกที่น่าเกลียด แต่ฉันไม่สามารถบอกได้ว่าอะไรที่เหมาะกับคุณหรือทีมของคุณ อย่าปล่อยให้คนที่พูดตรงๆคนหนึ่งวิ่งโชว์ หากคุณไม่สะดวกกับ BEM โปรดทราบว่ามีทางเลือกอื่น ๆ ที่อาจทำให้ทีมของคุณสนับสนุนได้ง่ายขึ้น คุณอาจต้องปกป้องตำแหน่งของคุณกับผู้ร่วมงานของคุณ แต่ในระยะยาวอาจมีผลในเชิงบวกต่อผลลัพธ์ของโครงการของคุณ
ฉันอยากจะชื่นชม BEM มากกว่าที่จะยอมรับมันอย่างไม่เต็มใจ
ผมเขียนคำตอบใน StackOverflow ที่อธิบายถึงวิธีการทำงานของ สิ่งสำคัญที่ต้องเข้าใจคือตัวเลือกอุดมคติของคุณควรมีความเฉพาะเจาะจง0-0-1-0
เพื่อให้ง่ายต่อการแทนที่และขยาย
การเลือกใช้ BEM ไม่ได้หมายความว่าคุณต้องยอมแพ้น้อยลง! คุณยังคงสามารถใช้ตัวแปรคุณยังคงสามารถใช้ @imports และคุณสามารถใช้การซ้อนต่อไปได้ ความแตกต่างคือคุณต้องการให้เอาต์พุตที่เรนเดอร์กลายเป็นคลาสเดียวแทนที่จะเป็นลูกโซ่ที่สืบทอด
คุณอาจจะมีที่ไหน
.widget {
.heading {
...
}
}
ด้วย BEM คุณสามารถใช้:
.widget {
&__heading {
...
}
}
นอกจากนี้เนื่องจาก BEM หมุนรอบบล็อกแต่ละบล็อกคุณจึงสามารถแยกรหัสเป็นไฟล์แยกได้อย่างง่ายดาย widget.less
จะมีสไตล์สำหรับ.widget
บล็อกในขณะที่component.less
จะมีสไตล์สำหรับ.component
บล็อก สิ่งนี้ทำให้ง่ายต่อการค้นหาแหล่งข้อมูลสำหรับคลาสใด ๆ โดยเฉพาะแม้ว่าคุณอาจต้องการใช้แผนที่แหล่งที่มา