ผู้จัดการ CSS Explosion


682

ฉันใช้ CSS เป็นอย่างมากสำหรับเว็บไซต์ที่ฉันใช้งานอยู่ ตอนนี้ CSS สไตล์ทั้งหมดจะถูกนำไปใช้ในแต่ละแท็กดังนั้นตอนนี้ฉันกำลังพยายามที่จะย้ายไปที่สไตล์ภายนอกเพิ่มเติมเพื่อช่วยในการเปลี่ยนแปลงในอนาคต

แต่ตอนนี้ปัญหาคือฉันสังเกตว่าฉันได้รับ "CSS Explosion" ฉันกลายเป็นเรื่องยากที่จะตัดสินใจว่าจะจัดระเบียบและเก็บข้อมูลนามธรรมภายในไฟล์ CSS ได้ดีที่สุด

ฉันใช้divแท็กจำนวนมากในเว็บไซต์ย้ายจากเว็บไซต์ที่ใช้ตารางเป็นหลัก ดังนั้นฉันจะได้รับตัวเลือก CSS จำนวนมากที่มีลักษณะเช่นนี้:

div.title {
  background-color: blue;
  color: white;
  text-align: center;
}

div.footer {
  /* Styles Here */
}

div.body {
  /* Styles Here */
}

/* And many more */

มันยังไม่เลวร้ายนัก แต่ในขณะที่ฉันเป็นผู้เริ่มต้นฉันสงสัยว่าคำแนะนำจะทำอย่างไรดีที่สุดในการจัดระเบียบส่วนต่าง ๆ ของไฟล์ CSS ฉันไม่ต้องการให้มีแอตทริบิวต์ CSS แยกต่างหากสำหรับทุกองค์ประกอบในเว็บไซต์ของฉันและฉันต้องการให้ไฟล์ CSS นั้นใช้งานง่ายและอ่านง่าย

เป้าหมายสูงสุดของฉันคือทำให้ง่ายต่อการใช้ไฟล์ CSS และแสดงพลังของพวกเขาเพื่อเพิ่มความเร็วในการพัฒนาเว็บ ด้วยวิธีนี้บุคคลอื่นที่อาจใช้งานเว็บไซต์นี้ได้ในอนาคตจะได้รับการฝึกฝนในการใช้วิธีการเข้ารหัสที่ดีแทนที่จะต้องเลือกวิธีที่ฉันทำ


122
นี่เป็นคำถามที่ดี แต่สำหรับหลาย ๆ บริษัท เป็นปัญหาที่แก้ไม่ได้จริงๆ เพราะส่วนใหญ่ CSS จะถูกประพันธ์และบริหารงานโดยนักออกแบบกราฟิกที่อาจจะไม่ได้ตระหนักถึงข้อตกลงsimplicity, complexity, maintenance, และstructure refactoring
cherouvim

8
@cherouvim - เป็นเรื่องตลกที่คุณควรพูดอย่างนั้นเพราะเหตุผลทั้งหมดที่ฉันถามคำถามนี้เริ่มต้นด้วยการเห็น CSS ที่น่ากลัวซึ่งออกแบบโดยศิลปินกราฟิก บางทีเราต้องการการฝึกอบรมที่ดีกว่าสำหรับพวกเขา?
JasCav

13
วิธีแก้ปัญหาของฉัน (ในโลกอุดมคติ) คือการให้ผู้คนในทีมของคุณทุ่มเทตัด PSD เป็น html + css และดูแลรักษาในภายหลัง คนเหล่านี้ควรอยู่ใกล้กับโปรแกรมเมอร์และนักออกแบบ
cherouvim

@cherouvim ต้องยอมรับ - นั่นเป็นวิธีที่เอเจนซี่ดำเนินไปโดยเฉพาะอย่างยิ่งเมื่อ CSS มีความซับซ้อนมากขึ้น
John Parker

27
@JasCav ศิลปินกราฟิกไม่ควรสัมผัส CSS นักออกแบบเว็บไซต์และนักพัฒนาเว็บส่วนหน้าควรจัดการกับ CSS งานออกแบบกราฟิกคือการทำกราฟิก
zzzzBov

คำตอบ:


566

นี่เป็นคำถามที่ดีมาก ทุกที่ที่ฉันมองไฟล์ CSS มีแนวโน้มที่จะควบคุมไม่ได้หลังจากนั้นไม่นานโดยเฉพาะอย่างยิ่ง แต่ไม่เพียง แต่เมื่อทำงานในทีม

ต่อไปนี้เป็นกฎที่ฉันพยายามยึดถือ (ไม่ใช่ที่ฉันจัดการเสมอ)

  • Refactor ก่อนกำหนด refactor บ่อย ๆ ล้างไฟล์ CSS บ่อยครั้งรวมกันหลายคำจำกัดความของคลาสเดียวกัน ลบคำจำกัดความล้าสมัยทันที

  • เมื่อเพิ่ม CSS ในระหว่างการแก้ไขข้อผิดพลาดแสดงความคิดเห็นตามที่การเปลี่ยนแปลงทำ ("นี่คือเพื่อให้แน่ใจว่ากล่องนั้นอยู่ในแนวเดียวกันใน IE <7")

  • หลีกเลี่ยงความซ้ำซ้อนเช่นการกำหนดสิ่งเดียวกันในและ.classname.classname:hover

  • ใช้ความคิดเห็น/** Head **/เพื่อสร้างโครงสร้างที่ชัดเจน

  • ใช้เครื่องมือ prettifier ที่ช่วยรักษาสไตล์ให้คงที่ ฉันใช้Polystyleซึ่งฉันมีความสุขมาก (ราคา $ 15 แต่ใช้เงินได้ดี) มีคนว่างอยู่รอบตัว (เช่นCode BeautifierจากCSS Tidyเครื่องมือโอเพนซอร์ส)

  • สร้างชั้นเรียนที่สมเหตุสมผล ดูหมายเหตุด้านล่างนี้

  • ใช้ซีแมนทิกส์หลีกเลี่ยง DIV soup - use <ul>s สำหรับเมนูเช่น

  • กำหนดทุกอย่างให้อยู่ในระดับต่ำที่สุดเท่าที่จะทำได้ (เช่นตระกูลฟอนต์เริ่มต้นสีและขนาดในbody) และใช้inheritเมื่อเป็นไปได้

  • หากคุณมี CSS ที่ซับซ้อนมากอาจเป็น CSS pre-compiler ฉันวางแผนที่จะค้นหาxCSSด้วยเหตุผลเดียวกันนี้ในไม่ช้า มีอีกหลายรอบ

  • หากทำงานเป็นทีมให้เน้นความจำเป็นของคุณภาพและมาตรฐานสำหรับไฟล์ CSS ด้วย ทุกคนมีมาตรฐานการเข้ารหัสที่ดีในภาษาการเขียนโปรแกรม แต่ก็มีความตระหนักเล็กน้อยว่านี่เป็นสิ่งจำเป็นสำหรับ CSS เช่นกัน

  • ถ้าทำงานในทีมจะพิจารณาใช้การควบคุมเวอร์ชัน มันทำให้สิ่งต่าง ๆ ง่ายขึ้นมากในการติดตามและแก้ไขข้อขัดแย้งที่แก้ได้ง่ายกว่ามาก มันคุ้มค่าจริงๆแม้ว่าคุณจะ "เพิ่ง" เป็น HTML และ CSS

  • !importantไม่ได้ทำงานกับ ไม่เพียงเพราะ IE = <7 ไม่สามารถจัดการกับมันได้ ในโครงสร้างที่ซับซ้อนการใช้!importantมักล่อลวงให้เปลี่ยนพฤติกรรมที่ไม่สามารถหาแหล่งที่มาได้ แต่เป็นพิษสำหรับการบำรุงรักษาในระยะยาว

การสร้างคลาสที่เหมาะสม

นี่คือวิธีที่ฉันต้องการสร้างชั้นเรียนที่มีเหตุผล

ฉันใช้การตั้งค่าระดับโลกก่อน:

body { font-family: .... font-size ... color ... }
a { text-decoration: none; }

จากนั้นฉันจะระบุส่วนหลักของเค้าโครงของหน้าเช่นบริเวณด้านบนเมนูเนื้อหาและส่วนท้าย ถ้าฉันเขียนมาร์กอัปที่ดีพื้นที่เหล่านี้จะเหมือนกับโครงสร้าง HTML

จากนั้นฉันเริ่มสร้างคลาส CSS โดยระบุบรรพบุรุษให้มากที่สุดเท่าที่จะเป็นไปได้และจัดกลุ่มคลาสที่เกี่ยวข้องให้ใกล้เคียงที่สุด

div.content ul.table_of_contents 
div.content ul.table_of_contents li 
div.content ul.table_of_contents li h1
div.content ul.table_of_contents li h2
div.content ul.table_of_contents li span.pagenumber

