ใช้แท็ก <style> ใน <body> กับ HTML อื่น ๆ


196
<html>
  <body>
    <style type="text/css">
      p.first {color:blue}
      p.second {color:green}
    </style>

    <p class="first">Hello World</p>
    <p class="second">Hello World</p>

    <style type="text/css">
      p.first {color:green}
      p.second {color:blue}
    </style>

    <p class="first">Hello World</p>
    <p class="second">Hello World</p>
  </body>
</html>

เบราว์เซอร์ควรแสดง css ที่ไม่ต่อเนื่องอย่างไร มันควรจะสร้างโครงสร้างข้อมูลบางอย่างโดยใช้สไตล์ CSS ทั้งหมดในหน้าและใช้สำหรับการแสดงผล?

หรือแสดงโดยใช้ข้อมูลสไตล์ตามลำดับที่เห็น


2
ฉันจะบอกว่ามันเป็นพฤติกรรมที่ไม่ได้กำหนดเพราะมันไม่ถูกต้อง HTML สำหรับข้อมูลเพิ่มเติมว่าองค์ประกอบใดถูกต้องและไม่ใช้: en.wikipedia.org/wiki/HTML_element
Felix Kling

2
ใส่กันปัญหานี้ก็คือการปฏิบัติที่ดีที่จะผสมขึ้นและCSS HTML
0x2D9A3

1
@ 0x2D9A3 ไม่จำเป็นต้องเป็นเรื่องจริง ใช้เวลานานกว่าในการขอหน้า CSS ภายนอกกว่า CSS ที่กำหนดไว้ใน<head>แท็ก
Kolob Canyon

@KolobCanyon เห็นด้วย แต่ตามกฎทั่วไป CSS ควรอยู่ในไฟล์แยกต่างหาก หากคุณมี CSS จำนวนมากทั้งการจัดการ (การบำรุงรักษา (การโพสต์) การย่อขนาดการรวม) และทำหน้าที่เป็นไฟล์แยกต่างหากและเป็นไฟล์แยกต่างหากและเนื้อหา (HTML) ของคุณอาจโหลดเร็วขึ้นเช่นกันนำไปสู่ ​​UX ที่ดีขึ้น อย่างไรก็ตามเช่นเคยกับการพัฒนาทุกอย่างเฉพาะบริบทดังนั้น YMMW :)
0x2D9A3

3
@KolobCanyon นี่ไม่ใช่ปัญหาว่า CSS ควรอยู่ในไฟล์แยกกันหรือไม่ ในกรณีนี้เป็นคำถามที่เกี่ยวกับ CSS ในมากกว่าใน<body> <head>
เรย์บัตเตอร์เวิร์ ธ

คำตอบ:


312

ตามที่คนอื่นได้กล่าวถึงแล้ว HTML 4 กำหนดให้<style>แท็กอยู่ใน<head>ส่วน (แม้ว่าเบราว์เซอร์ส่วนใหญ่อนุญาตให้ใช้<style>แท็กในbody)

อย่างไรก็ตาม HTML 5 มีscopedแอตทริบิวต์ (ดูอัปเดตด้านล่าง) ซึ่งช่วยให้คุณสร้างสไตล์ชีทที่กำหนดขอบเขตภายในองค์ประกอบหลักของ<style>แท็ก นอกจากนี้ยังช่วยให้คุณวาง<style>แท็กภายใน<body>องค์ประกอบ:

<!DOCTYPE html>
<html>
<head></head>
<body>

<div id="scoped-content">
    <style type="text/css" scoped>
        h1 { color: red; } 
    </style>

    <h1>Hello</h1>
</div>

    <h1>
      World
    </h1>

</body>
</html>

หากคุณแสดงรหัสข้างต้นในเบราว์เซอร์ที่เปิดใช้งาน HTML-5 ที่รองรับscopedคุณจะเห็นขอบเขตที่ จำกัด ของสไตล์ชีท

มีข้อแม้สำคัญเพียงข้อเดียว ...

