Sử dụng thẻ <style> trong <body> với HTML khác


195
<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>

Làm thế nào là một trình duyệt được cho là để hiển thị css không liền kề? Có phải tạo một số cấu trúc dữ liệu bằng cách sử dụng tất cả các kiểu css trên một trang và sử dụng cấu trúc đó để hiển thị không?

Hoặc nó kết xuất bằng cách sử dụng thông tin phong cách theo thứ tự nó nhìn thấy?


2
Tôi muốn nói đó là hành vi không xác định vì nó không phải là HTML hợp lệ. Để biết thêm thông tin, yếu tố nào hợp lệ và yếu tố nào không: en.wikipedia.org/wiki/HTML_element
Felix Kling

2
Đặt vấn đề này sang một bên, đó là một thực tế xấu để trộn lẫn CSSHTML.
0x2D9A3

1
@ 0x2D9A3 Không nhất thiết phải đúng. Sẽ mất nhiều thời gian hơn để yêu cầu một trang CSS bên ngoài so với CSS được xác định trong <head>thẻ
Kolob Canyon

@KolobCanyon Đồng ý, nhưng theo nguyên tắc chung, CSS phải ở trong một tệp riêng. Nếu bạn có hàng tấn CSS, việc quản lý (duy trì, xử lý, hậu xử lý, thu nhỏ) và đóng vai trò là một tệp riêng biệt cũng dễ dàng hơn và dẫn đến nội dung của bạn (HTML) cũng có thể tải nhanh hơn, dẫn đến UX tốt hơn. Tuy nhiên, như mọi khi với sự phát triển, mọi thứ đều cụ thể theo ngữ cảnh, vì vậy YMMW :)
0x2D9A3

3
@KolobCanyon, đây không phải là vấn đề về việc CSS có nên nằm trong một tệp riêng biệt hay không. Trong trường hợp này, câu hỏi là về CSS <body>thay vì trong <head>.
Ray Butterworth

Câu trả lời:


312

Như những người khác đã đề cập, HTML 4 yêu cầu <style>thẻ được đặt trong <head>phần (mặc dù hầu hết các trình duyệt cho phép <style>các thẻ trong body).

Tuy nhiên, HTML 5 bao gồm scopedthuộc tính (xem bản cập nhật bên dưới), cho phép bạn tạo các biểu định kiểu nằm trong phạm vi phần tử cha của <style>thẻ. Điều này cũng cho phép bạn đặt <style>các thẻ trong thành <body>phần:

<!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>

Nếu bạn kết xuất mã ở trên trong trình duyệt hỗ trợ HTML-5 hỗ trợ scoped, bạn sẽ thấy phạm vi giới hạn của biểu định kiểu.

Chỉ có một cảnh báo lớn ...

Tại thời điểm tôi đang viết câu trả lời này (tháng 5 năm 2013), gần như không có trình duyệt chính nào hiện hỗ trợ scopedthuộc tính này. (Mặc dù các nhà phát triển xây dựng Chromium hỗ trợ nó.)

TUY NHIÊN, có một hàm ý thú vị của scopedthuộc tính liên quan đến câu hỏi này. Điều đó có nghĩa là các trình duyệt trong tương lai được ủy quyền thông qua tiêu chuẩn để cho phép <style>các phần tử bên trong <body>(miễn là các <style>phần tử nằm trong phạm vi.)

Vì vậy, cho rằng:

  • Hầu như mọi trình duyệt hiện có hiện đang bỏ qua scopedthuộc tính
  • Hầu như mọi trình duyệt hiện tại hiện cho phép <style>các thẻ trong<body>
  • Việc triển khai trong tương lai sẽ được yêu cầu để cho phép các <style>thẻ (trong phạm vi) trong<body>