คิดว่าโครงสร้าง CSS ทั้งหมดเป็นต้นไม้ที่มีคำจำกัดความที่เฉพาะเจาะจงมากยิ่งขึ้นห่างจากรูทที่คุณอยู่ คุณต้องการรักษาจำนวนคลาสให้ต่ำที่สุดเท่าที่จะเป็นไปได้และคุณต้องการทำซ้ำตัวเองบ่อยที่สุดเท่าที่จะทำได้

ตัวอย่างเช่นสมมติว่าคุณมีเมนูการนำทางสามระดับ เมนูทั้งสามนี้ดูแตกต่างกัน แต่ก็มีลักษณะบางอย่างร่วมกัน ตัวอย่างเช่นมีทั้งหมด<ul>พวกเขาทั้งหมดมีขนาดตัวอักษรเท่ากันและรายการทั้งหมดถัดจากกันและกัน (ตรงข้ามกับการแสดงผลเริ่มต้นของul) นอกจากนี้ไม่มีเมนูใด ๆ ที่มีสัญลักษณ์แสดงหัวข้อย่อย ( list-style-type)

ก่อนกำหนดลักษณะทั่วไปในชั้นชื่อmenu:

div.navi ul.menu { display: ...; list-style-type: none; list-style-image: none; }
div.navi ul.menu li { float: left }

จากนั้นกำหนดคุณสมบัติเฉพาะของแต่ละสามเมนู ระดับ 1 สูง 40 พิกเซล; ระดับ 2 และ 3, 20 พิกเซล

หมายเหตุ:คุณสามารถใช้หลายคลาสได้ แต่ Internet Explorer 6 มีปัญหากับหลายคลาสดังนั้นตัวอย่างนี้ใช้ids

div.navi ul.menu#level1 { height: 40px; }
div.navi ul.menu#level2 { height: 20px; }
div.navi ul.menu#level3 { height: 16px; }

มาร์กอัปสำหรับเมนูจะมีลักษณะดังนี้:

<ul id="level1" class="menu"><li> ...... </li></ul>
<ul id="level2" class="menu"><li> ...... </li></ul>
<ul id="level3" class="menu"><li> ...... </li></ul>

หากคุณมีองค์ประกอบที่มีความหมายคล้ายกันในหน้าเว็บเช่นเมนูทั้งสามนี้ให้ลองใช้วิธีการร่วมกันก่อนแล้วนำไปไว้ในชั้นเรียน จากนั้นทำงานคุณสมบัติเฉพาะและนำไปใช้กับคลาสหรือถ้าคุณต้องรองรับ Internet Explorer 6, ID

เคล็ดลับ HTML อื่น ๆ

หากคุณเพิ่มซีแมนทิกส์เหล่านี้ในเอาต์พุต HTML ของคุณนักออกแบบสามารถปรับแต่งรูปลักษณ์ของเว็บไซต์และ / หรือแอพโดยใช้ CSS บริสุทธิ์ซึ่งเป็นข้อดีและประหยัดเวลาได้อย่างมาก

  • ถ้าเป็นไปได้ให้คลาสที่เป็นเอกลักษณ์ของทุกเพจ: <body class='contactpage'>ทำให้ง่ายต่อการเพิ่มการปรับแต่งเฉพาะหน้าให้กับสไตล์ชีท:

    body.contactpage div.container ul.mainmenu li { color: green }
  • เมื่อสร้างเมนูโดยอัตโนมัติให้เพิ่มบริบท CSS ให้มากที่สุดเท่าที่จะทำได้เพื่อจัดแต่งทรงผมในภายหลัง ตัวอย่างเช่น:

    <ul class="mainmenu">
     <li class="item_first item_active item_1"> First item </li> 
     <li class="item_2"> Second item </li> 
     <li class="item_3"> Third item </li> 
     <li class="item_last item_4"> Fourth item </li> 
    </ul>

    วิธีนี้ทุกรายการเมนูสามารถเข้าถึงเพื่อจัดแต่งทรงผมตามบริบทความหมายของมัน: ไม่ว่าจะเป็นรายการแรกหรือรายการสุดท้ายในรายการ ไม่ว่าจะเป็นรายการที่ใช้งานในปัจจุบัน; และตามจำนวน

หมายเหตุว่านี้กำหนดของหลายชั้นเรียนตามที่ระบุไว้ในตัวอย่างข้างต้นไม่ทำงานอย่างถูกต้องใน IE6 มีวิธีแก้ปัญหาเพื่อให้ IE6 สามารถจัดการกับหลายคลาสได้ หากวิธีแก้ปัญหาไม่ใช่ตัวเลือกคุณจะต้องตั้งค่าคลาสที่สำคัญที่สุดสำหรับคุณ (หมายเลขรายการใช้งานหรือครั้งแรก / ครั้งสุดท้าย) หรือใช้รหัส


3
@Andrew ส่วนใหญ่เป็นเพราะในสภาพแวดล้อมแบบไดนามิก (เช่น CMS) โดยใช้ ID สามารถนำไปสู่การชนกันได้ง่าย (เช่นผู้ใช้ที่เปลี่ยนชื่อหน้าเป็น "ติดต่อ" นำไปสู่ชื่อนั้นถูกใช้เป็น ID ของร่างกายชนกับแบบฟอร์มการติดต่อ ชื่อ "ติดต่อ") โดยทั่วไปฉันขอแนะนำให้ใช้ ID เท่าที่จะทำได้ด้วยเหตุผลดังกล่าว
Pekka

4
@ Pekka คุณควรตรวจสอบ www.oocss.org มากไปกับสิ่งที่คุณได้กล่าวถึงที่นี่ แต่มันเป็นวิธีที่ดีที่สุดที่ฉันเคยเห็นในการจัดการ CSS bloat ดูคำตอบของฉันด้านล่างด้วย: stackoverflow.com/questions/2253110/how-to-manage-css-explosion/ …
Moin Zaman

2
@Sam ขอบคุณ! ฉันชอบมันค่อนข้างดีแม้ว่าบางครั้งฉันพบแนวทางเหล่านี้ยากมากที่จะทำตามตัวเอง สไตล์ชีต CSS นั้นง่ายต่อการทำให้เสียเวลา - การเปลี่ยนสีที่นี่font-weight: boldมี .... วินัยเป็นยาเพียงอย่างเดียว :)
Pekka

1
การพูดว่าเป็นคนใหม่ในการศึกษาการระเบิดของ css วลี "คลาสที่ไม่เหมือนใคร" กำลังสับสน ฉันรู้สึกว่ามันไม่ใช่idแต่ฉันแน่ใจว่ามันฟังดูเหมือน บางทีแนวคิดนี้สามารถอธิบายได้?
อารีย์ทอง

2
@ari คุณพูดถูกที่อาจเป็นเทคนิคidด้วยเช่นกัน
Pekka

89

นี่เป็นเพียง 4 ตัวอย่าง:

ในทุก 4 คำตอบของฉันได้รวมคำแนะนำในการดาวน์โหลดและอ่าน Natalie Downe ไฟล์ PDF ระบบ CSS (PDF มีบันทึกจำนวนมากที่ไม่ได้อยู่ในสไลด์ดังนั้นอ่าน PDF!) จดคำแนะนำของเธอสำหรับองค์กร

แก้ไข (2014/02/05)สี่ปีต่อมาฉันพูดว่า:

  • ใช้ CSS pre-processorและจัดการไฟล์ของคุณเป็น partials (โดยส่วนตัวแล้วผมชอบ Sass with Compass แต่ Less ก็ค่อนข้างดีเช่นกันและมีคนอื่น)
  • อ่านข้อมูลเกี่ยวกับแนวคิดเช่นOOCSS , SMACSSและBEMหรือgetbem
  • ดูว่า CSS frameworks ยอดนิยมอย่างBootstrapและZurb Foundationนั้นมีโครงสร้างอย่างไร และอย่าลดกรอบความนิยมที่น้อยลง - Inuitเป็นโครงร่างที่น่าสนใจ แต่ยังมีกรอบอื่น ๆ อีกมากมาย
  • รวม / ย่อขนาดไฟล์ของคุณด้วยขั้นตอนการสร้างบนเซิร์ฟเวอร์การรวมอย่างต่อเนื่องและ / หรือตัวเริ่มงานอย่าง Grunt หรือ Gulp

ตัวประมวลผลล่วงหน้า CSS เป็นสาเหตุของปัญหาแทนที่จะเป็นวิธีแก้ปัญหา ต้นแบบแนวคิดการเรียงซ้อนอย่างแท้จริงและคุณจะลดการขยายตัว
Daniel Sokolowski