ในขณะที่ฉันเขียนคำตอบนี้ (พฤษภาคม 2013) แทบไม่มีเบราว์เซอร์กระแสหลักที่สนับสนุนscopedคุณลักษณะนี้ (แม้ว่านักพัฒนาซอฟต์แวร์สร้าง Chromiumจะสนับสนุนก็ตาม)

อย่างไรก็ตามมีความหมายที่น่าสนใจของscopedคุณลักษณะที่เกี่ยวข้องกับคำถามนี้ หมายความว่าเบราว์เซอร์ในอนาคตได้รับคำสั่งผ่านมาตรฐานเพื่อให้<style>องค์ประกอบภายใน<body>(ตราบใดที่<style>องค์ประกอบมีการกำหนดขอบเขต)

ดังนั้นให้ที่:

  • ปัจจุบันเกือบทุกเบราว์เซอร์ที่มีอยู่จะไม่สนใจscopedคุณลักษณะนี้
  • เกือบทุกเบราว์เซอร์ที่มีอยู่ในปัจจุบันอนุญาต<style>แท็กภายใน<body>
  • การใช้งานในอนาคตจะต้องใช้เพื่ออนุญาต (กำหนดขอบเขต) <style>แท็กภายใน<body>

... จากนั้นไม่มีอันตรายใด ๆ * ในการวาง<style>แท็กไว้ในร่างกายตราบใดที่คุณพิสูจน์ได้ในอนาคตด้วยscopedคุณสมบัติ ปัญหาเดียวคือเบราว์เซอร์ปัจจุบันจะไม่จำกัด ขอบเขตของสไตล์ชีทจริง ๆ- พวกเขาจะใช้กับเอกสารทั้งหมด แต่ประเด็นก็คือเพื่อจุดประสงค์ในทางปฏิบัติคุณสามารถรวม<style>แท็กไว้ใน<body>เงื่อนไขที่คุณ:

  • พิสูจน์ HTML ของคุณในอนาคตโดยรวมถึงscopedแอตทริบิวต์
  • เข้าใจว่า ณ ตอนนี้สไตล์ชีทภายใน<body>จะไม่ถูกกำหนดขอบเขตอย่างแท้จริง (เนื่องจากยังไม่มีการสนับสนุนเบราว์เซอร์หลักอยู่)


* ยกเว้นหลักสูตรสำหรับใช้ตรวจสอบความถูกต้อง HTML ...


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


อัปเดตเป็นของกุมภาพันธ์ 2019 ตามเอกสาร Mozillaที่scopedแอตทริบิวต์จะเลิก Chrome หยุดการสนับสนุนในรุ่น 36 (2014) และ Firefox ในรุ่น 62 (2018) ในทั้งสองกรณีผู้ใช้ต้องเปิดใช้งานคุณสมบัตินี้อย่างชัดเจนในการตั้งค่าของเบราว์เซอร์ ไม่มีเบราว์เซอร์หลักอื่น ๆ ที่เคยรองรับ


3
@RobertMcKee: จริง ๆ แล้วคุณทดสอบว่า? ฉันคาดหวังว่าโดยปกติแล้วหน้า html ทั้งหมด (รวมถึงรูปแบบอินไลน์ทั้งหมด) จะถูกแยกวิเคราะห์ก่อนการแสดงผลเนื่องจากโดยปกติจะไม่ใหญ่และเบราว์เซอร์จะรอ (สั้นมาก) ในขณะที่ก่อนที่จะแสดงผลอย่างแม่นยำเพื่อหลีกเลี่ยงเนื้อหา เนื่องจาก CSS headเชื่อมโยงใน หากนี่เป็นเพียง CSS ของคุณและหากหน้าเว็บมีขนาดใหญ่และหากการเชื่อมต่อเครือข่ายไม่เร็วมากคุณอาจเห็นเนื้อหาที่ไม่มีการจัดเรียง แต่อาจทำให้ฉันประหลาดใจในสถานการณ์ที่ปฏิบัติได้จริง
Eamon Nerbonne

