ความหมายที่แท้จริงของคำว่า "Cascading" ใน CSS คืออะไร ฉันได้รับมุมมองที่แตกต่างกันดังนั้นฉันจึงถามที่นี่ ตัวอย่างจะช่วยได้
ความหมายที่แท้จริงของคำว่า "Cascading" ใน CSS คืออะไร ฉันได้รับมุมมองที่แตกต่างกันดังนั้นฉันจึงถามที่นี่ ตัวอย่างจะช่วยได้
คำตอบ:
"เรียงซ้อน" ในบริบทนี้หมายความว่าเนื่องจากการประกาศสไตล์ชีตมากกว่าหนึ่งรายการสามารถนำไปใช้กับส่วนหนึ่งของ HTML ได้จึงต้องมีวิธีที่ทราบกันดีในการพิจารณาว่ากฎสไตล์ชีตใดใช้กับส่วนใดของ HTML
กฎที่ใช้จะถูกเลือกโดยเรียงซ้อนจากการประกาศทั่วไปไปจนถึงกฎเฉพาะที่จำเป็น มีการเลือกคำประกาศที่เฉพาะเจาะจงที่สุด
เมื่อฉันสอน CSS ฉันมักจะบอกนักเรียนเสมอว่า "สไตล์ชีตแบบเรียงซ้อน" หมายถึง " สไตล์ชีตต่อสู้ "
กฎข้อหนึ่งบอกแท็ก H3 ของคุณเป็นสีแดงอีกกฎหนึ่งบอกให้เป็นสีเขียว - กฎขัดแย้งกันเองใครจะชนะ!? สไตล์ชีตพิฆาต!
โอเคอาจจะเป็นการพูดเกินจริงเล็กน้อย แต่ก็สามารถตอบสนองได้ดีกว่าสำหรับคนที่ไม่ใช้โค้ดและไม่ได้เขียนโปรแกรมที่เพิ่งเริ่มต้นมากกว่าแนวคิดเรื่องน้ำตกหรือการสืบทอด
แน่นอนว่าฉันต้องบอกพวกเขาว่ามันไม่ใช่ปัญหาสำหรับสไตล์ชีตที่จะต่อสู้กันเองนั่นคือวิธีการออกแบบภาษา
Håkon Wium Lie (ผู้ร่วมสร้าง CSS) ให้คำจำกัดความ "cascade" ในวิทยานิพนธ์ PHD เรื่อง CSS ว่า "กระบวนการรวมสไตล์ชีตหลาย ๆ แบบและแก้ไขความขัดแย้งระหว่างกัน" https://www.wiumlie.no/2006/phd/
บทความต่อไปนี้ตอบคำถามของคุณได้อย่างสมบูรณ์แบบ
เป็นลำดับที่คุณสมบัติถูกนำไปใช้กับองค์ประกอบหนึ่ง ๆ
คุณต้องคิดจากด้านนอกในถ้าคุณมีกฎที่อยู่บนแท็กร่างกายระบบจะ "เรียงซ้อน" ผ่านแท็กย่อยทุกแท็ก หากคุณวางกฎบนแท็กใด ๆ ภายในเนื้อหาก็จะใช้กฎนั้นไปเรื่อย ๆ ดังนั้นกฎจึงเรียงซ้อนเนื้อหาทั้งหมดเว้นแต่จะถูกขัดจังหวะโดยกฎจากแท็กที่ฝังอยู่
คุณสามารถจัดการกับการประมวลผล CSS ได้เนื่องจากน้ำตกที่มีน้ำตกหลายชั้น ต่อไปนี้คือการลดหลั่นจากบนลงล่างตามลำดับ: (ค่าต่ำสุดสามารถแทนที่คุณสมบัติเดียวกันในส่วนที่สูงกว่าได้)
ดูเพิ่มเติมใน สเป็ค
การเรียงซ้อนคือการเลือกค่าที่เหมาะสมจากต้นกำเนิดหลาย ๆ แต่มันเป็นเรื่องที่แตกต่างจากการเรียงลำดับ เฉพาะบางอย่างที่ไม่จำเป็นต้องเรียงลำดับ แต่ใน CSS ต้นกำเนิดเหล่านี้มีลำดับความสำคัญคงที่ ดังนั้นรหัสเทียมอาจมีลักษณะดังนี้:
จากรหัสหลอกคุณจะเห็นว่ามันดูเหมือนน้ำตกหลายชั้น
คำชี้แจงอย่างหนึ่งที่อาจช่วยได้ หากคุณมีสองสไตล์ชีตและมีกฎที่มีความเฉพาะเจาะจงเหมือนกันในแต่ละสไตล์ก็จะรวมการชนะครั้งสุดท้ายด้วย IE สุดท้ายในน้ำตกมีอิทธิพลมากที่สุด
(นี่เป็นเพียงรูปแบบหนึ่งของการมีกฎสองข้อในแผ่นงานเดียวกัน - ข้อสุดท้ายจะชนะหากสิ่งอื่น ๆ ทั้งหมดเท่ากัน)
เช่นให้
body {
background:blue;
}
body {
background:green;
}
จากนั้นพื้นหลังจะเป็นสีเขียว
คำตอบนี้สำหรับผู้เริ่มต้นอย่างแท้จริง หากคุณต้องการภาพรวมของคำตอบนี้โปรดอ่านคำตอบที่สองของฉัน
Cascading เป็นกระบวนการรวมสไตล์ชีตที่แตกต่างกันและแก้ไขความขัดแย้งระหว่างกฎ CSS และการประกาศที่แตกต่างกันเมื่อมีกฎมากกว่าหนึ่งกฎใช้กับองค์ประกอบบางอย่างที่แตกต่างกันและการประกาศเมื่อมากกว่าหนึ่งกฎนำไปใช้เป็นองค์ประกอบบางอย่าง เนื่องจากอย่างที่คุณทราบกันดีอยู่แล้วว่าการประกาศคุณสมบัติของสไตล์บางอย่างเช่นขนาดฟอนต์สามารถปรากฏในหลายสไตล์ชีตและหลาย ๆ ครั้งในสไตล์ชีทเดียว
เพื่อให้เข้าใจการเรียงซ้อนคุณต้องเริ่มต้นด้วยเฟสการแยกวิเคราะห์ CSS เนื่องจากในขั้นตอนการแยกวิเคราะห์ขั้นตอนแรกคือการแก้ไขการประกาศ CSS ที่ขัดแย้งกันและขั้นตอนที่สองคือการประมวลผลค่า CSS สุดท้าย
ตอนนี้ CSS ยังสามารถมาจากแหล่งต่างๆ สิ่งที่พบบ่อยที่สุดคือ CSS ที่เรานักพัฒนาเขียนขึ้น การประกาศเหล่านี้ที่เราใส่ไว้ในสไตล์ชีตเรียกว่าการประกาศผู้แต่ง แหล่งอื่นอาจเป็นการประกาศผู้ใช้ซึ่ง CSS มาจากผู้ใช้ ตัวอย่างเช่นเมื่อผู้ใช้เปลี่ยนขนาดฟอนต์เริ่มต้นในเบราว์เซอร์นั่นคือ CSS ของผู้ใช้และสุดท้าย แต่ไม่ท้ายสุดจะมีการประกาศเบราว์เซอร์เริ่มต้น
ตัวอย่างเช่นหากเราใส่แท็กจุดยึดใน HTML ของเราสำหรับลิงก์แล้วไม่จัดรูปแบบเลยโดยปกติจะแสดงผลด้วยข้อความสีน้ำเงินและขีดเส้นใต้ด้านขวา ซึ่งเรียกว่า User agent CSS เนื่องจากเบราว์เซอร์กำหนด ดังนั้น cascade จึงรวมการประกาศ CSS ที่มาจากแหล่งที่มาที่แตกต่างกันเหล่านี้ทั้งหมด แต่ cascade จะแก้ไขความขัดแย้งได้อย่างไรเมื่อใช้กฎมากกว่าหนึ่งกฎ
สิ่งที่ต้องทำคือการดูความสำคัญที่ความจำเพาะของตัวเลือกและลำดับแหล่งที่มาของการประกาศที่ขัดแย้งกันเพื่อกำหนดว่าอันไหนมีความสำคัญเหนือกว่าและนี่คือวิธีการทำงาน อันดับแรกจากการเรียงซ้อนเริ่มต้นด้วยการให้การประกาศที่ขัดแย้งกันของความสำคัญที่แตกต่างกันโดยพิจารณาจากตำแหน่งที่ประกาศบนแหล่งที่มา การประกาศที่สำคัญที่สุดคือการประกาศของผู้ใช้ที่มีคีย์เวิร์ดสำคัญ
การประกาศที่สำคัญที่สุดอันดับสองคือการประกาศของผู้แต่งที่มีความสำคัญ ประการที่สามการประกาศผู้เขียนตามปกติจากนั้นการประกาศผู้ใช้ตามปกติและในที่สุดสิ่งที่สำคัญน้อยที่สุดคือการประกาศเบราว์เซอร์เริ่มต้นซึ่งจริง ๆ แล้วมันสมเหตุสมผลมากที่เราสามารถเขียนทับคำประกาศเหล่านี้ที่มาจากเบราว์เซอร์ได้
หลายครั้งเราจะมีกฎที่ขัดแย้งกันมากมายในสไตล์ชีตผู้เขียนของเราโดยไม่มีคำหลักที่สำคัญ นั่นเป็นสถานการณ์ที่พบบ่อยที่สุดและในกรณีนี้การประกาศทั้งหมดมีความสำคัญเหมือนกัน ทีนี้จะเกิดอะไรขึ้นในกรณีนี้? สิ่งที่น้ำตกทำถ้าเป็นกรณีนี้คือการคำนวณและเปรียบเทียบความจำเพาะของตัวเลือกการประกาศและนี่คือวิธีการทำงาน
รูปแบบอินไลน์มีความเฉพาะเจาะจงสูงสุดตามด้วย ID จากนั้นคลาสหลอกคลาสและตัวเลือกแอตทริบิวต์และสุดท้ายคือองค์ประกอบที่เจาะจงน้อยที่สุดและตัวเลือกองค์ประกอบหลอก ดังนั้นเมื่อเรามีการประกาศที่ขัดแย้งกันซึ่งมีความสำคัญเช่นเดียวกับที่เราเห็นในสไลด์สุดท้ายเราจะคำนวณความจำเพาะของตัวเลือกตามลำดับความสำคัญที่ฉันเพิ่งแสดงให้คุณเห็น แต่มาดูกันว่าเราคำนวณความเฉพาะเจาะจงอย่างไรด้วยตัวอย่างเล็ก ๆ นั่นคือสิ่งที่ดีที่สุดเสมอใช่
จากตัวอย่างข้างต้นการประกาศทั้งหมดนี้มีความสำคัญเหมือนกันเนื่องจากเป็นการประกาศของผู้แต่งทั้งหมด ลองคำนวณความเฉพาะเจาะจงของตัวเลือกเพื่อดูว่าสีพื้นหลังจะเป็นสีฟ้าสีเขียวสีม่วงหรือสีเหลืองและนี่คือวิธีที่เราทำ ความเฉพาะเจาะจงไม่ได้เป็นเพียงตัวเลขเดียว แต่เป็นตัวเลขหนึ่งสำหรับแต่ละประเภทจากสี่ประเภทที่ฉันแสดงให้คุณเห็นก่อน รูปแบบอินไลน์ ID คลาสองค์ประกอบหลอกและแอตทริบิวต์และสุดท้ายองค์ประกอบและสำหรับแต่ละสิ่งเหล่านี้เรานับจำนวนครั้งที่เกิดขึ้นในตัวเลือก
ดังนั้นที่นี่ในตัวเลือกหนึ่งเราไม่มีสไตล์อินไลน์แน่นอนเพราะต้องเขียนสไตล์อินไลน์ใน HTML ซึ่งไม่ใช่กรณีนี้ดังนั้นจึงเป็นศูนย์ เรายังไม่มีรหัสที่นี่ดังนั้นจึงเป็นศูนย์อีกครั้ง แต่เรามีคลาสเดียวคือคลาสปุ่ม ดังนั้นสำหรับหมวดหมู่คลาสเรามีหนึ่งและในที่สุดก็ไม่มีตัวเลือกองค์ประกอบที่นี่จึงเป็นศูนย์สำหรับหมวดนั้นเช่นกัน ความจำเพาะของตัวเลือกคือศูนย์ศูนย์หนึ่งศูนย์
ตอนนี้เรามาเปรียบเทียบกับคนอื่น ๆ รูปแบบถัดไปไม่ใช่สไตล์อินไลน์ดังนั้นจึงเป็นศูนย์สำหรับรูปแบบแรก ตอนนี้เรามีตัวเลือก ID สำหรับ nav ID แล้วใช่เลยซึ่งเป็นตัวเลือกสำหรับ ID นอกจากนี้เรายังมีสองคลาสที่ดึงไปทางขวาและปุ่มดังนั้นมันจึงเป็นสองคลาสสำหรับหมวดหมู่คลาสและในที่สุดก็มีตัวเลือกองค์ประกอบสองตัวที่นี่ องค์ประกอบ nav และองค์ประกอบ div ซึ่งหมายความว่าเป็นสององค์ประกอบสำหรับหมวดหมู่องค์ประกอบ ในที่สุดความจำเพาะของตัวเลือกก็คือศูนย์หนึ่งสองสองซึ่งจริงๆแล้วเป็นตัวเลือกที่เฉพาะเจาะจงมาก
ตัวเลือกหมายเลขสามนั้นง่ายมาก มันเป็นเพียงตัวเลือกองค์ประกอบดังนั้นความจำเพาะจึงเป็นศูนย์ศูนย์ศูนย์หนึ่ง
ตอนนี้คนสุดท้ายเลือกหมายเลขสี่ ก่อนอื่นเรามี nav ID ดังนั้นจึงเป็นรหัสสำหรับ ID ต่อไปเรามีคลาสคลาสปุ่มและคลาสหลอกซึ่งโฮเวอร์ซึ่งทำให้เป็นสองคลาสสำหรับคลาสทั้งหมด เนื่องจากยังมีตัวเลือกองค์ประกอบหนึ่งความจำเพาะสุดท้ายคือศูนย์หนึ่งสองหนึ่ง
ทีนี้มารู้กันว่าเราจะใช้ตัวเลขเหล่านี้อย่างไรเพื่อค้นหาว่าตัวเลือกใดใช้ เราเริ่มดูตัวเลขจากซ้ายไปขวาโดยเริ่มจากหมวดหมู่ที่เฉพาะเจาะจงที่สุดคือสไตล์อินไลน์ หากมีตัวเลือกหนึ่งสำหรับสไตล์อินไลน์จะชนะตัวเลือกอื่น ๆ ทั้งหมดเนื่องจากเป็นหมวดหมู่ที่เฉพาะเจาะจงที่สุด นี่ไม่ใช่กรณีนี้ดังนั้นเรามาดู ID กันดีกว่า เราเห็นว่าตัวเลือกสองและสี่มีหนึ่งที่นี่ในขณะที่ตัวเลือกอื่นมีศูนย์ดังนั้นตัวเลือกที่มีศูนย์จึงไม่อยู่ในเกมเนื่องจากมีความเฉพาะเจาะจงน้อยกว่าจากนั้นเลือกสองและสี่ตัวที่มี ID
ตอนนี้เนื่องจากตัวเลือกทั้งสองมีหนึ่งในหมวดหมู่ ID เราจึงต้องดำเนินการต่อและตรวจสอบคลาส พวกเขาทั้งสองมีสองในหมวดหมู่นี้ยังคงเสมอกันและสุดท้ายในหมวดองค์ประกอบตัวเลือกสองมีสองในขณะที่ตัวเลือกสี่มีเพียงหนึ่งเดียวและเราจึงมีผู้ชนะที่นี่ ตัวเลือกหมายเลขสองเป็นตัวเลือกที่เฉพาะเจาะจงที่สุดของทั้งหมดและจะทำให้ปุ่มของเรามีพื้นหลังสีเขียว 34 ค่าของการประกาศที่ชนะเรียกว่าค่าเรียงซ้อนเนื่องจากเป็นผลลัพธ์ของการเรียงซ้อน
ดังนั้นเราจึงเริ่มต้นด้วยค่าที่ประกาศไว้มากมายในกรณีนี้คือสีน้ำเงินสีเขียวสีม่วงและสีเหลืองหนึ่งในนั้นชนะและกลายเป็นค่าเรียงซ้อนซึ่งอยู่ในตัวอย่างของเราสีเขียว
ตอนนี้ลองนึกภาพภาคสี่มีสององค์ประกอบจากนั้นตัวเลือกทั้งสองและสี่จะมีความจำเพาะเหมือนกันใช่ไหม จะเกิดอะไรขึ้นในกรณีนี้และฉันสัญญาว่าตอนนี้เกือบจะจบแล้ว ถ้า ณ จุดนี้ยังคงมีความสัมพันธ์กันการประกาศ CSS สุดท้ายที่เขียนในโค้ดคือสิ่งที่จะนำไปใช้ ดังนั้นอีกครั้งหากทุกอย่างเท่ากันหากตัวเลือกการประกาศทั้งหมดมีความจำเพาะเหมือนกันนั่นเป็นเพียงการประกาศสุดท้ายที่จะใช้เพื่อจัดรูปแบบองค์ประกอบที่เลือก
เป็นกระบวนการที่ใช้เพื่อแก้ไขข้อขัดแย้งในข้อกำหนดสไตล์ชีต
นั่นคือขั้นตอนการแก้ไขความขัดแย้งโดยพื้นฐานที่ทำตามลำดับความสำคัญที่กล่าวถึงใน CSS
CSS ย่อมาจาก Cascading Style Sheet ตามลักษณะที่เป็นธรรมชาติของพวกเขายิ่งไปกว่านั้นสไตล์ชีตแบบเรียงซ้อนจะแทนที่สไตล์ที่เทียบเท่ากันให้สูงขึ้น (เว้นแต่สไตล์ที่สูงขึ้นจะเฉพาะเจาะจงมากขึ้น) ดังนั้นเราจึงสามารถกำหนดรูปแบบพื้นฐานที่จุดเริ่มต้นของสไตล์ชีตซึ่งใช้ได้กับทุกเวอร์ชันของการออกแบบของเราจากนั้นจึงแทนที่ส่วนที่เกี่ยวข้องด้วยแบบสอบถามสื่อเพิ่มเติมในเอกสาร
Cascading หมายถึงการเทลงในขั้นตอนหรือเพิ่มในขั้นตอน สไตล์ชีตมีรหัสสำหรับจัดแต่งทรงผมองค์ประกอบ html และลักษณะการเขียนโค้ดในสไตล์ชีตเป็นแบบเรียงซ้อน หรือเพียงแค่กลับไปที่โค้ดย้อนกลับในเลเยอร์สำหรับแต่ละองค์ประกอบ html ของเพจ html ในสไตล์ชีตทำให้สไตล์ชีตเรียงซ้อน
Cascading เป็นอัลกอริทึมที่กำหนดน้ำหนักให้กับกฎสไตล์แต่ละแบบ เมื่อใช้กฎหลายข้อกฎที่มีน้ำหนักมากที่สุดจะมีความสำคัญ
เมื่อนำสไตล์อย่างน้อยหนึ่งสไตล์ไปใช้กับองค์ประกอบเดียวกัน CSS ดำเนินการชุดของกฎที่เรียกว่าการเรียงซ้อนซึ่งจะประเมินความแข็งแกร่งของความจำเพาะของรูปแบบที่ใช้ทั้งสองรูปแบบและกำหนดผู้ชนะ ได้แก่ กฎสไตล์ที่มีน้ำหนักมากกว่าจะชนะหากทั้งสองกฎมี น้ำหนักเท่ากันจากนั้นกฎใช้การชนะครั้งล่าสุด
Cascade และความจำเพาะสิ่งที่คุณต้องรู้:
ประกาศ CSS ที่มีเครื่องหมาย! important มีลำดับความสำคัญสูงสุด
แต่ใช้เท่านั้น! important เป็นทรัพยากรสุดท้าย การใช้ข้อมูลจำเพาะที่ถูกต้องจะดีกว่า - โค้ดที่บำรุงรักษาได้มากกว่า
สไตล์อินไลน์จะมีลำดับความสำคัญเหนือสไตล์ในสไตล์ชีตภายนอกเสมอ
ตัวเลือกที่มี 1 ID มีความเฉพาะเจาะจงมากกว่าตัวเลือกที่มี 1,000 คลาส
ตัวเลือกที่มี 1 คลาสมีความเฉพาะเจาะจงมากกว่าที่มี 1,000 องค์ประกอบ
ตัวเลือกสากล * ไม่มีค่าความจำเพาะ (0,0,0)
พึ่งพาความเฉพาะเจาะจงมากกว่าลำดับตัวเลือก
แต่ต้องพึ่งพาลำดับเมื่อใช้สไตล์ชีทของบุคคลที่สามให้ใส่สไตล์ชีตผู้แต่งของคุณเป็นอันดับสุดท้ายเสมอ
ในการเลือกรูปแบบ CSS ที่จะใช้กับองค์ประกอบ HTML ความเฉพาะเจาะจงจะลบล้างความทั่วไปตามชุดกฎที่เรียงซ้อนกันซึ่งจะจัดการความขัดแย้งระหว่างสไตล์:
ตัวเลือก CSS ที่จับคู่แท็กคลาสและ / หรือรหัสที่เฉพาะเจาะจงมากขึ้นจะมีลำดับความสำคัญ จากตัวอย่างต่อไปนี้ตัวแรกจะมีความสำคัญเหนือกว่าวินาทีโดยไม่คำนึงถึงลำดับการปรากฏใน CSS:
ol#identity li.firstname { color: red; }
#identity .firstname { color: blue; }
CSS doc
p{font-size: 12pt;}
p{font-size: 14pt;}
<p>My Headline<p>
จะแสดงผลแบบอักษร p ที่ 14pt เนื่องจาก "ใกล้" กับองค์ประกอบจริงมากขึ้น (สไตล์ชีตภายนอกโหลดจากด้านบนของไฟล์ไปยังด้านล่างของไฟล์) หากคุณใช้สไตล์ชีตที่เชื่อมโยงแล้วรวม CSS บางส่วนไว้ในส่วนหัวของเอกสารของคุณหลังจากเชื่อมโยงกับเอกสาร CSS ภายนอกแล้วการประกาศ "in head" จะชนะเพราะยิ่งใกล้เคียงกับองค์ประกอบที่กำหนด นี่เป็นความจริงสำหรับตัวเลือกที่มีน้ำหนักเท่ากันเท่านั้น ดูhttp://www.stuffandnonsense.co.uk/archives/css_specificity_wars.htmlสำหรับคำอธิบายที่ดีเกี่ยวกับน้ำหนักของตัวเลือกที่กำหนด
ทั้งหมดที่กล่าวมาคุณสามารถพิจารณา 'มรดก' เป็นส่วนหนึ่งของน้ำตกได้เช่นกัน - เพื่อวัตถุประสงค์ในทางปฏิบัติทั้งหมด สิ่งที่ "เรียงซ้อน" ลงจากองค์ประกอบที่มี