@DanielSokolowski เครื่องมือใด ๆ ที่ใช้อย่างไม่เหมาะสมอาจเป็นปัญหาได้มากกว่าการแก้ปัญหา แต่ 100% เห็นด้วยกับประเด็นของการควบคุมน้ำตก
Andy Ford

73

อย่าเขียนหัวเรื่องใน CSS

เพียงแค่แบ่งส่วนต่างๆเป็นไฟล์ ความคิดเห็น CSS ใด ๆ ควรเป็นเพียงความคิดเห็น

reset.css
base.css
somepage.css
someotherpage.css
some_abstract_component.css

ใช้สคริปต์เพื่อรวมเข้าเป็นหนึ่งเดียว ในกรณีที่จำเป็น. คุณสามารถมีโครงสร้างไดเรกทอรีที่ดีได้เช่นกันและให้สคริปต์ของคุณทำการสแกน.cssไฟล์ซ้ำ ๆ

หากคุณต้องเขียนหัวเรื่องให้มี TOC ที่จุดเริ่มต้นของไฟล์

หัวเรื่องใน TOC ควรเท่ากับส่วนหัวที่คุณเขียนในภายหลังอย่างสมบูรณ์ การค้นหาหัวเรื่องเป็นเรื่องยาก ในการเพิ่มปัญหาใคร ๆ จะรู้ว่าคุณมีส่วนหัวอื่นหลังจากส่วนหัวแรกของคุณอย่างไร PS อย่าเพิ่ม Doc-like * (ดาว) ที่จุดเริ่มต้นของแต่ละบรรทัดเมื่อเขียน TOC มันแค่ทำให้การเลือกข้อความน่ารำคาญยิ่งขึ้น

/* Table of Contents
   - - - - - - - - -
   Header stuff
   Body Stuff
   Some other junk
   - - - - - - - - -
 */
...
/* Header Stuff 
 */
...
/* Body Stuff 
 */

เขียนความคิดเห็นด้วยหรือภายในกฎไม่ใช่ด้านนอกบล็อก

ก่อนอื่นเมื่อคุณแก้ไขสคริปต์มีโอกาส 50/50 คุณจะต้องใส่ใจกับสิ่งที่อยู่นอกบล็อกกฎ (โดยเฉพาะอย่างยิ่งถ้ามันเป็นข้อความขนาดใหญ่;)) ประการที่สองมี (เกือบ) ไม่มีกรณีที่คุณจะต้องมี "ความคิดเห็น" นอก หากอยู่นอกก็เป็น 99% ของเวลาที่มีชื่อดังนั้นให้เป็นเช่นนั้น

แยกหน้าออกเป็นส่วนประกอบ

ส่วนประกอบควรมีposition:relativeไม่paddingและไม่marginใช้เวลาส่วนใหญ่ ช่วยลดความยุ่งยากนี้% กฎจำนวนมากเช่นเดียวกับการอนุญาตให้ง่ายมากabsolute:position'ไอเอ็นจีขององค์ประกอบเพราะถ้ามีภาชนะบรรจุในตำแหน่งที่แน่นอนองค์ประกอบในตำแหน่งที่แน่นอนจะใช้ภาชนะเมื่อคำนวณtop, right, bottom, leftคุณสมบัติ

DIV ส่วนใหญ่ในเอกสาร HTML5 มักเป็นส่วนประกอบ

องค์ประกอบเป็นสิ่งที่สามารถพิจารณาหน่วยอิสระในหน้า ในแง่ของฆราวาสรักษาบางอย่างเช่นองค์ประกอบถ้ามันทำให้รู้สึกถึงบางสิ่งบางอย่างรักษาเหมือนกล่องดำ

ไปกับตัวอย่างหน้า QA อีกครั้ง:

#navigation
#question
#answers
#answers .answer
etc.

โดยการแบ่งหน้าออกเป็นส่วนประกอบคุณแบ่งงานของคุณออกเป็นหน่วยที่จัดการได้

วางกฎที่มีเอฟเฟกต์สะสมในบรรทัดเดียวกัน

ตัวอย่างเช่นborder, marginและpadding( แต่ไม่outline) เพิ่มทั้งหมดไปยังมิติและขนาดขององค์ประกอบที่คุณได้รับการจัดแต่งทรงผม

position: absolute; top: 10px; right: 10px;

หากพวกเขาเป็นเพียงที่ไม่สามารถอ่านได้ในหนึ่งบรรทัดอย่างน้อยทำให้พวกเขาอยู่ใกล้:

padding: 10px; margin: 20px;
border: 1px solid black;

ใช้ชวเลขเมื่อเป็นไปได้:

/* the following... */
padding-left: 10px;
padding-right: 10px;
/* can simply be written as */
padding: 0 10px;

อย่าเลือกตัวเลือกซ้ำ

หากคุณมีอินสแตนซ์เพิ่มเติมของตัวเลือกเดียวกันมีโอกาสดีที่คุณจะหลีกเลี่ยงไม่ได้ที่จะต้องจบด้วยอินสแตนซ์ของกฎเดียวกันหลายอินสแตนซ์ ตัวอย่างเช่น:

#some .selector {
    margin: 0;
    font-size: 11px;
}
...
#some .selector {
    border: 1px solid #000;
    margin: 0;
}

หลีกเลี่ยงการใช้ TAGs เป็นตัวเลือกเมื่อคุณสามารถใช้ id / คลาส

ก่อนปิดแท็ก DIV และ SPAN เป็นข้อยกเว้น: คุณไม่ควรใช้มันเลย! ;) ใช้เพื่อแนบ class / id เท่านั้น

นี้...

div#answers div.answer table.statistics {
    border-collapse: collapsed;
    color: pink;
    border: 1px solid #000;
}
div#answers div.answer table.statistics thead {
    outline: 3px solid #000;
}

ควรเขียนดังนี้:

#answers .answer .statistics {
    border-collapse: collapsed;
    color: pink;
    border: 1px solid #000;
}
#answers .answer .statistics thead {
    outline: 3px solid #000;
}

เนื่องจาก DIV ที่ห้อยอยู่พิเศษนั้นไม่เพิ่มอะไรให้กับตัวเลือก พวกเขายังบังคับใช้กฎแท็กที่ไม่จำเป็น ตัวอย่างเช่นถ้าคุณเปลี่ยน.answerจาก a divเป็นarticleสไตล์ของคุณ

หรือถ้าคุณต้องการความชัดเจนมากขึ้น:

#answers .answer .statistics {
    color: pink;
    border: 1px solid #000;
}
#answers .answer table.statistics {
    border-collapse: collapsed;
}
#answers .answer .statistics thead {
    outline: 3px solid #000;
}

เหตุผลที่เป็นคุณสมบัติเป็นคุณสมบัติพิเศษที่ทำให้รู้สึกเมื่อนำไปใช้กับborder-collapse tableถ้า.statisticsไม่ใช่tableจะไม่ควรใช้

กฎทั่วไปเป็นสิ่งชั่วร้าย!

  • หลีกเลี่ยงการเขียนกฎทั่วไป / เวทมนตร์หากคุณทำได้
  • ยกเว้นว่าจะเป็นสำหรับ CSS-reset / unreset เวทมนตร์ทั่วไปทั้งหมดของคุณควรใช้กับองค์ประกอบของรากอย่างน้อยหนึ่งองค์ประกอบ

พวกเขาไม่ได้ช่วยคุณประหยัดเวลาพวกเขาทำให้หัวของคุณระเบิด เช่นเดียวกับการบำรุงรักษาฝันร้าย เมื่อคุณเขียนกฎคุณอาจทราบว่ามีการนำไปใช้ที่ไหน แต่ไม่รับประกันว่ากฎของคุณจะไม่ยุ่งกับคุณในภายหลัง

ในการเพิ่มกฎทั่วไปนี้ทำให้เกิดความสับสนและอ่านยากแม้ว่าคุณจะมีความคิดเกี่ยวกับเอกสารที่คุณใส่สไตล์ นี่ไม่ได้เป็นการบอกว่าคุณไม่ควรเขียนกฎทั่วไปเพียง แต่อย่าใช้กฎเหล่านั้นเว้นแต่ว่าคุณต้องการให้เป็นกฎทั่วไปและถึงแม้จะเพิ่มข้อมูลขอบเขตเข้าไปในตัวเลือกเท่าที่คุณจะทำได้

อะไรเช่นนี้ ...

.badges {
    width: 100%;
    white-space: nowrap;
}

address {
    padding: 5px 10px;
    border: 1px solid #ccc;
}

... มีปัญหาเช่นเดียวกับการใช้ตัวแปรโกลบอลในภาษาโปรแกรม คุณต้องให้ขอบเขต!

#question .userinfo .badges {
    width: 100%;
    white-space: nowrap;
}

#answers .answer .userinfo address {
    padding: 5px 10px;
    border: 1px solid #ccc;
}

โดยทั่วไปที่อ่านว่า:

components                   target
---------------------------- --------
#answers .answer   .userinfo address
-------- --------- --------- --------
domain   component component selector 

ฉันชอบใช้ ID ทุกครั้งที่องค์ประกอบที่ฉันรู้จักคือซิงเกิลตันบนหน้า ความต้องการของคุณอาจแตกต่างกัน

หมายเหตุ: เป็นการดีที่คุณควรเขียนพอ การกล่าวถึงส่วนประกอบเพิ่มเติมในตัวเลือกอย่างไรก็ตามเป็นข้อผิดพลาดที่ให้อภัยมากกว่าเมื่อเปรียบเทียบกับการกล่าวถึงส่วนประกอบที่น้อยลง

สมมติว่าคุณมีpaginationองค์ประกอบ คุณใช้งานได้ในหลายที่ทั่วทั้งไซต์ของคุณ นี่จะเป็นตัวอย่างที่ดีของการที่คุณจะเขียนกฎทั่วไป ให้บอกว่าคุณdisplay:blockลิงค์หมายเลขหน้าแต่ละคนและให้พวกเขามีพื้นหลังสีเทาเข้ม เพื่อให้มองเห็นได้คุณจะต้องมีกฎเช่นนี้:

.pagination .pagelist a {
    color: #fff;
}

ตอนนี้สมมติว่าคุณใช้การแบ่งหน้าสำหรับรายการคำตอบคุณอาจพบสิ่งนี้

#answers .header a {
    color: #000;
}
...
.pagination .pagelist a {
    color: #fff;
}

นี่จะทำให้ลิงก์สีขาวของคุณเป็นสีดำซึ่งคุณไม่ต้องการ

วิธีที่ไม่ถูกต้องในการแก้ไขคือ:

.pagination .pagelist a {
    color: #fff !important;
}

วิธีที่ถูกต้องในการแก้ไขคือ:

#answers .header .pagination .pagelist a {
    color: #fff;
}

ความคิดเห็น "ตรรกะ" ที่ซับซ้อนไม่ทำงาน :)

ถ้าคุณเขียนบางอย่างเช่น: "ค่านี้ขึ้นอยู่กับ blah-blah บวกกับความสูงของ blah-blah" มันเป็นสิ่งที่หลีกเลี่ยงไม่ได้ที่คุณจะทำผิดพลาดและมันจะล้มลงเหมือนบ้านของไพ่

ทำให้ความคิดเห็นของคุณง่าย ถ้าคุณต้องการ "ตรรกะการดำเนินงาน" พิจารณาหนึ่งในบรรดาภาษา CSS templating เช่นSASSหรือน้อย

ฉันจะเขียนพาเลทสีได้อย่างไร

ปล่อยให้เรื่องนี้จบ มีไฟล์สำหรับพาเลทสีทั้งหมดของคุณ หากไม่มีไฟล์นี้สไตล์ของคุณยังควรมีพาเลทสีที่สามารถใช้งานได้ในกฎ พาเลทสีของคุณควรเขียนทับ คุณเลือกลูกโซ่โดยใช้ส่วนประกอบหลักระดับสูงมาก (เช่น. #page) จากนั้นเขียนสไตล์ของคุณเป็นบล็อกกฎแบบพอเพียง มันอาจเป็นแค่สีหรืออะไรมากกว่านั้น

เช่น.

#page #header .description,
#page #categories .description,
#page #answers .answer .body
{
    color: #222; background: #fff; 
    border-radius: 10px;
    padding: 1em;
}

ความคิดนั้นง่ายแท่นวางสีของคุณเป็นสไตล์ชีทซึ่งเป็นอิสระจากสไตล์ฐานซึ่งคุณเรียงซ้อนกัน

ชื่อน้อยต้องการหน่วยความจำน้อยลงทำให้อ่านง่ายขึ้น

ใช้ชื่อน้อยกว่าดีกว่า ใช้คำที่ง่ายมาก (และสั้น ๆ ) คำ: ข้อความส่วนหัว

ฉันยังพบว่าการผสมผสานของคำง่าย ๆ นั้นง่ายต่อการเข้าใจแล้วมีซุปคำที่ "เหมาะสม" ที่ยาว: postbody, posthead, userinfo เป็นต้น

รักษาคำศัพท์เล็ก ๆ ด้วยวิธีนี้แม้ว่าคนแปลกหน้าบางคนจะเข้ามาอ่านซุปสไตล์ของคุณ (เช่นตัวคุณเองหลังจากผ่านไปสองสามสัปดาห์)) เพียงแค่ต้องเข้าใจว่าคำศัพท์นั้นถูกใช้ที่ไหน ตัวอย่างเช่นฉันใช้.thisเมื่อใดก็ตามที่องค์ประกอบควรจะเป็น "รายการที่เลือก" หรือ "รายการปัจจุบัน" ฯลฯ

ทำความสะอาดตัวเอง

การเขียน CSS ก็เหมือนกับการกินบางครั้งคุณก็ทิ้งความวุ่นวายเอาไว้ ตรวจสอบให้แน่ใจว่าคุณล้างระเบียบนั้นมิฉะนั้นรหัสขยะก็จะกองพะเนินเทินทึก ลบคลาส / รหัสที่คุณไม่ได้ใช้ ลบกฎ CSS ที่คุณไม่ได้ใช้ ตรวจสอบให้แน่ใจว่าทุกอย่างเรียบร้อยดีและคุณไม่มีกฎที่ขัดแย้งหรือซ้ำซ้อน

หากคุณแนะนำให้คุณปฏิบัติต่อคอนเทนเนอร์บางตัวเป็นกล่องดำ (ส่วนประกอบ) ตามสไตล์ของคุณใช้ส่วนประกอบเหล่านั้นในตัวเลือกของคุณและเก็บทุกอย่างไว้ในไฟล์เฉพาะไฟล์เดียว (หรือแบ่งไฟล์ด้วย TOC และส่วนหัวอย่างถูกต้อง) ทำงานง่ายกว่ามาก ...

คุณสามารถใช้เครื่องมือเช่นส่วนเสริม firefox Selectors Dust-Me (เคล็ดลับ: ชี้ไปที่ sitemap.xml) เพื่อช่วยคุณค้นหาขยะบางส่วนที่ซ่อนอยู่ใน css nukes และ carnies ของคุณ

เก็บunsorted.cssไฟล์

สมมติว่าคุณมีการจัดแต่งทรงผมเว็บไซต์ QA และคุณมีสไตล์ชีทสำหรับ "คำตอบที่หน้า" answers.cssซึ่งเราจะเรียก หากคุณต้องการเพิ่ม css ใหม่จำนวนมากให้เพิ่มลงในunsorted.cssสไตล์ชีทจากนั้นปรับโครงสร้างใหม่ในanswers.cssสไตล์ชีทของคุณ

ด้วยเหตุผลหลายประการ:

  • มันเร็วกว่าที่จะ refactor หลังจากเสร็จสิ้นจากนั้นก็คือการค้นหากฎ (ที่อาจไม่มีอยู่) และฉีดโค้ด
  • คุณจะเขียนสิ่งที่คุณจะลบการฉีดโค้ดทำให้ยากที่จะลบรหัสนั้น
  • การต่อท้ายไฟล์ต้นฉบับจะนำไปสู่การทำซ้ำกฎ / ตัวเลือก

1
ตัวเลือกที่ไม่ใช่แท็กนั้นช้ากว่าตัวที่ใช้แท็ก เบราว์เซอร์ทั้งหมดมีวิธีเนทีฟเพื่อรับ 'div' เช่น (หรือแท็กอื่น ๆ ) หากคุณปล่อยให้มันเป็นชื่อสามัญเกินไป ('.class') เอ็นจิ้นการเรนเดอร์จะต้องเดินองค์ประกอบทั้งหมดของ DOM เพื่อดูว่ามีการแข่งขันอยู่หรือไม่
Miguel Ping

@Miguel ทำไมเครื่องมือเรนเดอร์ไม่ต้องเดินองค์ประกอบทั้งหมดใน DOM เพื่อดูว่าเป็น DIV หรือไม่ หากมีการเพิ่มประสิทธิภาพพิเศษบางอย่างเหตุใดจึงไม่ใช้กับคลาส / รหัสประจำตัว คุณมีแหล่งที่มาหรือไม่? นักฆ่าประสิทธิภาพที่มองเห็นเพียงอย่างเดียวที่ฉันสังเกตเห็นด้วย CSS นั้นเกิดจากสแปมแบบลอยตัว - มันอาจทำให้เอ็นจิ้นการเรนเดอร์ช้าลงอย่างมากในบางเบราว์เซอร์เมื่อเลื่อนหน้าเว็บ
srcspider