4
ณ วันนี้เฉพาะ Firefox เท่านั้นที่รองรับองค์ประกอบสไตล์ที่กำหนดขอบเขต (ตามcaniuse.com/#feat=style-scoped ) และเนื่องจากเบราว์เซอร์ทั่วไปเพียงแค่สนับสนุนองค์ประกอบสไตล์ภายใน BODY ฉันจะใช้มันถ้าจำเป็น หากควรนำ CSS ไปใช้ในขอบเขตคุณสามารถนำหน้าตัวเลือกทุกตัวในแหล่ง CSS ที่มี ID / คลาสของ wrapper ฉันทำสิ่งนี้จริง ๆ ในเว็บแอปที่โหลด HTML รายงานฝั่งเซิร์ฟเวอร์และแสดงผลผ่าน AJAX CSS สามารถนำหน้าด้วย regex ง่าย ๆ ใน JavaScript: cssString.replace (/ (^ | \}) ([^ {] +) (\ {) / g, '$ 1' + คำนำหน้า + '$ 2 $ 3')
อดัม Hošek

5
สนับสนุน@scopedหรือscopedดูเหมือนว่ากำลังจะตาย: ที่นี่และที่นี่
Kiran Subbaraman

51
สนับสนุน @KiranSubbaraman: ผมเพิ่ง (กรกฎาคม 2016) อ่านต่อ Mozilla dev: "การแอตทริบิวต์ขอบเขตถูกลบออกจากข้อกำหนดหลังจากที่ จำกัด อยู่เพียงการทดลองและการยอมรับโดย Chrome และ Firefox. คุณควรหลีกเลี่ยงการใช้มันเป็นมันเกือบจะแน่นอนจะเป็น ถูกลบออกจากเบราว์เซอร์เหล่านี้ในไม่ช้า " >> developer.mozilla.org/en-US/docs/Web/HTML/Element/…
jave.web

9
scopedแอตทริบิวต์ถูกลบออกจากข้อกำหนด HTML5 ปัจจุบัน
Albert Wiersch

61

ข่าว Badสำหรับ "สไตล์ในร่างกาย" ที่ชื่นชอบ: W3C เพิ่งหายสงคราม HTMLกับ WHATWG ซึ่ง versionless HTML "Living มาตรฐาน" ตอนนี้ได้กลายเป็นหนึ่งอย่างเป็นทางการซึ่งอนิจจาไม่ได้อนุญาตให้มี ในSTYLE BODYวันแห่งความสุขมีอายุสั้น ;) เครื่องมือตรวจสอบ W3Cยังทำงานได้ตามข้อกำหนด WHATWG ในขณะนี้ (ขอบคุณ @FrankConijn สำหรับ heads-up!)

(หมายเหตุ: นี่เป็นกรณี "ณ วันนี้" แต่เนื่องจากไม่มีเวอร์ชันการเชื่อมโยงอาจกลายเป็นโมฆะเมื่อใดก็ได้โดยไม่ต้องแจ้งให้ทราบล่วงหน้าหรือควบคุมยกเว้นว่าคุณเต็มใจที่จะเชื่อมโยงไปยังแหล่งที่มาแต่ละแห่งที่ GitHub ทำการอ้างอิงที่เสถียรกับมาตรฐาน HTMLอย่างเป็นทางการอีกต่อไปแล้วAFAIK โปรดแก้ไขให้ฉันด้วยหากมีวิธีการที่ถูกต้องในการทำสิ่งนี้อย่างถูกต้อง)

ข่าวดี:

Yay STYLEในที่สุดก็ใช้BODYงานได้ตั้งแต่ HTML5.2! (และscopedหายไปด้วย)

จากสเปค W3C ( เพลิดเพลินไปกับบรรทัดสุดท้าย! ):

4.2.6 องค์ประกอบสไตล์

...

บริบทที่องค์ประกอบนี้สามารถใช้ได้:

คาดว่าจะมีเนื้อหาข้อมูลเมตา

ในองค์ประกอบ noscript ที่เป็นลูกขององค์ประกอบหัว

ในร่างกายคาดว่าจะมีปริมาณการไหล


META SIDE-NOTE:

