RSCSS

Part 1

RSCSS

Reasonable System for CSS Stylesheet Structure

Components

แยก UI ออกเป็นองค์ประกอบต่างๆ แต่ละชิ้นส่วนของ UI เป็น 1 Component

แต่ละ component จะตั้งชื่อโดยใช้ อย่างน้อย 2 คำ แยกกันด้วยขีดกลาง

การตั้งชื่อ COMPONENTS
  • ปุ่มไลค์ (.like-button)
  • กล่องค้นหา (.search-form)
  • การ์ดบทความ (.article-card)

elements

Elements คือ ของที่อยู่ข้างใน Component

+ Element ที่อยู่ภายใต้ Component ชื่อของ Class ควรมีเพียง 1 คำ

การตั้งชื่อ ELEMENTS

.search-form > .field { /* ... */ }
.search-form > .action { /* ... */ }

elements (cont.)

+ ถ้าทำได้ให้ใช้ > สำหรับ Child Selector (Element ที่ลึกลงไปแค่ชั้นเดียว) เพื่อป้องกันไม่ให้มันไปเลือก component ลึก ๆ และช่วยให้ได้ประสิทธิภาพดีกว่าด้วย

ELEMENT SELECTORS

.article-card .title     { /* okay */ }
.article-card  > .author  { /* ✓ better */ }

+ สำหรับชื่อ Class ที่ต้องยาว 2 คำหรือมากกว่า ให้เอาคำมาต่อกันเลย โดยไม่ต้องมีเส้นกลาง/เส้นใต้

ถ้าต้องใช้หลายคำ

.profile-box > .firstname { /* ... */ }
.profile-box > .lastname { /* ... */ }
.profile-box > .avatar { /* ... */ }

elements (cont.)

+ ใช้ Classname ไว้ก่อน ถึงแม้การใช้ Tag Selectors จะใช้ได้เหมือนกัน บางทีอาจจะมีปัญหาเรื่องประสิทธิภาพเล็กน้อย ตามมาโดยไม่รู้ตัว

ระวังการใช้ TAG SELECTORS

.article-card > h3    { /* ✗ avoid */ }
.article-card  > .name { /* ✓ better */ }

Element เดียวกัน ก็ใช่ว่าจะหน้าตาเหมือนกันหมด ให้ใช้ Variants ช่วย

VARIANTS

+ ชื่อ Class ของ Variants ให้ขึ้นต้นด้วยขีดกลาง

การตั้งชื่อ VARIANTS

.like-button-wide { /* ... */ }
.like-button-short { /* ... */ }
.like-button-disabled { /* ... */ }

VARIANTS (COnt.)

Varants ของ element ก็ใช้รูปแบบเดียวกัน

ELEMENT VARIANTS

.shopping-card > .title { /* ... */ }
.shopping-card > .title.-small { /* ... */ }
  • ช่วยให้เราไม่สับสนกับ Elements
  • Class ใน CSS สามารถนำหน้าได้ด้วยตัวอักษร _ หรือ - เท่านั้น
  • ขีดกลางพิมพ์ง่ายกว่าขีดล่าง

ทำไมใช้ขีดกลางนำหน้า

เราจะจัดการ Element ที่ซับซ้อนอย่างไร? จับมันซ้อนกัน?

COMPONENT ที่ซ้อนกัน

<div class='article-link'>
  <div class='vote-box'>
    ...
  </div>
  <h3 class='title'>...</h3>
  <p class='meta'>...</p>
</div>

บางทีมันจำเป็นที่ต้องให้ Components กัน

COMPONENT ที่ซ้อนกัน (CONT.)

.article-header > .vote-box > .up { /* ✗ ระวังแบบนี้ */ }

แต่ละ Component อาจจะต้องแสดงผลต่างออกไป ให้เหมือนมันไปอยู่ใน Component อื่น ให้ระวังการแก้ไข Component นั้นโดยการอ้างอิงผ่าน Component ที่อยู่ด้านนอก