... thì thực sự không có hại * trong việc đặt <style>các thẻ trong cơ thể, miễn là bạn chứng minh chúng bằng một scopedthuộc tính trong tương lai . Vấn đề duy nhất là các trình duyệt hiện tại sẽ không thực sự giới hạn phạm vi của biểu định kiểu - chúng sẽ áp dụng nó cho toàn bộ tài liệu. Nhưng vấn đề là, đối với tất cả các mục đích thực tế, bạn có thể bao gồm <style>các thẻ trong phạm vi <body>được cung cấp mà bạn:

  • Chứng minh tương lai HTML của bạn bằng cách bao gồm scopedthuộc tính
  • Hiểu rằng cho đến thời điểm hiện tại, biểu định kiểu bên trong <body>sẽ không thực sự nằm trong phạm vi (vì chưa có hỗ trợ trình duyệt chính nào tồn tại)


* tất nhiên, ngoại trừ việc chọc giận các trình xác nhận HTML ...


Cuối cùng, liên quan đến tuyên bố chung (nhưng chủ quan) rằng việc nhúng CSS trong HTML là thực tiễn kém, cần lưu ý rằng toàn bộ quan điểm của scopedthuộc tính là điều chỉnh các khung phát triển hiện đại điển hình cho phép các nhà phát triển nhập các đoạn HTML dưới dạng mô-đun hoặc nội dung được cung cấp . Rất thuận tiện khi có CSS ​​nhúng chỉ áp dụng cho một đoạn HTML cụ thể, để phát triển các thành phần mô đun được đóng gói với các kiểu dáng cụ thể.


Cập nhật kể từ tháng 2 năm 2019, theo tài liệu của Mozilla , scopedthuộc tính không được dùng nữa. Chrome đã ngừng hỗ trợ nó trong phiên bản 36 (2014) và Firefox ở phiên bản 62 (2018). Trong cả hai trường hợp, tính năng này phải được người dùng kích hoạt rõ ràng trong cài đặt của trình duyệt. Không có trình duyệt lớn nào từng hỗ trợ nó.


3
@RobertMcKee: bạn đã thực sự thử nghiệm điều đó chưa? Tôi hy vọng rằng thường thì toàn bộ trang html (bao gồm tất cả kiểu nội tuyến) được phân tích cú pháp trước khi kết xuất, vì thông thường nó không lớn và các trình duyệt chờ một lúc (rất ngắn) trong khi trước khi kết xuất chính xác để tránh nội dung chớp nhoáng có thể xảy ra do css liên kết trong head. Nếu đây là css duy nhất của bạn và nếu trang lớn và nếu kết nối mạng không nhanh, thì có thể bạn sẽ thấy một nội dung không được chỉnh sửa, nhưng nó sẽ làm tôi ngạc nhiên trong hầu hết các tình huống thực tế.
Eamon Nerbonne

4
Cho đến ngày hôm nay, chỉ có Firefox hỗ trợ thành phần kiểu có phạm vi (theo caniuse.com/#feat=style-scoped ). Và vì các trình duyệt thông thường chỉ hỗ trợ phần tử STYLE bên trong BODY, tôi sẽ chỉ sử dụng nó, nếu cần thiết. Nếu CSS nên được áp dụng trong một phạm vi, bạn chỉ có thể thêm tiền tố vào mỗi bộ chọn trong nguồn CSS với ID / lớp của trình bao bọc. Tôi thực sự đã làm điều này trong một ứng dụng web tải HTML báo cáo phía máy chủ và hiển thị chúng thông qua AJAX. CSS sau đó có thể được thêm tiền tố với regex đơn giản trong JavaScript: cssString.replace (/ (^ | \}) ([^ {] +) (\ {) / g, '$ 1' + tiền tố + '$ 2 $ 3')
Adam Hošek

5
Hỗ trợ @scoped, hoặc scopeddường như sắp chết: ở đâyở đây
Kiran Subbaraman

51
Hỗ trợ @KiranSubbaraman: Tôi vừa mới (tháng 7 năm 2016) đọc trên mozilla dev: " Thuộc tính phạm vi đã bị xóa khỏi đặc tả sau khi chỉ áp dụng thử nghiệm và giới hạn bởi Chrome và Firefox. Bạn nên tránh sử dụng nó , vì gần như chắc chắn sẽ có loại bỏ khỏi các trình duyệt này sớm. " >> developer.mozilla.org/en-US/docs/Web/HTML/Euity/ cường
jave.web 21/07/2016

9
Các scopedthuộc tính đã bị xóa khỏi chi tiết kỹ thuật HTML5 hiện hành.
Albert Wiersch

61

Tin tức Breaking Bad cho "phong cách trong cơ thể" người yêu: W3C gần đây đã bị mất cuộc chiến HTML chống WHATWG, mà versionless HTML "Living Chuẩn" giờ đây đã trở thành một trong những quan chức, trong đó, than ôi, không không cho phép STYLE trong BODY. Những ngày hạnh phúc ngắn ngủi đã qua. ;) Trình xác nhận W3C cũng hoạt động theo thông số WHATWG.(Cảm ơn @FrankConijn vì đã hỗ trợ!)

