Thuộc tính nội dung CSS: có thể chèn HTML thay vì Văn bản không?


246

Chỉ cần tự hỏi liệu bằng cách nào đó có thể làm cho thuộc tính CSS contentchèn mã html thay vì chuỗi trên :beforehoặc :aftermột phần tử như:

.header:before{
  content: '<a href="#top">Back</a>';
}

Điều này sẽ khá tiện dụng ... Nó có thể được thực hiện thông qua Javascript nhưng sử dụng css cho việc này thực sự sẽ giúp cuộc sống dễ dàng hơn :)


@Kaiido OMG ... không phải, không kiểm tra ngày của câu hỏi, tôi đã đề cập đến câu trả lời của bạn ... thực sự xin lỗi, sẽ xóa cả hai bình luận này :)
Ason

Câu trả lời:


210

Thật không may, điều này là không thể. Theo thông số kỹ thuật :

Nội dung được tạo không làm thay đổi cây tài liệu. Cụ thể, nó không được đưa trở lại bộ xử lý ngôn ngữ tài liệu (ví dụ, để sửa chữa lại).

Nói cách khác, đối với các giá trị chuỗi, điều này có nghĩa là giá trị luôn được xử lý theo nghĩa đen. Nó không bao giờ được hiểu là đánh dấu, bất kể ngôn ngữ tài liệu được sử dụng.

Ví dụ: sử dụng CSS đã cho với HTML sau:

<h1 class="header">Title</h1>

... sẽ dẫn đến kết quả đầu ra sau:

<a href="#top"> Quay lại </a> Tiêu đề


1
đồng ý, nhưng nếu bạn tưởng tượng rằng nó đã có hỗ trợ cho hình ảnh với các urlthuộc tính, việc thêm một liên kết sẽ không khác biệt trong phối cảnh này.
zanona

12
@ludicco: Đó là vì bản thân hình ảnh không phải là các thành phần DOM (không tính <img>), chúng chỉ được vẽ trên các thành phần hiện có, vì vậy bằng cách áp dụng hình nền hoặc liệt kê hình ảnh bạn không thực sự sửa đổi DOM.
BoltClock

1
cảm ơn, vì vậy tôi nghĩ rằng tôi sẽ phải vượt qua ý tưởng này và đi thẳng đến js, chúc mừng
zanona

6
@oidicco: Câu hỏi hay. Ngay cả tôi đã tìm kiếm thông qua SO hy vọng điều này là có thể.
Robin Maben

1
@watson: Chỉ cần thấy câu trả lời của bạn cho câu hỏi khác. Bạn đúng; Tôi có lẽ nên làm rõ trong câu trả lời của mình rằng bạn không thể thêm đánh dấu tùy ý - url()thay vào đó bạn phải chỉ định một tệp bên ngoài , như với bất kỳ hình ảnh nào khác.
BoltClock

54

Như hầu như đã lưu ý trong các nhận xét cho câu trả lời của @ BoltClock, trong các trình duyệt hiện đại , bạn thực sự có thể thêm một số đánh dấu html vào các phần tử giả bằng cách sử dụng ( url()) kết hợp với <foreignObject>phần tử của Svg .

Bạn có thể chỉ định một URL trỏ đến tệp svg thực tế hoặc tạo URL bằng phiên bản dataURI ( data:image/svg+xml; charset=utf8, + encodeURIComponent(yourSvgMarkup))

Nhưng lưu ý rằng nó chủ yếu là một hack và có rất nhiều hạn chế:

  • Bạn không thể tải bất kỳ tài nguyên bên ngoài nào từ đánh dấu này (không CSS, không hình ảnh, không phương tiện, v.v.).
  • Bạn không thể thực thi tập lệnh.
  • Vì đây sẽ không phải là một phần của DOM, cách duy nhất để thay đổi nó là vượt qua đánh dấu dưới dạng dataURI và chỉnh sửa dataURI này document.styleSheets. cho phần này, DOMParserXMLSerializercó thể giúp đỡ .
  • Mặc dù hoạt động tương tự cho phép chúng tôi tải phương tiện được mã hóa url trong <img>các thẻ, nhưng điều này sẽ không hoạt động trong các phần tử giả (ít nhất là cho đến ngày hôm nay, tôi không biết liệu nó có được chỉ định ở bất kỳ nơi nào không nên không, vì vậy nó có thể là một tính năng chưa được thực hiện).