3
ฉันกำลังจะไปลงคะแนนขึ้นนี้ได้บอกว่าจะไม่ tagNames เป้าหมาย แต่ก็มีเป็นส่วนหนึ่งเกี่ยวกับการไม่ถูกทั่วไป (เย้!) (Boo!)
mwilcox

1
@Miguel มันไม่ทำงานอย่างนั้น เบราว์เซอร์อ่านสตริง CSS ย้อนหลังดังนั้นจึงต้องใช้: "div .myclass" และค้นหาคลาส ".myclass" ทั้งหมดจากนั้นตรวจสอบว่าเป็นบรรพบุรุษของ div หรือไม่
mwilcox

5
การเปรียบเทียบกฎทั่วไปกับตัวแปรทั่วโลกเป็นความเข้าใจผิดที่ยิ่งใหญ่ที่สุดที่ฉันเคยได้ยินเกี่ยวกับ CSS
gblazex

55

ดูที่ 1. SASS 2. เข็มทิศ


11
ล้านครั้งนี้ การใช้ Sass ทำให้ฉันเป็นผู้จัดการ CSS & Wrangler ที่ทรงพลังกว่าที่เคย มันช่วยให้ฉันจัดระเบียบสไตล์ในหลาย ๆ ไฟล์, รูปแบบซ้อน, ใช้ตัวแปร, ฯลฯ , ฯลฯ .
Alan H.

2
sass, เข็มทิศและน้อยกว่าทั้งหมดผลิต CSS ปกติในตอนท้ายของวันซึ่งยังคงน่าเกลียดและระเบิด มันไม่ใช่ทางออกของ CSS bloat ในตัวมันเอง
Moin Zaman

8
@Moin_Zaman ในความเห็นที่ต่ำต้อยของฉันคำพูดของคุณคือความบริสุทธิ์ คุณเขียนด้วย sass / compass / less และจัดระเบียบรหัสของคุณในไฟล์ของพวกเขา คุณไม่สนใจว่า css เอาต์พุตจะเป็นอย่างไร นอกจากนี้อย่างน้อย (ผ่านแอพที่น้อยกว่า) สามารถลดขนาดเอาต์พุตซึ่งยอดเยี่ยม
bzx

1
@bzx คุณกำลังพิสูจน์จุดของฉัน :) เบราว์เซอร์ไม่เข้าใจ sass / compass / less สิ่งเหล่านี้จำเป็นต้องเรียบเรียงเป็น CSS เก่าธรรมดาทั้งฝั่งไคลเอนต์หรือเป็นส่วนหนึ่งของงานสร้างของคุณ การใช้เครื่องมือเช่นนี้โดยไม่รู้ว่าสิ่งที่พวกเขาสร้างเป็น CSS ในตอนท้ายทำให้การละเมิดนั้นเป็นเรื่องง่ายและไม่รู้จบและจบลงด้วยไฟล์ CSS ที่ใหญ่กว่า
Moin Zaman

นั่นคือสิ่งที่การบีบอัด gzip เข้ามาเล่น ... เว็บเซิร์ฟเวอร์และเบราว์เซอร์ส่วนใหญ่จะสื่อสารกับเนื้อหา gzipped เมื่อเป็นไปได้ หากคุณสิ้นสุดการทำซ้ำตัวเลือกหลาย ๆ ครั้งมันจะถูกซิปเข้าในรายการตารางแฮชเดียว ปัญหาจริงเท่านั้นคือจำนวน RAM ที่จำเป็นในการแยกกฎ CSS ในเบราว์เซอร์
บุคคลที่สาม

31

วิธีที่ดีที่สุดที่ฉันเคยเห็นเพื่อต่อต้านการCSSขยายตัวคือการใช้หลักการ CSS ที่มุ่งเน้นวัตถุ

แม้จะมีกรอบOOCSSออกมานั่นก็ค่อนข้างดี

อุดมการณ์บางอย่างขัดแย้งกับสิ่งที่ถูกกล่าวถึงในคำตอบยอดนิยมมากมาย แต่เมื่อคุณรู้วิธีการออกแบบสถาปัตยกรรมCSSเชิงวัตถุคุณจะเห็นว่ามันทำงานได้จริงในการรักษาโค้ดเอนเอียงและค่าเฉลี่ย

สิ่งสำคัญที่นี่คือการระบุ 'วัตถุ' หรือรูปแบบการสร้างบล็อกในไซต์และสถาปนิกของคุณ

Facebook จ้างผู้สร้าง OOCSS, Nicole Sullivanเพื่อรับการประหยัดจำนวนมากในโค้ดส่วนหน้า (HTML / CSS) ใช่คุณจริงจะได้รับเงินฝากออมทรัพย์ไม่เพียง แต่ใน CSS ของคุณ แต่ใน HTML ของคุณมากเกินไปซึ่งด้วยเสียงของมันเป็นไปได้มากสำหรับคุณที่คุณพูดถึงการแปลงtableรูปแบบขึ้นอยู่เป็นจำนวนมากของdiv's

อีกวิธีที่ยอดเยี่ยมคล้ายกันในบางแง่มุมกับ OOCSS คือการวางแผนและเขียน CSS ของคุณให้สามารถปรับขนาดได้และแบบแยกส่วนตั้งแต่เริ่มต้น Jonathan Snookทำการเขียนที่ยอดเยี่ยมและจอง / ebook เกี่ยวกับSMACSS - Scalable และ Modular Architecture สำหรับ CSS

ให้ฉันเชื่อมโยงคุณด้วยการเชื่อมโยง:
5 ข้อผิดพลาดของ CSS ขนาดใหญ่ - (วิดีโอ)
5 ข้อผิดพลาดของ CSS ขนาดใหญ่ - (สไลด์)
CSS Bloat - (สไลด์)


16

คุณควรเข้าใจน้ำตกและน้ำหนักและวิธีการทำงาน

ฉันสังเกตเห็นว่าคุณใช้ตัวระบุคลาสเท่านั้น (div.title) คุณรู้หรือไม่ว่าคุณสามารถใช้รหัสได้เช่นกันและรหัสนั้นมีน้ำหนักมากกว่าชั้นเรียน

ตัวอย่างเช่น,

#page1 div.title, #page1 ul, #page1 span {
  // rules
}

จะทำให้องค์ประกอบทั้งหมดเหล่านี้มีขนาดตัวอักษรร่วมพูดร่วมหรือสีหรือกฎของคุณ คุณสามารถทำให้ DIV ทั้งหมดที่เป็นลูกหลานของ # page1 ได้รับกฎบางอย่าง

สำหรับน้ำหนักโปรดจำไว้ว่าแกน CSS จะย้ายจากส่วนใหญ่ทั่วไป / เบาที่สุดไปยังเฉพาะที่สุด / หนักที่สุด นั่นคือในตัวเลือก CSS ตัวระบุองค์ประกอบจะถูกแทนที่โดยตัวระบุคลาสจะถูกแทนที่ด้วยตัวระบุ ID การนับตัวเลขดังนั้นตัวเลือกที่มีตัวระบุองค์ประกอบสองตัว (ul li) จะมีน้ำหนักมากกว่าหนึ่งตัวที่มีตัวระบุเพียงตัวเดียว (li)

คิดว่ามันเหมือนตัวเลข 9 ในคอลัมน์คนยังคงน้อยกว่าหนึ่งในคอลัมน์สิบ ตัวเลือกที่มีตัวระบุ ID ตัวระบุคลาสและตัวระบุองค์ประกอบสองตัวจะมีน้ำหนักมากกว่าตัวเลือกที่ไม่มี ID ตัวระบุคลาส 500 และตัวระบุองค์ประกอบ 1,000 รายการ นี่เป็นตัวอย่างที่ไร้สาระแน่นอน แต่คุณเข้าใจแล้ว ประเด็นก็คือการใช้แนวคิดนี้ช่วยให้คุณล้าง CSS จำนวนมากได้

BTW การเพิ่มตัวระบุองค์ประกอบให้กับคลาส (div.title) ไม่จำเป็นเว้นแต่คุณจะพบข้อขัดแย้งกับองค์ประกอบอื่น ๆ ที่มี class = "title" อย่าเพิ่มน้ำหนักที่ไม่จำเป็นเพราะคุณอาจจำเป็นต้องใช้น้ำหนักนั้นในภายหลัง


การใช้ ID นั้นไม่ดีเหมือนกับการใช้ตัวแปรทั่วโลกในรหัส Visual Basic ของคุณ
alpav

2
@alpav: ขออภัยนั่นไม่ถูกต้อง ID เป็นวิธีที่ยอดเยี่ยมในการสร้างอิลิเมนต์ที่แตกต่างกันในส่วนต่าง ๆ ของหน้าโดยไม่ต้องสร้างชื่อคลาสใหม่
Robusto

@ Robusto: ทำไมการสร้างชื่อ ID ใหม่ทำได้ยากกว่าการสร้างชื่อคลาสใหม่
alpav