ความจริงที่ว่าแม้จะมีความเสียหายของ "สงครามเบราว์เซอร์" เรายังคงต้องพัฒนาต่อไปเพื่อแข่งขันกับ "มาตรฐาน" HTML "อย่างเป็นทางการ" (ราคาสำหรับ1 standard + 1 standard < 1 standard) อย่างน่าขันซึ่งหมายความว่าวิธี "การย้อนกลับสู่สามัญสำนึกในสนามเพลาะ" การพัฒนาเว็บไซต์ไม่เคยหยุดใช้

สิ่งนี้อาจเปลี่ยนแปลงได้ในตอนนี้ แต่อ้างถึงภูมิปัญญาดั้งเดิม: ผู้เขียน / ผู้พัฒนาเว็บและในที่สุดเบราว์เซอร์ก็ควรตัดสินใจในสิ่งที่ควร (และไม่ควร) เป็นข้อมูลจำเพาะในที่สุดเมื่อไม่มีเหตุผลที่ดีสำหรับสิ่งที่ทำไปแล้ว ความจริง และเบราว์เซอร์ส่วนใหญ่ได้รับการสนับสนุนยาวSTYLEในBODY(ในหรืออีกวิธีหนึ่งดูเช่นscoped. attr) แม้จะมีประสิทธิภาพการทำงานโดยธรรมชาติของมัน (และอื่น ๆ อาจจะ) การลงโทษ (ซึ่งเราควรตัดสินใจที่จะจ่ายหรือไม่ไม่ได้รายละเอียด.) ดังนั้นสำหรับหนึ่งฉันจะเดิมพันกับพวกเขาและจะไม่ให้ความหวัง ;) ถ้า WHATWG มีความเคารพต่อความเป็นจริง / ผู้แต่งเท่ากันกับที่อ้างพวกเขาอาจจะลงเอยทำสิ่งที่ W3C ทำ


3
ฉันอ่านสเป็ค แต่ไม่เข้าใจ คุณสามารถให้โค้ดตัวอย่างของstyleบล็อกในการbodyตรวจสอบที่ได้หรือไม่
Frank Conijn

3
@ FrankConijn: จุดดีทุกอย่างเปลี่ยนไปอัปเดตคำตอบ! มันสับสนจริงๆ ทั้งSTYLEข้อมูลจำเพาะ 5.2 และ 5.3 W3C ถือว่าเป็นข้อมูลเมตาและเนื้อหาการไหล แต่ข้อมูลจำเพาะ WHATWG "การใช้ชีวิต" ล่าสุดบอกเล่าเรื่องราว "เมทาดาทาที่น่าเบื่อ" เก่าแก่เท่านั้น (อนุญาตเฉพาะใน HEAD) และเพื่อเพิ่มการดูถูกการบาดเจ็บตัวตรวจสอบความถูกต้อง W3C ดูเหมือนจะเป็นไปตามรสชาติ WHATWG ฉันยังไม่ได้ตัดสินใจว่าจะหัวเราะหรือร้องไห้ แต่ก็ตัดสินใจด้วยตัวเองว่า "ผิด" กับกรณี "เบราว์เซอร์ + W3C - ตัวตรวจสอบความถูกต้อง" และอนุญาตให้ใช้รูปแบบใน BODY (BTW อย่าลืม: เราควรเป็นแหล่งที่ดีที่สุดของมาตรฐานจริง ๆ )
Sz

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

32

เมื่อฉันเห็นว่าระบบจัดการเนื้อหาขนาดใหญ่วางองค์ประกอบ <style> บางอย่าง (บางส่วนไม่ทั้งหมด) ใกล้เคียงกับเนื้อหาที่ต้องอาศัยชั้นเรียนเหล่านั้นฉันสรุปว่าม้าออกจากยุ้งฉาง

ไปดูที่หน้าแหล่งข้อมูลจาก cnn.com, nytimes.com, huffingtonpost.com, หนังสือพิมพ์เมืองใหญ่ที่ใกล้ที่สุดและอื่น ๆ ทั้งหมดนี้ทำ

