การสืบทอดใน CSS

การสืบทอดใน CSS

บทความนี้อธิบายเรื่องการสืบทอดคุณสมบัติใน CSS

คุณสามารถตรวจสอบคุณสมบัติที่สืบทอดได้และไม่ได้

YouTube Video

HTML สำหรับการแสดงตัวอย่าง

css-inheritance.html
 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <title>CSS Inheritance</title>
 7    <link rel="stylesheet" href="css-base.css">
 8    <link rel="stylesheet" href="css-inheritance.css">
 9</head>
10<body>
11    <!-- Header -->
12    <header>
13        <h1>CSS Inheritance</h1>
14    </header>
15
16    <!-- Main content -->
17    <main>
18        <header><h2>CSS Inheritance</h2></header>
19        <article>
20            <h3>Example of Inheritance</h3>
21            <section>
22                <p>
23                    Example of P Element.<br>
24                    <span>Example of Span Element</span>
25                </p>
26            </section>
27            <div>
28                Example of Div Element
29            </div>
30            <ul>
31                <li>List Item 1</li>
32                <li>List Item 2</li>
33                <li>List Item 3</li>
34            </ul>
35        </article>
36        <article>
37            <h3>all</h3>
38            <section>
39                <h4>Initial</h4>
40                <div class="all-initial">This is an initial element</div>
41            </section>
42            <section>
43                <h4>Inherit</h4>
44                <div class="parent-inherit">
45                    <div class="all-inherit">This is an inherited element</div>
46                </div>
47            </section>
48            <section>
49                <h4>Unset All</h4>
50                <div class="parent-unset">
51                    <div class="all-unset">This is an unset element</div>
52                </div>
53            </section>
54            <section>
55                <h4>all and !important</h4>
56                <div class="important-style">
57                    <div class="all-with-important">
58                        This is an initial element with !important
59                    </div>
60                </div>
61            </section>
62        </article>
63    </main>
64</body>
65</html>

การสืบทอดใน CSS

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

คุณสมบัติที่ถูกสืบทอด

คุณสมบัติที่สามารถสืบทอดได้นั้นส่วนใหญ่เกี่ยวข้องกับข้อความและฟอนต์

คุณสมบัติที่ถูกสืบทอดโดยทั่วไป

  1. color: สีของข้อความ
1body {
2    color: black;
3}
  • ในกรณีนี้ องค์ประกอบของลูกทั้งหมดภายใน body จะมีสีข้อความเป็นสีดำ
  1. font-family: ครอบครัวฟอนต์
1body {
2    font-family: "Times New Roman", cursive;
3}
  • องค์ประกอบของลูกทั้งหมดจะใช้ฟอนต์ Arial
  1. font-size: ขนาดข้อความ
1body {
2    font-size: 16px;
3}
  • ข้อความทั้งหมดภายใน body จะมีขนาด 16px ตามค่าเริ่มต้น
  1. line-height: การเว้นบรรทัด
1p {
2    line-height: 1.5;
3}
  • ข้อความภายในองค์ประกอบ <p> จะแสดงผลด้วยความสูงของบรรทัด 1.5 เท่า ซึ่งจะส่งผลต่อองค์ประกอบลูกด้วย
  1. text-align: จัดแนวข้อความ
1div {
2    text-align: center;
3}
  • ข้อความและองค์ประกอบอินไลน์ภายในองค์ประกอบ div จะถูกแสดงผลให้อยู่กึ่งกลาง
  1. visibility: การมองเห็นองค์ประกอบ
1div {
2    visibility: hidden;
3}
  • visibility เป็นคุณสมบัติที่ควบคุมการมองเห็นขององค์ประกอบ เมื่อถูกตั้งค่าให้เป็นแบบซ่อน องค์ประกอบจะมองไม่เห็น
  • ในกรณีนี้ องค์ประกอบลูกภายใน div จะถูกซ่อนด้วย
  1. list-style: สไตล์รายการ (ตัวบ่งชี้สำหรับ <ul> และ <ol>)
1ul {
2    list-style: square;
3}
  • ในกรณีนี้ รายการลิสต์ภายในแท็ก ul จะถูกแสดงด้วยเครื่องหมายสี่เหลี่ยม

ตัวอย่าง:

คุณสมบัติที่ไม่ถูกสืบทอด

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

คุณสมบัติทั่วไปที่ไม่ถูกสืบทอด

  1. margin, padding: ขอบภายนอกและภายในขององค์ประกอบ
