Câu trả lời ngắn
Theo thông số kỹ thuật hiện tại, có, style
các yếu tố phải luôn ở trong head
. Không có ngoại lệ (ngoại trừ một style
yếu tố bên trong một template
yếu tố , nếu bạn muốn tính điều đó).
Điều này không phải luôn luôn là trường hợp trong lịch sử. Nếu bạn quan tâm đến các chi tiết của thông số kỹ thuật và lịch sử của nó, hãy tiếp tục đọc.
Bất kể thông số kỹ thuật nói gì, sử dụng style
các yếu tố trong body
hoạt động nhiều hơn hoặc ít hơn trong tất cả các trình duyệt chính. Tuy nhiên, nó được coi là một thực tiễn xấu cả vì nó vi phạm thông số kỹ thuật và bởi vì nó có thể gây ra hậu quả không mong muốn như hiệu suất kết xuất kém hơn hoặc "flash nội dung không được chỉnh sửa".
Lịch sử Spec
style
các phần tử không tồn tại trong HTML 2 . Chúng được giới thiệu trong HTML 3.0, trong đó chúng được đưa vào danh sách các yếu tố có thể được đưa vào Phần tử đầu , nhưng không được đưa vào danh sách các yếu tố có thể có trong Yếu tố cơ thể . Vì vậy, tại thời điểm phần tử được suy đoán đầu tiên, nó chỉ có thể được bao gồm trong head
.
Đây vẫn là trường hợp (mặc dù được thể hiện bằng cách sử dụng từ ngữ khác nhau) cho đến khi HTML 5, giới thiệu thuộc tính (kể từ khi xóa) scoped
cho style
các phần tử. Thuộc tính này, khi có mặt, có nghĩa là cho phép một style
phần tử được đặt trong một phần tử trong cơ thể để tạo kiểu chỉ cho hậu duệ của phần tử đó. Tuy nhiên, tính năng đó không bao giờ xuất hiện trên bất kỳ trình duyệt thực nào (ít nhất là không cần phải bật thông qua cờ nhà phát triển) và đã bị xóa khỏi cả thông số kỹ thuật của W3C và WhatWG "do thiếu sự quan tâm của người triển khai" . Sau đó, style
các yếu tố chỉ được cho phép trong bối cảnh cho phép nội dung siêu dữ liệu, chỉ là phần đầu. Do đó, chúng tôi đã trở lại các quy tắc như trước HTML 5.
Tuy nhiên, do một lỗi do cả hai tổ chức đặc tả gây ra, một chỉ số các yếu tố không theo quy tắc bao gồm như một phụ lục trong cả hai thông số kỹ thuật đã không được cập nhật đúng để phản ánh việc loại bỏ scoped
, khiến nó không phù hợp với thông số quy phạm. Tôi đã chỉ ra điều này cho cả WhatWG và W3C , và khi vô tình đặt ra các sự kiện chuyển động khiến hai thông số kỹ thuật phân kỳ.
Giải pháp của WhatWG cho sự không nhất quán giữa thông số quy chuẩn và chỉ số không quy tắc là chấp nhận bản vá của tôi sửa chữa chỉ số không quy tắc.
Mặt khác, W3C đã từ chối bản vá tương đương của tôi thay vì cập nhật thông số quy chuẩn để cho phép sử dụng các style
yếu tố trong body
, trong khi lưu ý điều này với một lưu ý rằng nó có thể gây ra sự cố và nên được thực hiện "cẩn thận". Lý do đằng sau sự thay đổi này là để làm cho thông số kỹ thuật phù hợp với hành vi trình duyệt thực tế.
Do đó, từ tháng 3 năm 2017, đó là trường hợp câu trả lời chính thức cho câu hỏi này phụ thuộc vào tổ chức tiêu chuẩn nào bạn chọn nghe. Nếu bạn đã liệt kê vào thông số WhatWG (thường được tôn trọng hơn), thì một style
phần tử không được phép trong body
. Nếu bạn đã liệt kê vào thông số W3C, thì nó đã được cho phép, nhưng không được khuyến nghị.
Tình trạng ngớ ngẩn này đã chấm dứt (có lẽ giống như nhiều mâu thuẫn khác) với hiệp ước hòa bình tháng 4 năm 2019 giữa W3C và WhatWG , đã đồng ý rằng thông số WhatWG sẽ trở thành một tiêu chuẩn HTML sống thực sự, với W3C chỉ phát hành các ảnh chụp nhanh từ nó như được đánh số Thông số kỹ thuật HTML thay vì phát triển một thông số cạnh tranh song song. Do đó, việc thay đổi từ năm 2017 sang ngã ba W3C cho phép style
các yếu tố trong body
không còn là một phần của bất kỳ thông số hiện tại nào; nó chỉ đơn thuần là một sự tò mò của lịch sử.
Vì vậy, ngày nay, chúng ta chỉ cần nhìn vào thông số WhatWG để xác định những gì được phép chính thức. Nó có điều này để nói:
4.2.6. các style
yếu tố
Nội dung siêu dữ liệu .
Nơi dự kiến nội dung siêu dữ liệu .
Trong một <noscript>
yếu tố đó là con của một <head>
yếu tố.
CTRL-Finger thông qua thông số trang đơn cho thấy phần tử duy nhất có mô hình nội dung bao gồm nội dung siêu dữ liệu là head
phần tử.
Chỉ số không quy tắc của các yếu tố tôi đã đề cập sửa chữa trước đó cũng xác nhận rằng cha mẹ duy nhất được phép cho một style
yếu tố là một head
hoặc một noscript
yếu tố.