(Lưu ý: đây là trường hợp "như ngày nay", nhưng vì không có phiên bản, các liên kết có thể trở nên không hợp lệ bất cứ lúc nào mà không cần thông báo hoặc kiểm soát. Trừ khi bạn sẵn sàng liên kết với nguồn riêng lẻ của nó tại GitHub, về cơ bản bạn không thể còn tạo các tham chiếu ổn định cho tiêu chuẩn HTML chính thức mới , AFAIK. Vui lòng sửa lại cho tôi nếu có cách thức chính xác để thực hiện việc này đúng cách.)

TIN TỨC TỐT CỦA OBSOLETED:

Yay, STYLEcuối cùng cũng hợp lệ BODY, kể từ HTML5.2! (Và scopedcũng biến mất.)

Từ thông số kỹ thuật của W3C ( thưởng thức dòng cuối cùng! ):

4.2.6. Yếu tố phong cách

...

Các bối cảnh trong đó phần tử này có thể được sử dụng:

Nơi dự kiến ​​nội dung siêu dữ liệu.

Trong một phần tử noscript là con của phần tử head.

Trong cơ thể, nơi nội dung dòng chảy được dự kiến.


PHỤ KIỆN-LƯU Ý:

Thực tế là mặc dù thiệt hại của "cuộc chiến trình duyệt", chúng tôi vẫn phải tiếp tục phát triển dựa trên hai tiêu chuẩn "HTML" chính thức " cạnh tranh " (trích dẫn 1 standard + 1 standard < 1 standard) có nghĩa là cách tiếp cận "dự phòng theo cách hiểu chung" phát triển web chưa bao giờ thực sự ngừng áp dụng.

Điều này cuối cùng có thể thay đổi ngay bây giờ, nhưng trích dẫn sự khôn ngoan thông thường: các tác giả / nhà phát triển web và do đó, các trình duyệt cuối cùng sẽ quyết định những gì nên (và không nên) trong thông số kỹ thuật, khi không có lý do chính đáng nào chống lại những gì đã được thực hiện trong thực tế. Và hầu hết các trình duyệt từ lâu đã được hỗ trợ STYLEtrong BODY(bằng cách này hay cách khác, xem ví dụ scoped. Attr) (trong đó, mặc dù hiệu suất vốn có của nó (và có thể khác) hình phạt chúng tôi . Nên quyết định được hưởng lương bổng hay không, không phải là thông số kỹ thuật). Vì vậy, đối với một người, tôi sẽ tiếp tục đặt cược vào họ, và sẽ không từ bỏ hy vọng. ;) Nếu WHATWG có cùng sự tôn trọng đối với thực tế / tác giả như họ tuyên bố, họ có thể sẽ chỉ làm ở đây những gì W3C đã làm.


3
Tôi đọc thông số kỹ thuật, nhưng không hiểu. Bạn có thể đưa ra một mã ví dụ của một stylekhối trong bodyđó xác nhận?
Frank Conijn