1div {
2    margin: 10px;
3    padding: 20px;
4}
  • แม้ว่าคุณจะตั้งค่าระยะขอบด้านนอกหรือด้านในสำหรับอิลิเมนต์ div ก็จะไม่ส่งผลต่ออิลิเมนต์ลูก
  1. border: ขอบขององค์ประกอบ
1div {
2    border: 1px solid black;
3}
  • แม้ว่าจะมีการตั้งค่าขอบบนอิลิเมนต์พาเรนต์ ก็จะไม่ส่งผลต่ออิลิเมนต์ลูก
  1. width, height: ความกว้างและความสูงขององค์ประกอบ
1div {
2    width: 100px;
3    height: 50px;
4}
  • ความกว้างและความสูงของอิลิเมนต์พาเรนต์จะไม่ส่งผลต่ออิลิเมนต์ลูกโดยอัตโนมัติ
  1. background: ลักษณะพื้นหลัง
1body {
2    background-color: lightblue;
3}
  • สีพื้นหลังที่ตั้งค่าไว้บน body จะไม่ส่งผลต่ออิลิเมนต์ลูกโดยตรง อย่างไรก็ตาม หากอิลิเมนต์ลูกมีพื้นหลังแบบโปร่งใส สีพื้นหลังของอิลิเมนต์พาเรนต์อาจมองเห็นได้ผ่านอิลิเมนต์ลูก

ตัวอย่าง:

การควบคุมการสืบทอด

การสืบทอดสามารถควบคุมได้โดยใช้คำสำคัญ inherit, initial หรือ unset

  • ถ้าคุณต้องการเปิดใช้งานการสืบทอด: คุณสามารถบังคับการสืบทอดได้โดยใช้คีย์เวิร์ด inherit
1div {
2    color: inherit;  /* Inherit the color from its parent element */
3}
  • ถ้าคุณไม่ต้องการการสืบทอด: คุณสามารถรีเซ็ตคุณสมบัติไปยังค่าตั้งต้นได้โดยใช้คีย์เวิร์ด initial หรือ unset
1p {
2    color: initial;  /* Reset the color to its initial/default value */
3}

ตัวอย่าง:

คุณสมบัติ all

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

  • initial: รีเซ็ตคุณสมบัติทั้งหมดกลับไปยังค่าตั้งต้น
  • inherit: สืบทอดคุณสมบัติทั้งหมดจากอิลิเมนต์พาเรนต์
  • unset: สืบทอดคุณสมบัติหากสามารถสืบทอดได้ มิฉะนั้นจะรีเซ็ตกลับไปยังค่าตั้งต้น

all มีประโยชน์มากเมื่อคุณต้องการรีเซ็ตหรือกำหนดคุณสมบัติต่าง ๆ หลายรายการพร้อมกัน แทนการตั้งค่าเฉพาะเจาะจงทีละรายการ

ตัวอย่างของการรีเซ็ตเป็นค่าเริ่มต้น

1.all-initial {
2    all: initial;
3    background-color: lightskyblue;
4}
  • เมื่อคุณต้องการรีเซ็ตสไตล์ทั้งหมดที่ตั้งไว้ก่อนหน้านี้สำหรับอิลิเมนต์ที่ระบุและนำกลับไปสู่สภาวะเริ่มต้น ให้ใช้ all: initial แบบนี้

  • ในตัวอย่างนี้ คุณสมบัติทั้งหมดของอิลิเมนต์ <div> ที่มีคลาส .all-initial จะถูกรีเซ็ตเป็นค่าตั้งต้นเริ่มต้นของเบราว์เซอร์

ตัวอย่างการสืบทอด

 1.parent-inherit {
 2    color: blue;
 3    font-size: 20px;
 4    border: 1px solid blue;
 5}
 6
 7.all-inherit {
 8    all: inherit;
 9    background-color: lightskyblue;
10}
  • การใช้ all: inherit ทำให้คุณสมบัติทั้งหมดสืบทอดมาจากอิลิเมนต์พาเรนต์
  • ในตัวอย่างนี้ อิลิเมนต์ที่มีคลาส .all-inherit จะสืบทอดคุณสมบัติทั้งหมด เช่น color และ font-size จากอิลิเมนต์พาเรนต์

