2011-02-05 23 views
92

Khi một SVG được bao gồm trực tiếp trong tài liệu bằng cách sử dụng thẻ <svg>, bạn có thể áp dụng kiểu CSS cho SVG thông qua biểu định kiểu của tài liệu. Tuy nhiên, tôi đang cố gắng áp dụng một kiểu cho một SVG được nhúng (sử dụng thẻ <object>).Làm thế nào để áp dụng một phong cách cho một SVG nhúng?

Có thể sử dụng bất kỳ thứ gì như mã sau không?

object svg { 
    fill: #fff; 
} 
+1

tôi đã đưa ra một cách nhẹ để làm điều này mà sẽ làm việc tuyệt vời cho những gì bạn đang cố gắng làm. Xem phần Giải Đáp này: http://stackoverflow.com/questions/11978995/how-to-change-color-of-svg-image-using-css-jquery-svg-image-replacement/ –

Trả lời

98

Câu trả lời ngắn gọn: không, vì kiểu không áp dụng trên biên giới tài liệu.

Tuy nhiên, vì bạn có thẻ <object>, bạn có thể chèn biểu định kiểu vào tài liệu svg bằng tập lệnh.

Something như thế này, và lưu ý rằng mã này giả định rằng các <object> đã nạp đầy đủ:

var svgDoc = yourObjectElement.contentDocument; 
var styleElement = svgDoc.createElementNS("http://www.w3.org/2000/svg", "style"); 
styleElement.textContent = "svg { fill: #fff }"; // add whatever you need here 
svgDoc.getElementById("where-to-insert").appendChild(styleElement); 

Nó cũng có thể chèn một yếu tố <link> để tham khảo một stylesheet bên ngoài:

var svgDoc = yourObjectElement.contentDocument; 
var linkElm = svgDoc.createElementNS("http://www.w3.org/1999/xhtml", "link"); 
linkElm.setAttribute("href", "my-style.css"); 
linkElm.setAttribute("type", "text/css"); 
linkElm.setAttribute("rel", "stylesheet"); 
svgDoc.getElementById("where-to-insert").appendChild(linkElm); 

Tuy nhiên, một tùy chọn khác là sử dụng phương thức đầu tiên, để chèn phần tử kiểu và sau đó thêm quy tắc @import, ví dụ: styleElement.textContent = "@import url(my-style.css)".

Tất nhiên bạn có thể liên kết trực tiếp đến biểu định kiểu từ tệp svg, mà không cần thực hiện bất kỳ tập lệnh nào. Một trong những điều sau đây nên làm việc:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="my-style.css" type="text/css"?> 
<svg xmlns="http://www.w3.org/2000/svg"> 
    ... rest of document here ... 
</svg> 

hay:

<svg xmlns="http://www.w3.org/2000/svg"> 
    <defs> 
    <link href="my-style.css" type="text/css" rel="stylesheet" 
      xmlns="http://www.w3.org/1999/xhtml"/> 
    </defs> 
    ... rest of document here ... 
</svg> 

Cập nhật 2015: bạn có thể sử dụng jquery-svg plugin cho áp dụng script js và phong cách css đến một SVG nhúng.

+0

Đây có phải là phương pháp để liên kết không một biểu định kiểu bên ngoài? Nếu không, điều đó có khả thi không? –

+0

Ở trên chèn một yếu tố phong cách vào svg. Có, cũng có thể chèn một phần tử liên kết xhtml để liên kết đến một biểu định kiểu bên ngoài, hoặc có thể là một lệnh xử lý xml-stylesheet (xem http://www.w3.org/Style/styling-XML.html). –

+0

Đây là Erik khá tuyệt vời! Tuy nhiên, tôi không thể quản lý mẹo này để làm việc trong Chrome mà không bao gồm svgweb: http://code.google.com/p/svgweb/ ... Bất kỳ ý tưởng nào là những gì tôi đang làm sai? –

5

Bạn có thể thực hiện việc này mà không cần javsscrpt bằng cách đặt khối kiểu với kiểu của bạn bên trong tệp SVG.

<style type="text/css"> 
path, 
circle, 
polygon { 
    fill: #fff; 
    } 
</style> 
Các vấn đề liên quan