@Robusto: การสร้างชื่อคลาสใหม่นั้นง่ายกว่าชื่อ ID เพราะด้วย ID ที่คุณต้องกังวลเกี่ยวกับขอบเขตทั่วโลกและด้วยชื่อคลาสที่คุณต้องกังวลเฉพาะเกี่ยวกับความเป็นเอกลักษณ์ในขอบเขตท้องถิ่นประโยชน์เช่นเดียวกับตัวแปรท้องถิ่น
alpav

1
@alpav“ นั่นเอาชนะจุดประสงค์ของการห่อหุ้ม - เพื่อให้สามารถตั้งชื่อเฉพาะที่โดยไม่ต้องคิดทั่วโลก” ขวา แต่ CSS เตอร์อยู่ทั่วโลกโดยเนื้อแท้: เมื่อคุณเขียนคุณเลือกทุกอย่างกับการเรียน.myclass myclassใน CSS คลาสจะเหมือนกับ id ในส่วนนั้น
Paul D. Waite

12

ฉันขอแนะนำCSS Framework แบบไดนามิกน้อยได้ไหม

มันคล้ายกับ SASS ตามที่กล่าวไว้ก่อนหน้านี้

มันช่วยรักษา CSS ต่อคลาสผู้ปกครอง

เช่น

 #parent{     
  width: 100%;

    #child1
    {    
     background: #E1E8F2;    
     padding: 5px;    
    }

    #child2
   {
     background: #F1F8E2;
     padding: 15px
   }
 }

สิ่งนี้: นำไปใช้ความกว้าง: 100% ทั้ง # child1 และ # child2

นอกจากนี้ CSS เฉพาะ # child1 นั้นเป็น #parent

สิ่งนี้จะทำให้

#parent #child1
{
 width: 100%;
 background: #E1E8F2;
 padding: 5px;
}

#parent #child2
{
 width: 100%;
 background: #F1F8E2;
 padding: 15px;
}

1
ฉันใช้ Sass และอาจเป็นไปได้ว่านี่คือความแตกต่างระหว่าง Sass และน้อยกว่า แต่ฉันค่อนข้างแน่ใจว่ามันจะรวบรวมเป็น # # {ความกว้าง: 100%; } #parent # child1 {background: # E1E8F2; การขยาย: 5px; } #parent # child2 {background: # F1F8E2; การขยาย: 15px; } `
emik

12

ฉันพบว่าสิ่งที่ยากคือการแปลการออกแบบที่จำเป็นสำหรับไซต์ให้เป็นชุดของกฎ ถ้าการออกแบบของไซต์นั้นชัดเจนและเป็นไปตามกฎดังนั้นชื่อคลาสและโครงสร้าง CSS ของคุณสามารถไหลออกมาได้ แต่ถ้าเวลาผ่านไปผู้คนเพิ่มบิตเล็ก ๆ น้อย ๆ ลงในเว็บไซต์ที่ไม่เข้าท่ามากนักคุณไม่สามารถทำอะไรได้มากใน CSS

ฉันมักจะจัดระเบียบไฟล์ CSS ของฉันประมาณนี้

  1. รีเซ็ต CSS, ขึ้นอยู่กับเอริคเมเยอร์ (เพราะอย่างอื่นฉันพบว่าสำหรับองค์ประกอบส่วนใหญ่ฉันมีอย่างน้อยหนึ่งหรือสองกฎที่เพิ่งรีเซ็ตรูปแบบเบราว์เซอร์เริ่มต้น - รายการส่วนใหญ่ของฉันดูไม่เหมือนสไตล์ HTML เริ่มต้นสำหรับรายการ)

  2. ระบบกริด CSS ถ้าเว็บไซต์เรียกมัน (ฉันขุดที่960.gs )

  3. สไตล์สำหรับส่วนประกอบที่ปรากฏในทุกหน้า (ส่วนหัวท้ายกระดาษ ฯลฯ )

  4. สไตล์สำหรับส่วนประกอบที่ใช้ในสถานที่ต่าง ๆ ทั่วทั้งไซต์

  5. สไตล์ที่เกี่ยวข้องกับแต่ละหน้าเท่านั้น

อย่างที่คุณเห็นส่วนใหญ่ขึ้นอยู่กับการออกแบบสำหรับเว็บไซต์ หากการออกแบบมีความชัดเจนและเป็นระเบียบ CSS ของคุณอาจเป็นได้ ถ้าไม่คุณกำลังเมา


7

คำตอบของฉันคือระดับสูงในการจัดการกับข้อกังวลระดับสูงที่คุณแจ้งไว้ในคำถามของคุณ อาจมีเล่ห์เหลี่ยมขององค์กรในระดับต่ำและปรับแต่งที่คุณสามารถทำได้เพื่อให้สวยขึ้น แต่ก็ไม่มีใครสามารถแก้ไขข้อบกพร่องด้านระเบียบวิธีได้ มีหลายสิ่งที่มีผลต่อการระเบิดของ CSS เห็นได้ชัดว่าความซับซ้อนโดยรวมของเว็บไซต์ แต่ยังรวมถึงสิ่งต่าง ๆ เช่นการตั้งชื่อความหมาย, ประสิทธิภาพ CSS, การจัดระเบียบไฟล์ CSS และการยอมรับ / ทดสอบ

คุณดูเหมือนจะอยู่บนเส้นทางที่ถูกต้องด้วยการตั้งชื่อซีแมนทิกส์ แต่มันสามารถก้าวไปอีกขั้น ส่วนของ HTML ที่ปรากฏซ้ำ ๆ บนไซต์โดยไม่มีการดัดแปลงโครงสร้าง (เรียกว่า "โมดูล") สามารถพิจารณาได้ว่าเป็นตัวเลือกรูทและจากนั้นคุณสามารถกำหนดขอบเขตเค้าโครงภายในที่สัมพันธ์กับรูทนั้นได้ นี้เป็นทฤษฎีพื้นฐานของCSS เชิงวัตถุและคุณสามารถอ่าน / ดูเพิ่มเติมเกี่ยวกับเรื่องนี้ในการพูดคุยโดยวิศวกร

มันเป็นสิ่งสำคัญที่จะต้องทราบว่าวิธีการทำความสะอาดนี้สามารถทำงานได้ตรงข้ามของความกังวลของประสิทธิภาพการทำงานที่โปรดปรานเตอร์สั้นตามอย่างใดอย่างหนึ่งใน id หรือแท็กชื่อ การค้นหาความสมดุลนั้นขึ้นอยู่กับคุณ แต่ถ้าคุณไม่มีเว็บไซต์ขนาดใหญ่นี่ก็ควรเป็นไกด์ที่อยู่ด้านหลังหัวของคุณเพื่อเตือนให้คุณเลือกสั้น ประสิทธิภาพมากขึ้นเกี่ยวกับที่นี่

สุดท้ายคุณจะมีไฟล์ CSS ไฟล์เดียวสำหรับทั้งไซต์หรือหลายไฟล์ (ไฟล์ฐานเดียวที่ใช้กับไฟล์ต่อหน้าหรือ -section)? ไฟล์เดียวดีกว่าสำหรับประสิทธิภาพ แต่อาจยากที่จะเข้าใจ / ดูแลกับสมาชิกหลายคนในทีมและอาจทดสอบได้ยากขึ้น สำหรับการทดสอบฉันขอแนะนำให้คุณมีหน้าทดสอบ CSS เดียวซึ่งรวมถึงโมดูล CSS ที่สนับสนุนทั้งหมดเพื่อทดสอบการชนและการเรียงซ้อนแบบไม่ตั้งใจ

อีกวิธีหนึ่งคุณสามารถมีไฟล์ได้หลายวิธีเพื่อกำหนดขอบเขตกฎ CSS ไปยังหน้าหรือส่วน ต้องใช้เบราว์เซอร์เพื่อดาวน์โหลดไฟล์หลายไฟล์ซึ่งเป็นปัญหาด้านประสิทธิภาพ คุณสามารถใช้การเขียนโปรแกรมฝั่งเซิร์ฟเวอร์เพื่อระบุและรวม (และย่อขนาด) ไฟล์ CSS ลงในไฟล์เดียวแบบไดนามิก แต่เนื่องจากไฟล์เหล่านี้แยกต่างหากและการทดสอบสำหรับไฟล์เหล่านี้แยกกันคุณจึงมีความเป็นไปได้ที่จะมีรูปลักษณ์และความรู้สึกที่ไม่สอดคล้องกันบนหน้า / ส่วนต่างๆ ดังนั้นการทดสอบจึงยากขึ้น

มันขึ้นอยู่กับคุณในการวิเคราะห์ความต้องการเฉพาะของลูกค้า


5