ตัวอย่างการกำหนดค่าเริ่มต้นหรือการสืบทอดตามเงื่อนไข

 1.parent-unset {
 2    color: blue;
 3}
 4
 5.all-unset {
 6    font-weight: bold;
 7}
 8
 9.all-unset {
10    all: unset;
11}
  • การใช้ all: unset จะทำให้คุณสมบัติถูกสืบทอดหากสามารถทำได้ มิฉะนั้นจะถูกรีเซ็ตกลับไปยังค่าตั้งต้น
  • ในกรณีนี้ color จะถูกสืบทอด ในขณะที่ font-weight จะถูกรีเซ็ตกลับไปยังค่าตั้งต้น ซึ่งปกติคือ normal

ความสัมพันธ์กับ Specificity (ลำดับความสำคัญ)

1.all-with-important {
2    color: red !important;
3    background-color: lightskyblue;
4}
5
6.all-with-important {
7    all: initial;
8}
  • คุณสมบัติ all เป็นกลไกการรีเซ็ตที่มีพลัง แต่จะได้รับผลกระทบจากความเฉพาะเจาะจงของ CSS หากอิลิเมนต์เฉพาะมีคำกำหนด(style)ที่เข้มงวด คุณสมบัติ all อาจไม่สามารถแทนที่สไตล์เหล่านั้นได้ ตัวอย่างเช่น คุณสมบัติที่กำหนดด้วย !important จะไม่ได้รับผลกระทบ

  • ในตัวอย่างนี้ แม้ว่าคุณจะพยายามรีเซ็ตสไตล์ด้วย all: initial คุณสมบัติ color จะไม่ถูกรีเซ็ตเนื่องจากถูกกำหนดด้วย color: red !important

องค์ประกอบระดับบล็อกและองค์ประกอบแบบอินไลน์

องค์ประกอบระดับบล็อก

  • ตัวอย่าง: <div>, <p>, <h1><h6>, <ul>, <li>, <section>
  • ลักษณะเฉพาะ:
    • พวกมันมักจะแสดงผลในบรรทัดใหม่เสมอและขยายเพื่อเติมเต็มความกว้างทั้งหมดของอิลิเมนต์พาเรนต์
    • ความกว้าง (width) และความสูง (height) สามารถกำหนดได้อย่างอิสระ
    • ขอบ (margin) และระยะห่างภายใน (padding) สามารถกำหนดได้ทุกทิศทางและจะมีผลต่อทุกด้าน
1div {
2    width: 80%;  /* Set the width to 80% of its parent element's width */
3    padding: 20px;  /* Add a padding of 20 pixels on all sides */
4    margin: 10px 0; /* Add a margin of 10 pixels top and bottom, 0 pixels left and right */
5}

องค์ประกอบแบบอินไลน์

  • ตัวอย่าง: <span>, <a>, <strong>, <em>, <img>, <label>
  • ลักษณะเฉพาะ:
    • พวกมันจะปรากฏเคียงข้างกับองค์ประกอบอินไลน์อื่นๆ ในบรรทัดเดียวกัน
    • ความกว้าง (width) และความสูง (height) ไม่สามารถตั้งค่าได้โดยตรง (เว้นแต่จะใช้ display: block)
    • การกำหนดขอบ (margin) หรือระยะห่างภายใน (padding) ในแนวตั้งมีผลจำกัด (ขอบและระยะห่างภายในในแนวนอนมีผล)
1a {
2    padding: 5px;  /* Padding for inline elements */
3    margin-right: 10px;  /* Set margin to the right */
4    color: blue;
5}

ความแตกต่างระหว่างองค์ประกอบระดับบล็อกกับองค์ประกอบแบบอินไลน์

  • การตั้งค่าความกว้างและความสูง:

    • องค์ประกอบระดับบล็อก: สามารถกำหนดความกว้างและความสูงได้
    • องค์ประกอบอินไลน์: โดยทั่วไปไม่สามารถกำหนดความกว้างและความสูงได้
  • ระยะขอบและการย่อขยาย:

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

    • องค์ประกอบระดับบล็อก: จะถูกวางบนบรรทัดใหม่โดยอัตโนมัติ
    • องค์ประกอบอินไลน์: จัดเรียงในบรรทัดเดียวกันกับองค์ประกอบอินไลน์อื่นๆ

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

การจัดการ CSS ของอิลิเมนท์ระดับบล็อกและอินไลน์

1span {
2    display: block;  /* Display the span element as a block-level element */
3    width: 100px;
4    height: 50px;
5}

อย่างไรก็ตาม ด้วยการตั้งค่า display ให้เป็น block หรือ inline-block คุณสามารถปรับแต่งสไตล์ เช่น ความกว้างและความสูงขององค์ประกอบอินไลน์ ให้เหมือนกับเป็นองค์ประกอบระดับบล็อก

คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย

YouTube Video