3
@FrankConijn: Điểm tốt, mọi thứ đã thay đổi, cập nhật câu trả lời! Nó thực sự khó hiểu. Cả hai thông số kỹ thuật 5.2 và 5.3 W3C đều coi STYLElà siêu dữ liệu và nội dung dòng chảy, nhưng thông số "sống" mới nhất của WHATWG kể về câu chuyện "chỉ siêu dữ liệu" cũ, nhàm chán (chỉ cho phép trong ĐẦU). Và, để thêm sự xúc phạm đến thương tích, trình xác nhận W3C dường như tuân theo hương vị WHATWG. Tôi vẫn chưa quyết định nên cười hay khóc, nhưng chắc chắn, cá nhân tôi đã quyết định "lỗi" với trường hợp "trình duyệt + W3C - trình xác nhận" và cho phép PHONG CÁCH trong CƠ THỂ. (BTW, đừng quên: thực sự chúng ta nên là nguồn cuối cùng của tiêu chuẩn .)
Sz.

Tôi thực sự nghĩ rằng họ đã nhảy con cá mập bằng thứ nhảm nhí này, về cơ bản họ không còn lựa chọn nào khác ngoài việc sử dụng theo kiểu đường kẻ nếu bạn muốn thiết lập một thuộc tính hình ảnh nền động trong một hệ thống templated. Nó đã ít xâm lấn hơn khi bỏ một khối kiểu được tạo theo chương trình ngay phía trên đầu ra html của bạn.
GovCoder

32

Khi tôi thấy rằng Hệ thống quản lý nội dung trang web lớn thường xuyên đặt một số yếu tố <style> (một số chứ không phải tất cả) gần với nội dung dựa trên các lớp đó, tôi kết luận rằng con ngựa đã ra khỏi chuồng.

Hãy xem các nguồn trang từ cnn.com, nytimes.com, huffingtonpost.com, tờ báo thành phố lớn gần nhất của bạn, v.v ... Tất cả đều làm điều này.

Nếu có một lý do chính đáng để đặt một phần <style> bổ sung ở đâu đó trong cơ thể - ví dụ: nếu bạn bao gồm () các phần tử trang độc lập và đa dạng trong thời gian thực và mỗi phần có một <style> được nhúng tổ chức sẽ sạch sẽ hơn, mô đun hơn, dễ hiểu hơn và dễ bảo trì hơn - tôi nói chỉ cần cắn viên đạn. Chắc chắn sẽ tốt hơn nếu chúng ta có thể có kiểu "cục bộ" với phạm vi bị hạn chế, như các biến cục bộ, nhưng bạn sẽ làm việc với HTML mà bạn có, không phải là HTML bạn có thể muốn hoặc muốn có sau này.

Tất nhiên có những hạn chế tiềm tàng và lý do tốt (nếu không phải luôn luôn hấp dẫn) để tuân theo chính thống, như những người khác đã xây dựng. Nhưng đối với tôi, nó ngày càng giống như việc sử dụng <style> trong <body> một cách chu đáo đã trở thành xu hướng.


1
Chủ nghĩa thực dụng FTW!
Waruyama

1
Vâng bạn đã đúng. Ví dụ: tôi sử dụng thẻ <style> trong <body> bên trong plugin của mình. Tại sao, bởi vì đó là cách dễ nhất để nội dung plugin phong cách. Nhưng một lúc, tất cả các lớp css là duy nhất cho dữ liệu plugin của tôi.
Avirtum

7

HTML không hợp lệ, dù sao đi nữa, mọi trình duyệt dường như chỉ xem xét trường hợp thứ hai.

Đã thử nghiệm dưới các phiên bản cuối cùng của FF và Google Chrome trong Fedora và FF, Opera, IE và Chrome trong XP.


6

Tôi đoán điều này sẽ thay đổi từ trình duyệt này sang trình duyệt khác: Các quy tắc hiển thị toàn cầu có thể sẽ được cập nhật khi trình duyệt đi qua mã.

Đôi khi bạn có thể thấy những thay đổi như vậy trong quy tắc hiển thị toàn cầu khi bảng kiểu bên ngoài được tải với độ trễ. Một cái gì đó tương tự có thể xảy ra ở đây nhưng liên tiếp ngắn đến mức nó không thực sự được kết xuất.

Dù sao nó cũng không phải là HTML hợp lệ, vì vậy tôi muốn nói rằng đó là một điều vô ích để suy nghĩ. <style>các thẻ thuộc về headphần của trang.