หากมีเหตุผลที่ดีที่จะใส่ส่วน <style> พิเศษไว้ที่ใดที่หนึ่งในร่างกาย - ตัวอย่างเช่นหากคุณรวม () ในองค์ประกอบของหน้าเว็บที่มีความหลากหลายและเป็นอิสระในแบบเรียลไทม์ องค์กรจะสะอาดกว่าเป็นแบบแยกส่วนเข้าใจได้ง่ายขึ้นและบำรุงรักษาได้มากกว่า - ฉันว่าแค่กัดกระสุน แน่นอนว่ามันจะดีกว่าถ้าเรามีสไตล์ "ท้องถิ่น" ที่มีขอบเขต จำกัด เช่นตัวแปรท้องถิ่น แต่คุณไปทำงานกับ HTML ที่คุณมีไม่ใช่ HTML ที่คุณอาจต้องการหรือต้องการในภายหลัง

แน่นอนว่ามีข้อเสียที่อาจเกิดขึ้นและเหตุผลที่ดี (ถ้าไม่บังคับเสมอ) เหตุผลในการติดตามออร์โธดอกซ์เนื่องจากคนอื่น ๆ มีเนื้อหาแล้ว แต่สำหรับฉันแล้วดูเหมือนว่าการใช้ <style> อย่างรอบคอบใน <body> ที่รอบคอบได้เปลี่ยนไปแล้ว


1
ปฏิบัตินิยม FTW!
Waruyama

1
ใช่คุณพูดถูก. เช่นฉันใช้แท็ก <style> ใน <body> ภายในปลั๊กอินของฉัน ทำไมเพราะเป็นวิธีที่ง่ายที่สุดในเนื้อหาปลั๊กอินที่มีสไตล์ แต่ช่วงเวลาหนึ่งคลาส CSS ทั้งหมดไม่ซ้ำกันสำหรับข้อมูลปลั๊กอินของฉัน
Avirtum

7

ไม่ใช่ HTML ที่ถูกต้องอย่างไรก็ตามเบราว์เซอร์ทุกตัวดูเหมือนว่าจะพิจารณาเพียงอินสแตนซ์ที่สอง

ทดสอบภายใต้ FF และ Google Chrome เวอร์ชันล่าสุดภายใต้ Fedora และ FF, Opera, IE และ Chrome ภายใต้ XP


6

ฉันเดาว่าสิ่งนี้จะแตกต่างจากเบราว์เซอร์เบราว์เซอร์: กฎการแสดงผลทั่วโลกอาจได้รับการอัปเดตเมื่อเบราว์เซอร์ดำเนินการผ่านโค้ด

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

มันไม่ถูกต้อง HTML ดังนั้นฉันจะบอกว่ามันเป็นสิ่งที่ไร้ประโยชน์ที่จะคิดเกี่ยวกับ <style>แท็กอยู่ในheadส่วนของหน้า


5

ดังที่คนอื่น ๆ พูดกันว่านี่ไม่ใช่ html ที่ถูกต้องเนื่องจากแท็กสไตล์อยู่ในส่วนหัว

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


5

<style>แท็กเป็นใน<head>ส่วนที่แยกต่างหากจากเนื้อหาทั้งหมด

ข้อมูลอ้างอิง: ข้อมูลจำเพาะ W3CและW3Schools


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

3
นี่อาจเป็นจริงในปี 2010 แต่มันก็ยังห่างไกลจากคำตอบที่ยอมรับได้ในวันนี้
Isaac Lubow

3

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

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


2

ฉันเดาว่านี่อาจเป็นปัญหาเกี่ยวกับบริบทที่ จำกัด เช่นบรรณาธิการ WYIWYG บนระบบเว็บที่ใช้โดยผู้ใช้ที่ไม่ใช่โปรแกรมเมอร์ซึ่งจำกัดความเป็นไปได้ของการปฏิบัติตามมาตรฐาน บางครั้ง (เช่น TinyMCE) มันเป็น lib ที่วางเนื้อหา / รหัสของคุณไว้ในtextareaแท็กซึ่งถูกแสดงผลโดยตัวแก้ไขเป็นdivแท็กขนาดใหญ่ และบางครั้งก็อาจเป็นบรรณาธิการรุ่นเก่า

