Màu nền mặc định của phần tử gốc SVG


134

Tôi muốn đặt màu nền mặc định cho toàn bộ tài liệu SVG, thành màu đỏ chẳng hạn.

<svg viewBox="0 0 500 600" style="background: red">/* content */</svg>

Giải pháp ở trên hoạt động nhưng thuộc tính nền của thuộc tính style không may không phải là tiêu chuẩn: http://www.w3.org/TR/SVG/stomme.html#SVGStylingProperies , và do đó, nó bị xóa trong quá trình làm sạch với SVG Sạch hơn.

Có cách nào khác để khai báo màu nền này không?


1
Có lẽ cũng có một lỗi trong SVG Cleaner? Nó cũng loại bỏ các khối kiểu nội tuyến, mặc dù chúng là tiêu chuẩn: w3.org/TR/SVG/stomme.html#StylingWithCSS
Volker E.

Câu trả lời:


120

SVG 1.2 Tiny có chế độ xem đầy đủ Tôi không chắc chắn cách thức triển khai rộng rãi của tài sản này mặc dù hầu hết các trình duyệt đang nhắm mục tiêu SVG 1.1 tại thời điểm này. Opera thực hiện nó FWIW.

Một giải pháp đa trình duyệt hiện tại sẽ là dán một <rect>phần tử có chiều rộng và chiều cao 100% và fill = "red" làm <svg>phần tử con đầu tiên của phần tử, ví dụ:

<rect width="100%" height="100%" fill="red"/>

24
Loại hack trực tiếp hoạt động, nhưng nó giả định rằng tỷ lệ khung hình của svg luôn khớp với khung nhìn mà nó nhận được, vì vậy nó sẽ không lấp đầy toàn bộ khung nhìn trong mọi tình huống.
Erik Dahlström

1
khi tỷ lệ khung hình không khớp với chế độ xem thì sử dụng width="10000%" height="10000%"có thể khắc phục nó. nếu không thì thêm một số không
mulllhausen

1
@mulllhausen không may thêm một giá trị cao tới 10000000% không hoạt động. bất cứ một đề nghị nào khác?
Crashalot

viewport-fillYêu cầu kéo caniuse bị bỏ rơi : github.com/Fyrd/caniuse/issues/2186 Tại sao tại sao họ lại để SVG chết.
Ciro Santilli 郝海东 冠状 病 事件 法轮功

47

Tìm thấy điều này hoạt động trong Safari. SVG chỉ tô màu với màu nền trong đó hộp giới hạn của phần tử bao phủ. Vì vậy, cung cấp cho nó một đường viền (đột quỵ) với ranh giới pixel bằng không. Nó lấp đầy toàn bộ cho bạn với màu nền của bạn.

<svg style='stroke-width: 0px; background-color: blue;'> </svg>


5
Điều này làm cho tất cả các nét của phần tử phụ cũng có độ rộng bằng 0, do đó, đây không phải là một tùy chọn "nền" tốt.
duanev

35

Đó là câu trả lời của @Robert Longson, bây giờ có mã (ban đầu không có mã, nó đã được thêm vào sau):

<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
 <rect width="100%" height="100%" fill="red"/>
</svg>

Câu trả lời này sử dụng:


20

Hãy để tôi báo cáo một giải pháp rất đơn giản mà tôi tìm thấy, đó không phải là viết trong các câu trả lời trước. Tôi cũng muốn đặt nền trong một SVG, nhưng tôi cũng muốn nó hoạt động trong một tệp SVG độc lập.

Chà, giải pháp này thực sự đơn giản, trên thực tế, SVG hỗ trợ các thẻ kiểu, vì vậy bạn có thể làm một cái gì đó như

<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
  <style>svg { background-color: red; }</style>
  <text>hello</text>
</svg>

Giải pháp đẹp và đơn giản!
conIGHTtdeluxe