5

Như những người khác đã nói, đây không phải là html hợp lệ vì các thẻ kiểu thuộc về phần đầu.

Tuy nhiên, hầu hết các trình duyệt không thực sự thực thi xác nhận đó. Thay vào đó, một khi tài liệu được tải thì các kiểu được hợp nhất và áp dụng. Trong trường hợp này, tập hợp kiểu thứ hai sẽ luôn ghi đè lên kiểu đầu tiên vì chúng là định nghĩa cuối cùng gặp phải.


5

Các <style>thẻ thuộc trong<head> phần, tách biệt với tất cả các nội dung.

Tài liệu tham khảo: Thông số kỹ thuật W3CW3Schools


52
Không giải quyết câu hỏi. Và những hướng dẫn cứng nhắc bị tràn ngập bởi thực tế. Có NHIỀU trường hợp tác giả không thể định nghĩa / đưa phong cách của họ vào đầu html.
Javier

3
Điều này có thể đúng trong năm 2010, nhưng nó không phải là một câu trả lời chấp nhận được ngày hôm nay.
Isaac Lubow

3

Trong ví dụ của bạn, một trình duyệt không "được cho là" để làm bất cứ điều gì. HTML không hợp lệ. Phục hồi lỗi được kích hoạt hoặc trình phân tích cú pháp tạo ra nó như mong muốn.

Trong một trường hợp hợp lệ, nhiều biểu định kiểu chỉ được coi là xuất hiện lần lượt, tầng được tính như bình thường.


2

Tôi đoán đây có thể là một vấn đề về bối cảnh hạn chế, ví dụ như các trình soạn thảo WYIWYG trên một hệ thống web được sử dụng bởi người dùng không lập trình viên , điều đó hạn chế khả năng tuân theo các tiêu chuẩn. Đôi khi (như TinyMCE), đó là một lib đặt nội dung / mã của bạn vào trong textareathẻ, được trình soạn thảo hiển thị dưới dạng lớndiv thẻ . Và đôi khi, nó có thể là một phiên bản cũ của các biên tập viên.

Tôi cho rằng:

  1. những người dùng không phải lập trình viên này không có kênh mở với quản trị viên hệ thống (hoặc webdevs của tổ chức), để yêu cầu bao gồm một số quy tắc CSS tại hệ thốngstylesheets . Trên thực tế, nó sẽ không thực tế đối với các quản trị viên (hoặc webdevs), xem xét số lượng yêu cầu theo nghĩa mà họ sẽ có.
  2. hệ thống này là di sản và vẫn không hỗ trợ các phiên bản HTML mới hơn.

Trong một số trường hợp, không có stylequy tắc sử dụng , nó có thể là một kinh nghiệm thiết kế rất kém. Vì vậy, vâng, những người dùng này cần tùy biến. Được rồi, nhưng giải pháp sẽ là gì, trong kịch bản này? Xem xét các cách khác nhau để chèn CSS vào một htmltrang, tôi cho rằng các giải pháp sau:


Lựa chọn thứ 1: hỏi hệ thống của bạn

Hỏi người quản trị hệ thống của bạn để bao gồm một số quy tắc CSS tại hệ thống stylesheets. Đây sẽ là một giải pháp CSS bên ngoài hoặc bên trong . Như đã nói, nó có thể là không thể.


Tùy chọn thứ 2: <link>bật<body>

Sử dụng biểu định kiểu bên ngoài trên bodythẻ, nghĩa là sử dụng linkthẻ bên trong khu vực bạn có quyền truy cập (đó sẽ là, trên trang web, bên trong bodythẻ chứ không phải trong headthẻ). Một số nguồn cho biết điều này không sao, nhưng "không phải là một thực hành tốt", như MDN :

Một <link>phần tử có thể xuất hiện trong phần tử <head>hoặc <body>phần tử, tùy thuộc vào việc nó có loại liên kết có thân không . Ví dụ, stylesheetloại liên kết là body-ok, và do đó <link rel="stylesheet">được cho phép trong cơ thể. Tuy nhiên, đây không phải là một thực hành tốt để làm theo; nó có ý nghĩa hơn để tách các <link>yếu tố của bạn khỏi nội dung cơ thể của bạn, đưa chúng vào <head>.