ฉันคิดว่า:

  1. เหล่านี้ไม่โปรแกรมเมอร์ผู้ใช้ไม่ได้มีการเปิดช่องทางกับผู้ดูแลระบบ (หรือ webdevs สถาบัน) ที่จะขอรวมทั้งกฎระเบียบบาง CSS stylesheetsที่ระบบ ที่จริงแล้วมันจะเป็นไปไม่ได้สำหรับผู้ดูแลระบบ (หรือ webdevs) โดยพิจารณาจำนวนคำขอในแง่ที่ว่าพวกเขาจะมี
  2. ระบบนี้เป็นระบบดั้งเดิมและยังไม่รองรับ HTML เวอร์ชันใหม่กว่า

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


ตัวเลือกที่หนึ่ง: ถาม sysadm ของคุณ

ขอ ADM ระบบของคุณสำหรับรวมทั้งกฎระเบียบบาง CSS stylesheetsที่เป็นระบบ นี่จะเป็นโซลูชันCSS ภายนอกหรือภายใน อย่างที่บอกไปแล้วว่ามันอาจเป็นไปไม่ได้


ตัวเลือกที่ 2: <link>เปิด<body>

ใช้สไตล์ชีตภายนอกบนbodyแท็กเช่นการใช้linkแท็กภายในพื้นที่ที่คุณมีสิทธิ์เข้าถึง (ซึ่งจะเป็นบนไซต์ภายในbodyแท็กไม่ใช่ในheadแท็ก) บางแหล่งกล่าวว่าสิ่งนี้ใช้ได้ แต่ "ไม่ใช่วิธีปฏิบัติที่ดี" เช่นMDN :

<link>องค์ประกอบสามารถเกิดขึ้นได้ทั้งใน<head>หรือ<body>องค์ประกอบขึ้นอยู่กับว่ามันมีประเภทการเชื่อมโยงที่เป็นร่างกาย ok ตัวอย่างเช่นstylesheetประเภทลิงก์คือ body-ok และ<link rel="stylesheet">อนุญาตในเนื้อหา อย่างไรก็ตามนี่ไม่ใช่วิธีปฏิบัติที่ดีในการติดตาม มันทำให้รู้สึกมากขึ้นในการแยกขององค์ประกอบจากเนื้อหาที่ร่างกายของคุณวางพวกเขาใน<link><head>

บางคน จำกัด ไว้เฉพาะใน<head>ส่วนเช่นw3schools :

หมายเหตุ:องค์ประกอบนี้ไปเฉพาะในส่วนหัว แต่สามารถปรากฏได้หลายครั้ง

การทดสอบ

ฉันทดสอบที่นี่ (สภาพแวดล้อมเดสก์ท็อปบนเบราว์เซอร์) และใช้งานได้สำหรับฉัน สร้างไฟล์foo.html:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <link href="bar.css" type="text/css" rel="stylesheet">
    <h1 class="test1">Hello</h1>
    <h1 class="test2">World</h1>
</body>
</html>

จากนั้นไฟล์ CSS ที่ไดเรกทอรีเดียวกันเรียกว่าbar.css:

.test1 { 
    color: green;
};

นี่จะดูเป็นไปได้ถ้าคุณมีวิธีอัปโหลดไฟล์ CSS บางแห่งในระบบของสถาบัน อาจจะเป็นกรณีนี้


ตัวเลือกที่ 3: <style>เปิด<body>

ใช้สไตล์ชีตอินเทอร์เน็ตบนbodyแท็กเช่นการใช้styleแท็กภายในพื้นที่ที่คุณเข้าถึง (ซึ่งจะเป็นบนไซต์ภายในbodyแท็กและไม่อยู่ในheadแท็ก) นี่คือคำตอบของCharles SalviaและSzที่นี่เกี่ยวกับ เลือกตัวเลือกนี้พิจารณาข้อกังวลของพวกเขา


ตัวเลือกที่ 4, 5 และ 6: วิธีของ JS

