2012-09-25 33 views
14

Tôi có một trang, bao gồm một số tệp SVG. Để đồng bộ hóa kiểu dáng của các tệp SVG đó, tôi muốn tạo một biểu định kiểu duy nhất để giữ tất cả thông tin về kiểu dáng.Liên kết tới CSS trong SVG được nhúng bởi thẻ IMG

Tuy nhiên, khi bao gồm SVG như dưới đây, CSS sẽ không được áp dụng. Bất cứ ai có một giải pháp cho điều này hoặc là nó chỉ không thể liên kết đến các tập tin (CSS) khác trong một SVG tham chiếu bởi <img src="..." />?

Xem mã ví dụ bên dưới. Khi tải pic.svg trực tiếp trong trình duyệt, tất cả các kiểu được áp dụng và có thể thấy hình chữ nhật màu xanh lục. Nhưng khi mở page.htm tất cả những gì có thể thấy là một hình chữ nhật màu đen. Vì vậy, rõ ràng là không có kiểu dáng đã xác định nào được áp dụng.

page.htm

<!DOCTYPE html> 
<html> 
<body> 
    <img src="pic.svg" style="width: 100px; height: 100px;" /> 
</body> 
</html> 

pic.svg

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<?xml-stylesheet type="text/css" href="styles.css" ?> 
<svg version="1.1" 
    xmlns="http://www.w3.org/2000/svg" 
    viewBox="0 0 100 100" 
    > 
    <rect x="10" y="10" width="80" height="80" /> 
</svg> 

styles.css

rect { 
    stroke: black; 
    fill: green; 
} 

EDIT

Từ câu trả lời, trong một thời gian ngắn xuất hiện ở đây, tôi nhận được this link to the spec và trích dẫn sau đây. Theo quan điểm của tôi, các mã trên sẽ hoạt động!

tài liệu SVG Stand-alone nhúng trong một tài liệu HTML hay XML với 'img', 'đối tượng' (HTML) hoặc 'image' (SVG) yếu tố

[...]

Trích dẫn từ liên kết của bạn "style sheets định nghĩa bất cứ nơi nào trong tài liệu SVG tham chiếu (trong yếu tố phong cách hoặc các thuộc tính phong cách, hoặc trong style sheet bên ngoài liên kết với các hướng dẫn xử lý style sheet) áp dụng trên toàn bộ tài liệu SVG, nhưng không một hoàn thiện tài liệu tham chiếu (có thể là HTML hoặc XHTML). "

Trả lời

10

Vì lý do bảo mật, hình ảnh phải là các tệp độc lập. Bạn có thể sử dụng CSS nếu bạn mã hóa biểu định kiểu dưới dạng uri dữ liệu. Ví dụ.

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<?xml-stylesheet type="text/css" href="data:text/css;charset=utf-8;base64,cmVjdCB7IA0KICAgIHN0cm9rZTogYmxhY2s7DQogICAgZmlsbDogZ3JlZW47DQp9" ?> 
<svg version="1.1" 
    xmlns="http://www.w3.org/2000/svg" 
    viewBox="0 0 100 100" 
    > 
    <rect x="10" y="10" width="80" height="80" /> 
</svg> 

Có nhiều khác nhau online converters cho URI dữ liệu.

+0

Nhưng trong trường hợp đó tôi lại có một định nghĩa kiểu cho mỗi tệp SVG. Và làm thế nào mà liên quan đến trích xuất spec tôi đăng? – Sirko

+0

Nếu bạn muốn chia sẻ các định nghĩa kiểu, bạn không thể sử dụng thẻ hình ảnh. Các vấn đề bảo mật có xu hướng ghi đè các yêu cầu đặc điểm kỹ thuật mà thường không xem xét những thứ như vậy. –

+0

Rõ ràng, điều này cũng có nghĩa là bạn không thể tham chiếu đến phông chữ bên ngoài từ tệp SVG được tải qua tệp HTML. –

15

Một cách khác là sử dụng thẻ <object> trong html của bạn: -

<object type="image/svg+xml" data="pic.svg" width="100" height="100"></object> 

Đó là một sự xấu hổ BIG thẻ <img> sẽ không hoạt động. Tôi không muốn mess về hack với chuyển đổi SVG thành một URI dữ liệu. Nó liên quan đến các lỗ hổng trên trang web khi tải tài nguyên gián tiếp và sử dụng "Trình thu thập mở".

Lưu ý rằng trong thử nghiệm của tôi đêm qua, phương thức thẻ <img> KHÔNG hoạt động trong IE10, nhưng không hoạt động trong Chrome cũng như FireFox.

Tôi không biết tại sao <object> được phép và <img> thì không. Một giám sát?

+2

Không giám sát, đó là những gì mà mọi người mong đợi là khả năng của một hình ảnh tức là những gì bạn thấy là những gì nó là mọi lúc. Thẻ đối tượng luôn cho phép nội dung phức tạp có thể viết được. –

+1

Tôi thích câu trả lời này tốt nhất, nhận được một phông chữ để hiển thị trong SVG của tôi đã được lái xe cho tôi hạt cả ngày! Cảm ơn bạn! ... tuy nhiên khi bạn viết nó, nó đã phá vỡ phần còn lại của HTML của tôi cho đến khi tôi đóng nó như 'height =" 100 ">' cần một thẻ đối tượng đóng vì một lý do nào đó: http://scrabblehack.com/ –

+0

Leon: Cảm ơn. Tôi đã cập nhật ví dụ cho phù hợp. –

Các vấn đề liên quan