Một số người khác, giới hạn nó trong <head>phần, như w3schools :

Lưu ý: Phần tử này chỉ đi trong phần đầu, nhưng nó có thể xuất hiện bất kỳ số lần.

Kiểm tra

Tôi đã thử nghiệm nó ở đây (môi trường máy tính để bàn, trên trình duyệt) và nó hoạt động với tôi. Tạo một tệp 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>

Và sau đó, một tệp CSS, trong cùng thư mục, được gọi là bar.css:

.test1 { 
    color: green;
};

Chà, điều này sẽ có vẻ khả thi nếu bạn có cách tải lên một tệp CSS ở đâu đó trong hệ thống tổ chức. Có lẽ đây sẽ là trường hợp.


Tùy chọn thứ 3: <style>bật<body>

Sử dụng biểu định kiểu internet trên bodythẻ, nghĩa là sử dụng stylethẻ bên trong khu vực bạn có quyền truy cập (đó sẽ là, trên trang web, bên trong bodythẻ chứ không phải trong headthẻ). Đây là những gì câu trả lời của Charles SalviaSz ở đây. Chọn tùy chọn này, xem xét mối quan tâm của họ.


Tùy chọn thứ 4, 5 và 6: Cách JS

Thông báo Những cái này có liên quan đến việc sửa đổi thành <head>phần của trang. Có lẽ điều này sẽ không được phép bởi các quản trị viên hệ thống của tổ chức. Vì vậy, bạn nên xin phép họ trước.

Được rồi, giả sử được cấp, chiến lược là truy cập vào <head> . Làm sao? Phương pháp JavaScript.

Tùy chọn thứ 4: mới <link>trên<head>

Đây là một phiên bản khác của tùy chọn thứ 2. Sử dụng biểu định kiểu bên ngoài trên <head>thẻ, nghĩa là sử dụng <link>phần tử bên ngoài khu vực bạn có quyền truy cập (đó sẽ là, trên trang web, không phải bên trong bodythẻ và có trong headthẻ). Giải pháp này tuân thủ các khuyến nghị của MDNw3schools , như được trích dẫn ở trên, về giải pháp tùy chọn thứ 2. Một Linkđối tượng mới sẽ được tạo ra.

Để giải quyết vấn đề thông qua JS, có nhiều cách nhưng tại các bộ mã sau đây tôi chứng minh một cách đơn giản.

Kiểm tra

Tôi đã thử nghiệm nó ở đây (môi trường máy tính để bàn, trên trình duyệt) và nó hoạt động với tôi. Tạo một tệp 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>

Bên trong scriptthẻ:

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

Và sau đó tại tệp CSS, trong cùng thư mục, được gọi bar.css(như ở tùy chọn thứ 2):

.test1 { 
    color: green;
};

Như tôi đã nói: điều này sẽ có vẻ khả thi nếu bạn có cách tải lên tệp CSS ở đâu đó trong hệ thống tổ chức.

Tùy chọn thứ 5: mới <style>trên<head>

Sử dụng biểu định kiểu nội bộ mới trên <head>thẻ, nghĩa là sử dụng một <style>yếu tố mới bên ngoài khu vực bạn có quyền truy cập (đó sẽ là, trên trang web, không phải bên trong bodythẻ và có trong headthẻ). Một Styleđối tượng mới sẽ được tạo ra.

Điều này được giải quyết thông qua JS. Một cách đơn giản được thể hiện sau đây.

Kiểm tra

Tôi đã thử nghiệm nó ở đây (môi trường máy tính để bàn, trên trình duyệt) và nó hoạt động với tôi. Tạo một tệp 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>

Bên trong scriptthẻ:

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

Tùy chọn 6: sử dụng một hiện <style>trên<head>