การแจ้งเตือนสิ่งเหล่านี้เกี่ยวข้องกับการปรับเปลี่ยน<head>องค์ประกอบของหน้า อาจจะไม่ได้รับอนุญาตจากผู้ดูแลระบบของสถาบัน ดังนั้นจึงขอแนะนำให้ขออนุญาตก่อน

เอาล่ะสมมติว่าได้รับอนุญาต, <head>กลยุทธ์การเข้าถึง อย่างไร? วิธีการจาวาสคริปต์

ตัวเลือกที่ 4: ใหม่<link>ใน<head>

นี่เป็นอีกรุ่นหนึ่งของตัวเลือกที่ 2 ใช้สไตล์ชีตภายนอกบน<head>แท็กเช่นการใช้งาน<link>องค์ประกอบนอกพื้นที่ที่คุณมีการเข้าถึง (ซึ่งจะเป็นบนไซต์ไม่ใช่ภายในbodyแท็กและใช่ภายในheadแท็ก) วิธีการแก้ปัญหานี้เป็นไปตามคำแนะนำของMDNและw3schoolsตามที่กล่าวไว้ข้างต้นในโซลูชันตัวเลือกที่ 2 Linkวัตถุใหม่จะถูกสร้างขึ้น

เพื่อแก้ปัญหาผ่านทาง JS มีหลายวิธี แต่ใน codelines ต่อไปนี้ฉันแสดงให้เห็นถึงวิธีง่าย ๆ

การทดสอบ

ฉันทดสอบที่นี่ (สภาพแวดล้อมเดสก์ท็อปบนเบราว์เซอร์) และใช้งานได้สำหรับฉัน สร้างไฟล์f.html:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <h1 class="test1">Hello</h1>
    <h1 class="test2">World</h1>
    <script>
        // JS code here
    </script>
</body>
</html>

ภายในscriptแท็ก:

var newLink = document.createElement("link");
newLink.href = "bar.css";
newLink.rel = "stylesheet";
newLink.type = "text/css";
document.getElementsByTagName("head")[0].appendChild(newLink);

จากนั้นที่ไฟล์ CSS ที่ไดเรกทอรีเดียวกันชื่อbar.css(ตามตัวเลือกที่ 2):

.test1 { 
    color: green;
};

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

ตัวเลือกที่ 5: ใหม่<style>ใน<head>

ใช้สไตล์ชีตภายในใหม่บน<head>แท็กเช่นการใช้<style>องค์ประกอบใหม่นอกพื้นที่ที่คุณมีการเข้าถึง (ซึ่งจะเป็นบนไซต์ไม่ใช่ภายในbodyแท็กและใช่ภายในheadแท็ก) Styleวัตถุใหม่จะถูกสร้างขึ้น

นี่คือการแก้ไขผ่าน JS วิธีง่าย ๆ อย่างหนึ่งคือการสาธิต

การทดสอบ

ฉันทดสอบที่นี่ (สภาพแวดล้อมเดสก์ท็อปบนเบราว์เซอร์) และใช้งานได้สำหรับฉัน สร้างไฟล์foobar.html:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <h1 class="test1">Hello</h1>
    <h1 class="test2">World</h1>
    <script>
        // JS code here
    </script>
</body>
</html>

ภายในscriptแท็ก:

var newStyle = document.createElement("style");
newStyle.innerHTML = 
    "h1.test1 {"+
        "color: green;"+
    "}";
document.getElementsByTagName("head")[0].appendChild(newStyle);

ตัวเลือกที่ 6: การใช้ที่มีอยู่<style>บน<head>

ใช้สไตล์ชีตภายในที่มีอยู่บน<head>แท็กเช่นการใช้<style>องค์ประกอบนอกพื้นที่ที่คุณมีการเข้าถึง (ซึ่งจะเป็นบนไซต์ไม่ใช่ภายในbodyแท็กและใช่ภายในheadแท็ก) หากมีอยู่ Styleวัตถุใหม่จะถูกสร้างขึ้นหรือCSSStyleSheetวัตถุจะถูกนำมาใช้ (ในรหัสของการแก้ปัญหาที่นำมาใช้ที่นี่)

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