1
Mặc dù công trình này nói chung trong tất cả các trình duyệt, thiết lập background-colorcác <svg>yếu tố sẽ làm cho IE11 làm cho màu nền cũng ngoài khu vực được xác định với các viewBoxthuộc tính. Điều này không quan trọng khi sử dụng widthheightcác thuộc tính mặc dù.
conIGHTtdeluxe

@con805tdeluxe quan sát thú vị, theo lý thuyết, phong cách được mã hóa bên trong svg chỉ nên áp dụng bên trong svg. Tuy nhiên, thiết lập chiều rộng và chiều cao hầu như luôn luôn cần thiết.
Gianluca Casati

Có sự khác biệt giữa <svg style"...."></svg><svg><style>...</style></svg>, giả sử <style>thẻ ở cấp cao nhất? Nếu không, thì câu trả lời này giống như giải pháp ban đầu của OP, được đóng gói lại theo một cú pháp khác. (Nhưng có lẽ giải pháp này vẫn tồn tại với SVG Cleaner, trong khi <svg style="..."></svg>không?)
Labrador

@Labrador Tôi đang tìm giải pháp, thấy câu hỏi này, sau đó tìm cách giải quyết và chia sẻ nó. Tôi không biết, có vẻ như các thuộc tính duy nhất được báo cáo trong w3.org/TR/SVG/stomme.html#SVGStylingProperies này được hỗ trợ. Mặt khác, giải pháp tôi đề xuất hoạt động và tôi thích nó cũng khiến bạn có thể tạo kiểu cho các thẻ SVG khác, như đường dẫn, chỉnh lưu, v.v. Đặc điểm chính đối với tôi là nó cũng hoạt động với các SVG độc lập.
Gianluca Casati

10

Tôi hiện đang làm việc trên một tập tin như thế này:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/css" href="style.css" ?>
<svg
  xmlns="http://www.w3.org/2000/svg"
  version="1.1"
  width="100%"
  height="100%"
  viewBox="0 0 600 600">
...

Và tôi đã cố gắng đưa nó vào style.css:

svg {
  background: #bf1f1f;
}

Nó hoạt động trên Chromium và Firefox, nhưng tôi không nghĩ rằng đó là một cách thực hành tốt . Trình xem ảnh EyeOfGnome không hiển thị nó và Inkscape sử dụng một không gian tên đặc biệt để lưu trữ nền như vậy:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    version="1.1"
    ...
  <sodipodi:namedview
     pagecolor="#480000" ... >

Chà, có vẻ như phần tử gốc SVG không phải là một phần của các phần tử có thể vẽ được trong các khuyến nghị của SVG.

Vì vậy, tôi khuyên bạn nên sử dụng giải pháp "chỉnh lưu" do Robert Longson cung cấp vì tôi đoán rằng đó không phải là một "hack" đơn giản. Nó dường như là cách tiêu chuẩn để đặt nền với SVG.


4
<orth width = "100%" height = "100%" fill = "trắng" /> ở đầu giải quyết vấn đề cho eog
nvrandow

2

Một cách giải quyết khác có thể là sử dụng <div>cùng kích thước để bọc <svg>. Sau đó, bạn sẽ có thể áp dụng "background-color", và "background-image"điều đó sẽ ảnh hưởng đến svg.

<div class="background">
  <svg></svg>
</div>

<style type="text/css">
.background{
  background-color: black; 
  /*background-image: */
}
</style>

12
Giải pháp này là một bản hack HTML. Và chỉ có thể hoạt động nếu bạn đang sử dụng SVG vào một trang web. Đây không phải là một giải pháp SVG thực sự.
Charles-Édouard Coste

Màu nền của SVG được mượn từ thành phần mà nó đang ngồi. (Giống như svg mượn màu trang và màu trang mặc định là màu trắng). Bằng cách nào đó tôi không nghĩ đó là một hack.
lâm sàng

@clinux: Điều Charles muốn nói là, nó hoạt động hoàn hảo để kết xuất trang web nhưng giả sử bạn muốn sử dụng cùng một Svg như một hình ảnh với phần mở rộng .svg để hiển thị ở nơi khác, nó có thể không hoạt động.
Arunkumar Srisailapathi
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.