Sử dụng biểu định kiểu nội bộ hiện có trên <head>thẻ, nghĩa là sử dụng một <style>yếu tố bên ngoài khu vực bạn có quyền truy cập (sẽ có trên trang web, không phải bên trong bodythẻ và có trong headthẻ), nếu một số tồn tại. Một Styleđối tượng mới sẽ được tạo hoặc một CSSStyleSheetđối tượng sẽ được sử dụng (trong mã của giải pháp được thông qua ở đây).

Đây là một số quan điểm rủi ro. Đầu tiên , bởi vì nó có thể không tồn tại một số <style> đối tượng. Tùy thuộc vào cách bạn triển khai giải pháp này, bạn có thể được undefinedtrả lại (hệ thống có thể sử dụng biểu định kiểu bên ngoài ). Thứ hai , bởi vì bạn sẽ chỉnh sửa tác phẩm của tác giả thiết kế hệ thống (vấn đề quyền tác giả). Thứ ba , bởi vì nó có thể không được phép tại chính trị an toàn CNTT của tổ chức bạn. Vì vậy, hãy xin phép để làm điều này (như trong các giải pháp JS khác) .

Giả sử, một lần nữa, sự cho phép đã được cấp:

Bạn sẽ cần xem xét một số hạn chế của phương pháp có sẵn theo cách này : insertRule(). Giải pháp được đề xuất sử dụng kịch bản mặc định và thao tác đầu tiên stylesheet, nếu một số tồn tại.

Kiểm tra

Tôi đã thử nghiệm nó ở đây (môi trường máy tính để bàn, trên trình duyệt) và nó hoạt động với tôi. Tạo một tệp 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>

Bên trong scriptthẻ:

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

Một cách tiếp cận khác cho giải pháp này là sử dụng CSSStyleDeclarationđối tượng (tài liệu tại w3schoolsMDN ). Nhưng nó có thể không thú vị, xem xét rủi ro để ghi đè các quy tắc hiện có trên CSS của hệ thống.


Tùy chọn thứ 7: CSS nội tuyến

Sử dụng CSS nội tuyến . Điều này giải quyết vấn đề, mặc dù tùy thuộc vào kích thước trang (trong các dòng mã), việc bảo trì (bởi chính tác giả hoặc người được chỉ định khác) của mã có thể rất khó khăn.

Nhưng tùy thuộc vào bối cảnh vai trò của bạn tại tổ chức hoặc chính sách bảo mật hệ thống web của nó, đây có thể là giải pháp khả dụng duy nhất cho bạn.

Kiểm tra

Tạo một tệp _foobar.html:

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

Trả lời đúng câu hỏi của Gagan

Làm thế nào là một trình duyệt được cho là để hiển thị css không liền kề?

  1. Có phải tạo một số cấu trúc dữ liệu bằng cách sử dụng tất cả các kiểu css trên một trang và sử dụng cấu trúc đó để hiển thị không?
  2. Hoặc nó kết xuất bằng cách sử dụng thông tin phong cách theo thứ tự nó nhìn thấy?

(trích dẫn thích nghi)

Để có câu trả lời chính xác hơn, tôi đề nghị Google các bài viết này:

  • Cách trình duyệt hoạt động: Đằng sau hậu trường của các trình duyệt web hiện đại
  • Kết xuất cây, bố cục và sơn
  • Điều đó có nghĩa gì với việc Render Render một trang web?
  • Cách hiển thị trình duyệt hoạt động - đằng sau hậu trường
  • Kết xuất - Tiêu chuẩn HTML
  • 10 Kết xuất - HTML5

+1 Ý tưởng hay bao gồm các thẻ script và sử dụng javascript để thêm css, HTML hoàn toàn hợp pháp cho các biên tập viên WYSIWYG CMS ngu ngốc
djolf 16/07/19

1

Bởi vì đây là HTML không hợp lệ nên không có bất kỳ ảnh hưởng nào đến kết quả ... điều đó chỉ có nghĩa là HTML không tuân thủ tiêu chuẩn (chỉ dành cho mục đích tổ chức). Vì mục đích hợp lệ, nó có thể được viết theo cách này:

<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>

Tôi đoán là trình duyệt áp dụng phong cách cuối cùng mà nó đi qua.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.