ดังที่กล่าวไว้ก่อนหน้าฉัน: เข้าสู่ OOCSS Sass / Less / Compass ดึงดูดให้ใช้ แต่จนกว่า CSS จะใช้วานิลลาอย่างถูกวิธี Sass / Less / Compass จะทำให้สิ่งเลวร้ายลงเท่านั้น

ก่อนอื่นอ่าน css อย่างมีประสิทธิภาพ ลองใช้ Google Page Speed ​​และอ่านสิ่งที่ Souders เขียนเกี่ยวกับ css ที่มีประสิทธิภาพ

จากนั้นป้อน OOCSS

  • เรียนรู้ที่จะทำงานกับน้ำตก (หลังจากที่ทุกคนที่เราเรียกว่าCascadingสไตล์ชีต)
  • เรียนรู้วิธีรับสิทธิ์แบบละเอียด (จากบนลงล่างมากกว่าจากบนลงล่าง)
  • เรียนรู้วิธีแยกโครงสร้างและสกิน (มีอะไรพิเศษและความแตกต่างของวัตถุเหล่านี้คืออะไร)
  • เรียนรู้วิธีแยกคอนเทนเนอร์และเนื้อหา
  • เรียนรู้ที่จะรักกริด

มันจะปฏิวัติทุก ๆ นิดหน่อยเกี่ยวกับการเขียน css ฉันได้รับการต่ออายุทั้งหมดและรักมัน

UPDATE: SMACSS นั้นคล้ายกับ OOCSS แต่ง่ายกว่าในการปรับการพูดโดยทั่วไป


2
"Sass / Less / Compass จะทำให้สิ่งเลวร้ายลง" - ซึ่งเป็นเรื่องที่ค่อนข้างดีและขึ้นอยู่กับโครงการ ฉันจะหยิบยกว่าการใช้หนึ่งในเหล่านี้ร่วมกับ OOCSS จะเป็นประโยชน์อย่างมากต่อการบำรุงรักษาของโครงการขนาดใหญ่จำนวนมาก (โดยเฉพาะอย่างยิ่งผู้ที่อาจมีการเปลี่ยนแปลงรูปแบบบ่อยครั้ง)
Zach Lysobey

ซัค L: OOCSS (หรือสำหรับเรื่องที่ SMACSS) ใช้อย่างถูกต้องทำให้เข็มทิศ / หัก / Sass จำเป็นสำหรับนำหน้าผู้จำหน่ายรายเดียว
madr

ฉันจะไม่พยายามโต้แย้งเรื่องนี้มากเกินไป (โดยเฉพาะตอนนี้ฉันไม่ได้ใช้ pre-processor) แต่ฉันค่อนข้างมั่นใจว่ามีคนจำนวนมากที่ค้นหาสิ่งต่าง ๆ เหล่านี้มีประโยชน์แม้จะอยู่รวมกัน กับ OOCSS / SMACSS นอกเหนือจากปัญหาคำนำหน้าผู้ขาย
Zach Lysobey

4

หลักการสำคัญสำหรับ CSS ที่สมเหตุสมผลถูกแยกจากการสร้างใหม่ของCSS: จากผนวกเท่านั้นถึง CSS แบบแยกส่วน

เขียนใน SASS คุณจะเสียสติไปก่อนเพราะข้อได้เปรียบของตัวแปรมิกซ์อินและอื่น ๆ

อย่าใช้ HTML ID ในการใส่สไตล์ ใช้คลาสเสมอ รหัส HTML เมื่อใช้อย่างถูกต้องจะปรากฏเพียงครั้งเดียวในทั้งหน้าซึ่งตรงกันข้ามกับการใช้งานซ้ำทั้งหมดซึ่งเป็นหนึ่งในสินค้าพื้นฐานที่สุดในด้านวิศวกรรมที่สมเหตุสมผล ยิ่งไปกว่านั้นมันยากที่จะแทนที่ตัวเลือกที่มี ID และบ่อยครั้งที่วิธีเดียวที่จะเอาชนะ HTML ID หนึ่งคือการสร้าง ID อื่นทำให้รหัสในการเผยแพร่ใน codebase เหมือนศัตรูพืชที่พวกเขาเป็น ดีกว่าที่จะปล่อยให้ ID HTML สำหรับการเปลี่ยนแปลง Javascript หรือขอทดสอบบูรณาการ

ตั้งชื่อคลาส CSS ของคุณด้วยฟังก์ชั่นภาพแทนที่จะใช้ฟังก์ชั่นเฉพาะแอปพลิเคชัน ตัวอย่างเช่นพูด ".highlight-box" แทน ".bundle-product-discount-box" การเข้ารหัสด้วยวิธีนี้หมายความว่าคุณสามารถใช้สไตล์ชีตที่มีอยู่อีกครั้งเมื่อคุณมีบทบาทด้านธุรกิจ ตัวอย่างเช่นเราเริ่มขายโน้ตกฎหมาย แต่ไม่นานมานี้ได้เปลี่ยนเป็นอาจารย์สอนกฎหมาย คลาส CSS เก่าของเรามีชื่อเช่น ".download_document_box" ชื่อคลาสที่เหมาะสมเมื่อพูดถึงเอกสารดิจิทัล แต่จะสร้างความสับสนเมื่อใช้กับโดเมนใหม่ของผู้สอนส่วนตัวเท่านั้น ชื่อที่ดีกว่าซึ่งเหมาะกับทั้งบริการที่มีอยู่ - และบริการอื่น ๆ ในอนาคต - จะเป็น ".pretty_callout_box"

หลีกเลี่ยงการตั้งชื่อคลาส CSS หลังจากข้อมูลกริดที่ระบุ มี (และยังคงเป็น) การต่อต้านรูปแบบที่น่ากลัวในชุมชน CSS ซึ่งผู้ออกแบบและผู้สร้างของเฟรมเวิร์ก CSS (ไอTwitter Bootstrap ) เชื่อว่า "span-2" หรือ "cols-8" เป็นชื่อที่สมเหตุสมผลสำหรับคลาส CSS จุดของ CSS คือให้คุณสามารถปรับเปลี่ยนการออกแบบของคุณได้โดยไม่กระทบกับมาร์กอัพ (มาก) Hardcoding กริดขนาดลงใน HTML ขัดขวางเป้าหมายนี้ดังนั้นจึงไม่แนะนำในโครงการใด ๆ ที่คาดว่าจะใช้เวลานานกว่าสุดสัปดาห์ เพิ่มเติมเกี่ยวกับวิธีที่เราหลีกเลี่ยงคลาสกริดในภายหลัง

แบ่ง CSS ของคุณเป็นไฟล์ต่างๆ เป็นการดีที่คุณจะแบ่งทุกอย่างออกเป็น "ส่วนประกอบ" / "วิดเจ็ต" แล้วเขียนหน้าจากอะตอมของการออกแบบเหล่านี้ แม้ว่าตามความเป็นจริงคุณจะสังเกตเห็นว่าบางหน้าเว็บไซต์ของคุณมีนิสัยแปลก (เช่นเลย์เอาต์พิเศษหรือแกลเลอรี่ภาพแปลก ๆ ที่ปรากฏในบทความเดียว) ในกรณีเหล่านี้คุณอาจสร้างไฟล์ที่เกี่ยวข้องกับหน้าเฉพาะนั้นให้ทำการ refactor เป็นวิดเจ็ตแบบเต็มเมื่อมันชัดเจนว่าองค์ประกอบนั้นจะถูกนำไปใช้ที่อื่น นี่คือการแลกเปลี่ยนซึ่งเป็นแรงบันดาลใจจากความกังวลด้านงบประมาณในทางปฏิบัติ

ลดการทำรังให้น้อยที่สุด แนะนำคลาสใหม่แทนการเลือกซ้อน ความจริงที่ว่า SASS จะขจัดความเจ็บปวดจากตัวเลือกการทำซ้ำเมื่อการทำรังไม่ได้หมายความว่าคุณต้องทำรังลึกห้าระดับ ไม่ควรใช้ตัวเลือกมากเกินไป (เช่นอย่าใช้ "ul.nav" โดยที่ ".nav" สามารถทำงานเดียวกันได้) และอย่าระบุองค์ประกอบ HTML ข้างชื่อคลาสที่กำหนดเอง (เช่น "h2.highlight") เพียงแค่ใช้ชื่อคลาสเพียงอย่างเดียวและปล่อยตัวเลือกพื้นฐาน (เช่นตัวอย่างก่อนหน้านี้ควรเป็น ".highlight") ตัวเลือกที่มีคุณสมบัติเกินจะไม่เพิ่มมูลค่าใด ๆ

