2013-02-27 27 views
19

Tôi có sau SVG đồ họa:SVG "lấp đầy: url (# ....)" hành vi lạ trong Firefox

<svg width='36' height='30'> 
    <defs> 
    <linearGradient id="normal-gradient" x1="0%" y1="0%" x2="0%" y2="100%"> 
     <stop offset="0%" style="stop-color:rgb(81,82,84); stop-opacity:.4"/> 
     <stop offset="100%" style="stop-color:rgb(81,82,84); stop-opacity:1"/> 
    </linearGradient> 
    <linearGradient id="rollover-gradient" x1="0%" y1="0%" x2="0%" y2="100%"> 
     <stop offset="0%" style="stop-color:rgb(0,105,23); stop-opacity:.5"/> 
     <stop offset="100%" style="stop-color:rgb(0,105,23); stop-opacity:1"/> 
    </linearGradient> 
    <linearGradient id="active-gradient" x1="0%" y1="0%" x2="0%" y2="100%"> 
     <stop offset="0%" style="stop-color:rgb(0,0,0); stop-opacity:.4"/> 
     <stop offset="100%" style="stop-color:rgb(0,0,0); stop-opacity:1"/> 
    </linearGradient> 
    </defs> 

    <text x="8" y="25" style="font-size: 29px;" font-family="Arial">hello world</text> 
</svg>' 

tôi đặt fill thuộc tính của phần tử text thông qua CSS và chuyển đổi giữa các loại gradient tùy thuộc vào trạng thái di chuột. Điều này hoạt động tốt trong Chrome & Safari, nhưng trong Firefox, văn bản không hiển thị. Khi kiểm tra phần tử, tôi phát hiện ra rằng Firefox đang thêm none vào cuối thuộc tính CSS fill: url(#...) của mình. Tôi đã thử xóa từ khóa none bằng Firebug, nhưng Firebug chỉ xóa toàn bộ thuộc tính. Tại sao chuyện này đang xảy ra?

EDIT: tôi nên lưu ý rằng nếu tôi loại bỏ CSS mà đặt fill bất động sản, và hardcode thuộc tính fill vào text yếu tố (không thông qua một thuộc tính inline style), hiển thị văn bản đúng trong tất cả các trình duyệt.

+1

CSS thực tế của bạn trông như thế nào, để đi với SVG đó? Đối với "không" điều, "điền: url (bất cứ điều gì) không" là điều tương tự như "điền: url (bất cứ điều gì)"; cả hai đều nói rằng nếu điều tại url không có sẵn thì không có dự phòng và không có gì phải được vẽ. –

+0

@BorisZbarsky Cảm ơn, tôi đã không nhận ra rằng 'không có gì' đã chỉ định điều gì xảy ra khi tài nguyên đầu tiên không được tìm thấy. –

Trả lời

37

Đã tìm ra. Trong CSS của tôi, tôi đã đề cập đến các gradient trong cùng một cách tôi ban đầu được tham khảo inline điền:

#myselector { 
    fill: url('#gradient-id'); 
} 

Để có được nó làm việc trong Firefox, tôi đã phải thay đổi nó như thế này:

#myselector { 
    fill: url('/#gradient-id'); 
} 

Không chắc chắn tại sao lại như vậy. Có lẽ nó có liên quan đến cấu trúc thư mục chứa biểu định kiểu của tôi?

+3

Một url tương đối 'url()' trong biểu định kiểu được giải quyết tương đối so với biểu định kiểu. Vì vậy, nếu biểu định kiểu và SVG của bạn nằm trong các thư mục khác nhau, rất có thể bạn không liên kết với SVG. –

+1

Webkit không làm điều này đúng và tôi khá chắc chắn Boris báo cáo rằng để bugtracker của họ một số thời gian trước đây. –

+0

Hi Boris, Tôi cũng gặp vấn đề này, tôi đã nhìn thấy bạn bình luận thường xuyên trên các báo cáo lỗi của Firefox, bạn có thể giải thích tại sao điền: url ("# gradient-id") không tìm thấy rằng id gradient trong dom khi được chỉ định trong css, nhưng có nội tuyến không? Tôi không tải svgs bên ngoài trang của mình ... Chrome có thực hiện điều này không chính xác không? Điều này có vẻ như nó phải là hành vi mong đợi. – Daniel

7

SVG “fill: url (# ...)” có biểu hiện lạ trong Firefox khi chúng ta gán mã dưới đây với css

#myselector { 
fill: url('#gradient-id'); 
} 

Giải pháp

cho inline (cả bên ngoài và nội bộ css.) tạo kiểu, điều này có thể được thực hiện theo cả hai cách. Tĩnh hoặc động cách

động cách

.attr('fill', 'url(#gradient-id)') 

cách tĩnh

fill="url(#gradient-id)" 

Trong tĩnh bạn phải đặt này trong SVG Html;

+0

Cảm ơn. Câu trả lời được chấp nhận khác dường như chỉ sửa khi xem svg từ url gốc (hoặc ngược lại). – Chase

+0

cũng thuộc tính phong cách hoạt động nơi css lớp doesnt. ví dụ: .. – luky

-1

Tôi đã gặp sự cố tương tự với linearGradient trong SVG - vẫn còn trong năm 2017. Tôi đoán, vấn đề là Firefox xử lý url('#gradient-id') như URL bình thường và quy tắc áp dụng của <base href=""/> thẻ meta. Bình luận nó ra và kiểm tra sau đó.

+0

Không có thẻ cơ sở nào trong câu hỏi. Câu hỏi này là về việc giải quyết một url trong một bản định kiểu CSS. Liệu nó có giải quyết dựa vào bản định kiểu (như thông số CSS nói) hoặc tài liệu sử dụng biểu định kiểu đó (như Chrome không). –

+1

Chắc chắn, nó không phải là - Tôi chỉ nghĩ rằng điều này có thể là một lý do tại sao nó không hoạt động đúng. Đó là một lý do trong trường hợp của tôi. Nó không phải là về stylesheet, nhưng nơi mà các ** id ** tag (ở đây ** gradient-id **) được đặt. Đối với một số lý do sử dụng đường dẫn tương đối ** # gradient-id ** với thẻ meta ** base ** đã phá vỡ nội dung nào đó và FF không thể tìm thấy thẻ ** html-id ** ở bất kỳ đâu. Trong trường hợp của tôi nó không hoạt động trong html (trong vòng tròn svg) và trong css hoặc js với đường dẫn tương đối. Nó hoạt động khi tôi xóa thẻ ** base ** hoặc đặt đường dẫn tuyệt đối trong js như **. Attr ('stroke', "url (" + window.location.href + "# gradient-id)" ** – lukdur

+0

thẻ meta cũng ảnh hưởng đến Safari @ lukdur.Vì vậy, giải pháp của bạn cho vấn đề này là gì? Thiết lập đường dẫn tuyệt đối? –