หากว่าได้รับอนุญาตอีกครั้ง:

คุณจะต้องพิจารณาข้อ จำกัด insertRule()บางอย่างของวิธีการที่สามารถใช้ได้กับวิธีนี้: โซลูชันที่เสนอใช้สถานการณ์เริ่มต้นและการดำเนินการในตอนแรกstylesheetถ้ามีอยู่

การทดสอบ

ฉันทดสอบที่นี่ (สภาพแวดล้อมเดสก์ท็อปบนเบราว์เซอร์) และใช้งานได้สำหรับฉัน สร้างไฟล์foo_bar.html:

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <h1 class="test1">Hello</h1>
    <h1 class="test2">World</h1>
    <script>
      // JS code here
    </script>
  </body>
</html>

ภายในscriptแท็ก:

function demoLoop(){ // remove this line
    var elmnt = document.getElementsByTagName("style");
    if (elmnt.length === 0) {
        // there isn't style objects, so it's more interesting create one
        var newStyle = document.createElement("style");
        newStyle.innerHTML =
            "h1.test1 {" +
                "color: green;" +
            "}";
        document.getElementsByTagName("head")[0].appendChild(newStyle);
    } else {
        // Using CSSStyleSheet interface
        var firstCSS = document.styleSheets[0];
        firstCSS.insertRule("h1.test2{color:blue;}"); // at this way (without index specified), will be like an Array unshift() method
    }
} // remove this too
demoLoop(); // remove this too
demoLoop(); // remove this too

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


ตัวเลือกที่ 7: CSS แบบอินไลน์

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

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

การทดสอบ

สร้างไฟล์_foobar.html:

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <h1 style="color: green;">Hello</h1>
    <h1 style="color: blue;">World</h1>    
  </body>
</html>

ตอบคำถามที่ถามโดยกาแกนอย่างเคร่งครัด

เบราว์เซอร์ควรจะแสดง css ที่ไม่ต่อเนื่องกันอย่างไร

  1. มันควรจะสร้างโครงสร้างข้อมูลบางอย่างโดยใช้สไตล์ CSS ทั้งหมดในหน้าและใช้สำหรับการแสดงผล?
  2. หรือแสดงโดยใช้ข้อมูลสไตล์ตามลำดับที่เห็น

(ดัดแปลงคำพูด)

สำหรับคำตอบที่แม่นยำยิ่งขึ้นฉันขอแนะนำ Google บทความเหล่านี้:

  • เบราว์เซอร์ทำงานอย่างไร: เบื้องหลังเบราว์เซอร์สมัยใหม่
  • Render-tree Construction, Layout และ Paint
  • การแสดงผลหน้าเว็บหมายถึงอะไร
  • การแสดงผลของเบราว์เซอร์ทำงานอย่างไร - เบื้องหลัง
  • การแสดงผล - มาตรฐาน HTML
  • 10 การแสดงผล - HTML5

+1 ความคิดที่ดีรวมถึงแท็กสคริปต์และใช้ javascript เพื่อเพิ่ม css, HTML ที่สมบูรณ์แบบตามกฎหมายสำหรับคนโง่บรรณาธิการ WYSIWYG CMS
djolf

1

เนื่องจากนี่คือ HTML ที่ไม่ถูกต้องไม่มีผลกระทบใด ๆ ต่อผลลัพธ์ ... หมายความว่า HTML นั้นเป็นไปตามมาตรฐาน (สำหรับวัตถุประสงค์ขององค์กรเท่านั้น) เพื่อความถูกต้องมันอาจจะถูกเขียนด้วยวิธีนี้:

<html>
<head>
<style type="text/css">
  p.first {color:blue}
  p.second {color:green}
</style>
</head>
<body>
<p class="first" style="color:green;">Hello World</p>
<p class="second" style="color:blue;">Hello World</p>

ฉันเดาว่าเบราว์เซอร์จะใช้รูปแบบสุดท้ายที่เข้ามา


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