สร้างสไตล์สำหรับองค์ประกอบ HTML (เช่น "h1") เฉพาะเมื่อจัดแต่งองค์ประกอบพื้นฐานซึ่งควรสอดคล้องในแอปพลิเคชันทั้งหมด หลีกเลี่ยงตัวเลือกแบบกว้างเช่น "header ul" เพราะเป็นไปได้ว่าคุณจะต้องแทนที่พวกมันในบางแห่ง ตามที่เราพูดไว้ตลอดเวลาส่วนใหญ่คุณต้องการใช้คลาสเฉพาะที่มีชื่อเฉพาะเมื่อใดก็ตามที่คุณต้องการสไตล์ที่เฉพาะเจาะจง

ยอมรับพื้นฐานของ Block-Element-Modifier คุณสามารถอ่านเกี่ยวกับมันได้ที่นี่ เราใช้มันค่อนข้างเบา แต่ก็ยังช่วยเราได้มากในการจัดระเบียบสไตล์ CSS


2

หลายครั้งที่ฉันจะเห็นคนแบ่งไฟล์ออกเป็นส่วน ๆ พร้อมกับแสดงความคิดเห็นหัวข้อระหว่างส่วน

สิ่งที่ต้องการ

/* Headings and General Text */

.... stuff here for H1, etc..

/* Main page layout */

.... stuff here for layout page setup etc.

มันทำงานได้ค่อนข้างดีและสามารถทำให้ง่ายต่อการย้อนกลับไปในภายหลังและค้นหาสิ่งที่คุณกำลังทำงานอยู่


สิ่งนี้ไม่ได้กล่าวถึงความกังวลของผู้ถามเกี่ยวกับการมี "แอตทริบิวต์ CSS แยกต่างหากสำหรับทุกสิ่ง"
G-Wiz

1

คุณควรดูที่BEM

ทฤษฎี

BEM เป็นความพยายามที่จะให้ชุดคำสั่งสำหรับการจัดระเบียบและตั้งชื่อตัวเลือก css ในความพยายามที่จะทำให้สิ่งที่สามารถใช้งานได้อีกครั้งและแบบแยกส่วนและเพื่อหลีกเลี่ยงการปะทะกันระหว่างตัวเลือกประเภทที่มักจะนำไปสู่รหัสสปาเก็ตตี้

เมื่อใช้อย่างถูกต้องจริง ๆ แล้วมันมีผลในเชิงบวกบางอย่าง

  • สไตล์ทำในสิ่งที่คุณคาดหวังเมื่อเพิ่มเข้าไปในองค์ประกอบ
  • สไตล์จะไม่รั่วไหลและมีผลเฉพาะสิ่งที่เพิ่มเข้าไปเท่านั้น
  • สไตล์ถูกแยกออกจากโครงสร้างเอกสารอย่างสมบูรณ์
  • สไตล์ไม่จำเป็นต้องถูกบังคับให้ขี่มากเกินไป

BEM ทำงานได้ดีกับ SASS เพื่อนำสไตล์เกือบเชิงวัตถุมาสู่ CSS คุณสามารถสร้างไฟล์แบบแยกส่วนที่จัดการการแสดงองค์ประกอบ UI เดียวและมีตัวแปรเช่นสีและ 'เมธอด' เช่นวิธีการจัดการองค์ประกอบภายใน ในขณะที่โปรแกรมเมอร์ OO แบบไม่ยอมใครง่ายๆอาจรบกวนความคิดนี้ในความเป็นจริงแนวคิดที่ประยุกต์ใช้นำส่วนต่าง ๆ มากมายของโครงสร้าง OO เช่นโมดูลการเชื่อมต่อแบบหลวมและการเชื่อมโยงที่แน่นหนา คุณสามารถสร้างในลักษณะที่ดูเหมือนวัตถุห่อหุ้มโดยใช้Sass และ&operato r

บทความเชิงลึกเพิ่มเติมจากนิตยสาร Smashing สามารถพบได้ที่นี่ ; และหนึ่งจากแฮร์รี่โรเบิร์ต CCS เวทมนตร์ (ซึ่งทุกคนที่เกี่ยวข้องใน css ที่ควรจะมีการอ่านของ) อยู่ที่นี่

ในทางปฏิบัติ

ฉันเคยใช้มันหลายครั้งรวมถึงการใช้ SMACSS และ OOCSS ซึ่งหมายความว่าฉันมีสิ่งที่จะเปรียบเทียบพวกเขาด้วย ฉันยังได้ทำงานในสิ่งยุ่งเหยิงขนาดใหญ่ซึ่งมักเป็นของฉันเองที่ไม่มีประสบการณ์

เมื่อฉันใช้ BEM ในโลกแห่งความเป็นจริงฉันเพิ่มเทคนิคด้วยหลักการพิเศษสองสามข้อ ฉันใช้คลาสยูทิลิตี้ - ตัวอย่างที่ดีคือคลาส wrapper:

.page-section {
    width: 100%;
}
@media screen and (min-width: 1200px) {
    margin: 0 auto;
    width: 1200px;
}

และฉันยังต้องพึ่งพาน้ำตกและความจำเพาะ ที่นี่โมดูล BEM จะเป็น.primary-boxและ.headerจะเป็นบริบทสำหรับการขับรถเกินเฉพาะ

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

(ฉันพยายามอย่างที่สุดที่จะทำให้ทุกอย่างเป็นเรื่องธรรมดาและเป็นอิสระที่สุดเท่าที่จะทำได้หมายถึงโครงการที่ดีเกือบทุกอย่างอยู่ในโมดูลที่สามารถใช้งานได้อีกครั้ง)

จุดสุดท้ายที่ฉันจะทำที่นี่คืออย่างไรก็ตามโครงการขนาดเล็กและไม่ซับซ้อนของคุณอาจปรากฏขึ้นคุณควรทำสิ่งนี้ตั้งแต่เริ่มต้นด้วยเหตุผลสองประการ:

  • โครงการมีความซับซ้อนเพิ่มขึ้นดังนั้นการวางรากฐานที่ดีจึงเป็นสิ่งสำคัญ
  • แม้แต่โครงการที่ดูเรียบง่ายเพราะมันสร้างบน WordPress มีจาวาสคริปต์เพียงเล็กน้อยก็ยังคงซับซ้อนมากใน CSS - ตกลงคุณไม่ต้องทำการเข้ารหัสฝั่งเซิร์ฟเวอร์ใด ๆ ดังนั้นส่วนนั้นง่าย แต่ส่วนหน้าของโบรชัวร์สวมใส่ มียี่สิบโมดูลและแต่ละรูปแบบที่สาม: คุณมี css ที่ซับซ้อนมากที่นั่น!

องค์ประกอบของเว็บ

ในปี 2015 เราเริ่มมองหา Web Components ฉันไม่ทราบจำนวนมากเกี่ยวกับสิ่งเหล่านี้ แต่พวกเขามองที่จะนำฟังก์ชั่นการทำงานส่วนหน้าทั้งหมดมารวมกันในโมดูลที่มีอยู่ในตัวเองพยายามใช้หลักการต่าง ๆ จาก BEM ไปยังส่วนหน้าโดยรวม องค์ประกอบต่างๆเช่นชิ้นส่วน DOM, Js (MVC) และ CSS ที่สร้างวิดเจ็ต UI เดียวกันทั้งหมด

ด้วยการทำเช่นนี้พวกเขาจะจัดการกับปัญหาต้นฉบับบางอย่างที่มีอยู่กับ css ซึ่งเราได้พยายามแก้ไขด้วยสิ่งต่างๆเช่น BEM ในขณะเดียวกันก็ทำให้สถาปัตยกรรมอื่น ๆ ของ front end มีสติมากขึ้น

มีการอ่านเพิ่มเติมที่นี่และกรอบโพลิเมอร์ที่นี่ซึ่งมีค่าดู

ในที่สุด

ฉันยังคิดว่านี่เป็นคู่มือ css แนวปฏิบัติที่ยอดเยี่ยมและทันสมัยที่สุด - ออกแบบมาโดยเฉพาะสำหรับการหยุดโครงการ css ขนาดใหญ่ไม่ให้ยุ่ง ฉันพยายามติดตามสิ่งเหล่านี้ส่วนใหญ่



0

มีวัสดุบางอย่างที่ดีที่นี่และบางส่วนได้ใช้เวลาในการตอบคำถามนี้อย่างไรก็ตามเมื่อมันมาถึงสไตล์ชีทแยกหรือสไตล์ชีทแยกฉันจะไปกับไฟล์แยกเพื่อการพัฒนาแล้วย้ายไปใช้ CSS ทั่วไปทั้งหมดของคุณ เป็นไฟล์เดียวเมื่อปรับใช้

ด้วยวิธีนี้คุณจะได้รับสิ่งที่ดีที่สุดทั้งสองโลกเพิ่มประสิทธิภาพ (ร้องขอ HTTP น้อยกว่าที่ได้รับการร้องขอจากเบราว์เซอร์) และการแยกรหัสข้อกังวลขณะพัฒนา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.