VARIANTS

แทนที่จะทำแบบนั้น ให้ใช้วิธีเพิ่ม Variant เข้าไป แล้วใช้มันที่ Component ด้านใน

<div class='article-header'>
  <div class='vote-box -highlight'>
    ...
  </div>
  ...
</div>
.vote-box.-highlight > .up { /* ... */ }

COMPONENT ที่ซ้อนกัน (CONT.)

<div class='search-form'>
  <input class='input' type='text'>
  <button class='search-button -red -large'></button>
</div>

บางครั้ง การซ้อน components จะทำให้ HTML ดูรก

การทำให้ COMPONENTS หลายชั้น ดูง่ายขึ้น

สามารถทำให้มันอ่านง่ายขึ้นได้ด้วยการใช้เทคนิค @extend (,) ใน CSS preprocessor

<div class='search-form'>
  <input class='input' type='text'>
  <button class='submit'></button>
</div>
.search-form > .submit ,
.search-button
.search-button.-red
.search-button.-large { /* ... */ }
.search-form {
  > .submit {
    @extend .search-button;
    @extend .search-button.-red;
    @extend .search-button.-large;
  }
}

LAYOUTS

Components ควรออกแบบให้สามารถใช้ช้ำได้ในหลากหลายบริบท ให้ระวังการกำหนด Property เหล่านี้

ระวังการกำหนด PROPERTIES

  • Positioning (position, top, left, right, bottom)
  • Floats (float, clear)
  • Margins (margin)
  • Dimensions (width, height) *

LAYOUTS (CONTS.)

ให้ใช้เฉพาะ Element ที่มีความกว้าง ความสูงแน่นอน อย่าง Avatars หรือ Logos

การกำหนดขนาดตายตัว

ถ้าต้องกำหนดตำแหน่ง พยายามเขียนให้อยู่ในบริบทที่มันอยู่ เช่น ในตัวอย่างข้างล่าง เราอ่านแล้วจะเดารู้เลยว่า width และ float เกิดขึ้นเฉพาะใน list ไม่เกี่ยวกับ component card

กำหนดตำแหน่งตาม COMPONENT ด้านนอก

.article-list > .article-card { width: 33.3%; float: left; }
.article-card { /* ... */ }
.article-card > .image { /* ... */ }
.article-card > .title { /* ... */ }
.article-card > .category { /* ... */ }

แล้วจะกำหนด Margins นอก Layout ได้อย่างไร?

HELPERS

โดยทั่วไป Class เหล่านี้จะหมายถึงการแทนที่ค่าบางอย่าง ให้เราแยกไฟล์ออกไป แลัวตั้งชื่อนำหน้าด้วยขีดล่าง class พวกนี้มักจะใส่ !important ไว้ด้วย ให้พยายามใช้เฉพาะที่จำเป็นจริง ๆ

ให้นำหน้าชื่อด้วยขีดล่าง จะช่วยให้เรามองออกอย่างรวดเร็วว่ามันไม่ได้เป็นส่วนกำหนดรูปแบบของ component นอกจากนั้นขีดล่างยังดูไม่สวยงาม ช่วยให้เราไม่อยากใช้มันบ่อย ๆ

การตั้งชื่อ HELPERS

<div class='order-graphs -slim _unmargin'>
</div>
._unmargin { margin: 0 !important; }
._center { text-align: center !important; }
._pull-left { float: left !important; }
._pull-right { float: right !important; }

HELPERS (Cont.)

รวบรวม helpers ไว้เป็นไฟล์เดียว ตั้งชื่อว่า helpers แทนที่จะแยกมันเป็นหลายไฟล์ จะช่วยให้เรารักษาจำนวน helpers ให้มีอยู่น้อยที่สุด ไปในตัว

การจัดระเบียบ HELPERS

เขียน CSS อย่างไรไม่ให้เสียสติ

By Jiratha Laothong

เขียน CSS อย่างไรไม่ให้เสียสติ

  • 152