Bây giờ, một bản demo nhỏ của một số đánh dấu html trong phần tử giả:

/* 
**  original svg code :
*
*<svg width="200" height="60"
*     xmlns="http://www.w3.org/2000/svg">
*
* <foreignObject width="100%" height="100%" x="0" y="0">
*	<div xmlns="http://www.w3.org/1999/xhtml" style="color: blue">
*		I am <pre>HTML</pre>
*	</div>
* </foreignObject>
*</svg>
*
*/
#log::after {
  content: url('data:image/svg+xml;%20charset=utf8,%20%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2260%22%20width%3D%22200%22%3E%0A%0A%20%20%3CforeignObject%20y%3D%220%22%20x%3D%220%22%20height%3D%22100%25%22%20width%3D%22100%25%22%3E%0A%09%3Cdiv%20style%3D%22color%3A%20blue%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%09%09I%20am%20%3Cpre%3EHTML%3C%2Fpre%3E%0A%09%3C%2Fdiv%3E%0A%20%20%3C%2FforeignObject%3E%0A%3C%2Fsvg%3E');
}
<p id="log">hi</p>


Tôi đã xem qua câu trả lời của bạn, và đó là một giải pháp cho một số vấn đề của riêng tôi. Bạn có thể giải thích làm thế nào để định dạng một URL trỏ đến một tập tin? Tôi đã thử url('/relativePathToMySvg/mySvg.svg')và nó không hoạt động
Frank

@Frank, trên mỗi thông số kỹ thuật, sử dụng đường dẫn tương đối sẽ liên quan đến đường dẫn của tệp css của bạn, tức là, nếu bạn đã có tệp css của mình /root/css/yourFile.css, thì một funcIRI tương đối yourFile.svgsẽ được trỏ đến /root/css/yourFile.svg/. Nhưng, tôi nghĩ rằng tôi nhớ rằng một số UA trước đó có lỗi và khiến nó liên quan đến cơ sở của tài liệu. Vì vậy, cách an toàn nhất là chỉ sử dụng đường dẫn tuyệt đối.
Kaiido

1
@BoltClock, thật sao? Tôi thực sự xin lỗi về điều đó. Tôi đã đưa ra câu hỏi 6 năm tuổi này bởi một người khác và cảm thấy tôi phải đăng nó dưới dạng cập nhật, nhưng có lẽ tôi nên rõ ràng hơn rằng câu trả lời của bạn là tốt, và chắc chắn là đúng 6 năm trước? Hoặc nếu bạn có một số từ hay có thể phù hợp làm tiêu đề, vui lòng chỉnh sửa câu trả lời của tôi.
Kaiido

1
Đẹp. Tôi đã sử dụng: content: url('../../images/como-funciona.svg');và nó hoạt động tốt
Eliut Islas

Đây là một bài viết trước đó, có câu trả lời của tôi, đi sâu hơn một chút vào chủ đề: is-it-could-to-display-an-html-document-or-html-Fragment-at-css-content
Ason

7

Trong phương tiện phân trang CSS3, điều này có thể sử dụng position: running()content: element().

Ví dụ từ dự thảo CSS Generated Content cho Paged Media Module :

@top-center {
  content: element(heading); 
}

.runner { 
  position: running(heading);
}

.runner có thể là bất kỳ phần tử nào và headinglà tên tùy ý cho vị trí.

EDIT: để làm rõ, về cơ bản không có hỗ trợ trình duyệt nên điều này chủ yếu là để tham khảo trong tương lai / ngoài 'câu trả lời thực tế' đã được đưa ra.


Này, bạn có thể giải thích điều này nhiều hơn một chút Tôi quan tâm đến lý thuyết của bạn nhưng dường như không thể thực hiện nó. Làm thế nào tôi có thể bao gồm, giả sử, một thẻ neo sử dụng phương thức này hoặc div.
Neil

vấn đề là về cơ bản hiện tại không có hỗ trợ trình duyệt, nhưng các trình kết xuất HTML chuyên dụng thực hiện nó theo thông số kỹ thuật. Tin tức không tốt tiếp theo là dường như không có triển khai nguồn mở tốt; hầu hết là các sản phẩm SaaS như princexml.com .
sol
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.