สีพื้นหลังเริ่มต้นขององค์ประกอบราก SVG


134

ฉันต้องการตั้งค่าสีพื้นหลังเริ่มต้นสำหรับเอกสาร SVG ทั้งหมดเป็นสีแดง

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

วิธีแก้ปัญหาข้างต้นใช้งานได้ แต่คุณสมบัติพื้นหลังของแอตทริบิวต์ style นั้นไม่ใช่คุณสมบัติมาตรฐาน: http://www.w3.org/TR/SVG/styling.html#SVGStylingPropertiesดังนั้นจึงถูกลบออกในระหว่างกระบวนการทำความสะอาดด้วย SVG ทำความสะอาด

มีวิธีอื่นในการประกาศสีพื้นหลังนี้หรือไม่?


1
อาจมีข้อผิดพลาดใน SVG Cleaner หรือไม่? มันจะลบบล็อกสไตล์อินไลน์เช่นกันแม้ว่าจะเป็นมาตรฐาน: w3.org/TR/SVG/styling.html#StylingWithCSS
Volker E.

คำตอบ:


120

SVG 1.2 Tiny มีการเติมวิวพอร์ตฉันไม่แน่ใจว่าคุณสมบัตินี้มีการนำไปใช้อย่างกว้างขวางเพียงใดเนื่องจากเบราว์เซอร์ส่วนใหญ่กำหนดเป้าหมายเป็น SVG 1.1 ในขณะนี้ Opera ดำเนินการ FWIW

วิธีแก้ปัญหาข้ามเบราว์เซอร์เพิ่มเติมในปัจจุบันคือการติด<rect>องค์ประกอบที่มีความกว้างและความสูง 100% และเติม = "red" เป็นลูกแรกของ<svg>องค์ประกอบตัวอย่างเช่น

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

24
การแฮ็กแบบ rect ใช้งานได้ แต่จะถือว่าอัตราส่วนกว้างยาวของ svg ตรงกับวิวพอร์ตที่ได้รับเสมอดังนั้นจึงไม่สามารถเติมวิวพอร์ตทั้งหมดในทุกสถานการณ์
Erik Dahlström

1
เมื่ออัตราส่วนภาพไม่ตรงกับวิวพอร์ตการใช้width="10000%" height="10000%"อาจแก้ไขได้ ถ้าไม่เช่นนั้นให้เพิ่มศูนย์
mulllhausen

1
@mulllhausen น่าเสียดายที่การเพิ่มมูลค่าสูงถึง 10,000,000% ไม่ได้ผล ข้อเสนอแนะอื่น ๆ ?
Crashalot

viewport-fillคำขอดึง Caniuse ที่ถูกละทิ้ง: github.com/Fyrd/caniuse/issues/2186ทำไมทำไมพวกเขาถึงปล่อยให้ SVG ตาย
Ciro Santilli 郝海东冠状病六四事件法轮功

47

พบว่าสิ่งนี้ใช้ได้ใน Safari SVG จะใช้เฉพาะสีพื้นหลังที่กล่องขอบเขตขององค์ประกอบครอบคลุม ดังนั้นให้เส้นขอบ (เส้นขีด) ที่มีขอบเขตศูนย์พิกเซล มันเติมเต็มสิ่งทั้งหมดให้กับคุณด้วยสีพื้นหลังของคุณ

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


5
สิ่งนี้ทำให้จังหวะองค์ประกอบย่อยทั้งหมดมีความกว้างเป็นศูนย์เช่นกันดังนั้นจึงไม่ใช่ตัวเลือก "พื้นหลัง" ที่ดี
duanev

35

เป็นคำตอบของ @Robert Longson ตอนนี้มีรหัส (เดิมไม่มีรหัสจะถูกเพิ่มในภายหลัง):

<?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>

คำตอบนี้ใช้:


20

ให้ฉันรายงานวิธีง่ายๆที่พบซึ่งไม่ได้เขียนไว้ในคำตอบก่อนหน้านี้ ฉันต้องการตั้งค่าพื้นหลังใน SVG ด้วย แต่ฉันก็ต้องการให้มันทำงานในไฟล์ SVG แบบสแตนด์อโลน

วิธีนี้ง่ายมากจริงๆแล้ว SVG รองรับแท็กสไตล์ดังนั้นคุณสามารถทำสิ่งต่างๆเช่น

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

ทางออกที่ดีและเรียบง่าย!
conceptdeluxe

1
แม้ว่างานนี้โดยทั่วไปในเบราว์เซอร์, การตั้งค่าbackground-colorของ<svg>องค์ประกอบที่จะทำให้ IE11 ทำให้สีพื้นหลังยังอยู่นอกพื้นที่ที่กำหนดไว้กับviewBoxแอตทริบิวต์ สิ่งนี้ไม่สำคัญเมื่อใช้widthและheightแอตทริบิวต์
conceptdeluxe

@conceptdeluxe ข้อสังเกตที่น่าสนใจในทางทฤษฎีรูปแบบที่เข้ารหัสภายใน svg ควรใช้เฉพาะภายใน svg เท่านั้น อย่างไรก็ตามการตั้งค่าความกว้างและความสูงเป็นสิ่งที่จำเป็นเกือบตลอดเวลา
Gianluca Casati

มีความแตกต่างระหว่าง<svg style"...."></svg>และ<svg><style>...</style></svg>โดยสมมติว่า<style>แท็กอยู่ที่ระดับบนสุดหรือไม่ ถ้าไม่เช่นนั้นคำตอบนี้ก็ดูเหมือนเป็นโซลูชันดั้งเดิมของ OP ซึ่งบรรจุใหม่ภายใต้ไวยากรณ์ที่แตกต่างกัน (แต่บางทีวิธีนี้อาจอยู่รอด SVG Cleaner ในขณะที่<svg style="..."></svg>ไม่ได้?)
Labrador

@ ลาบราดอร์ฉันกำลังมองหาวิธีแก้ปัญหาเห็นคำถามนี้แล้วจึงพบวิธีแก้ปัญหาและแบ่งปัน ฉันไม่รู้ดูเหมือนว่าจะรองรับเฉพาะแอตทริบิวต์ที่รายงานในw3.org/TR/SVG/styling.html#SVGStylingPropertiesนี้ ในทางกลับกันโซลูชันที่ฉันเสนอใช้งานได้และฉันชอบที่จะทำให้คุณสามารถจัดรูปแบบแท็ก SVG อื่น ๆ ได้เช่น path, rect และอื่น ๆ คุณสมบัติหลักสำหรับฉันคือมันใช้ได้กับ SVG แบบสแตนด์อโลนด้วย
Gianluca Casati

10

ฉันกำลังทำงานกับไฟล์ลักษณะนี้:

<?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">
...

และฉันพยายามใส่สิ่งนี้ลงในstyle.css:

svg {
  background: #bf1f1f;
}

มันทำงานบนโครเมี่ยมและ Firefox แต่ฉันไม่คิดว่ามันเป็นวิธีที่ดี โปรแกรมดูรูปภาพ EyeOfGnome ไม่แสดงผลและ Inkscape ใช้เนมสเปซพิเศษเพื่อจัดเก็บพื้นหลังดังกล่าว:

<?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" ... >

ดูเหมือนว่าองค์ประกอบราก SVG ไม่ได้เป็นส่วนหนึ่งขององค์ประกอบที่ทาสีได้ในคำแนะนำ SVG

ดังนั้นฉันขอแนะนำให้ใช้ไฟล์ โซลูชัน "rect" ที่ Robert Longson จัดเตรียมไว้ให้เพราะฉันเดาว่ามันไม่ใช่ "แฮ็ก" ง่ายๆ ดูเหมือนว่าจะเป็นวิธีมาตรฐานในการตั้งค่าพื้นหลังด้วย SVG


4
<rect width = "100%" height = "100%" fill = "white" /> ที่จุดเริ่มต้นแก้ปัญหาสำหรับ eog
nvrandow

2

วิธีแก้ปัญหาอื่นอาจใช้<div>ขนาดเดียวกันในการห่อไฟล์<svg>. หลังจากนั้นคุณจะสามารถสมัคร"background-color"ได้และ"background-image"จะมีผลกับไฟล์svg.

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

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

12
วิธีนี้เป็นการแฮ็ก HTML และอาจใช้ได้เฉพาะในกรณีที่คุณใช้ SVG ในหน้าเว็บ นี่ไม่ใช่โซลูชัน SVG ที่แท้จริง
Charles-Édouard Coste

สีพื้นหลังของ SVG ยืมมาจากส่วนประกอบที่อยู่ในนั้น (เช่น svg จะยืมสีของหน้าและสีของหน้าเริ่มต้นคือสีขาว) อย่างใดฉันไม่คิดว่ามันเป็นการแฮ็ก
Clinux

@clinux: สิ่งที่ Charles พยายามจะบอกคือมันทำงานได้อย่างสมบูรณ์แบบสำหรับการแสดงผลหน้าเว็บ แต่สมมติว่าคุณต้องการใช้ svg เดียวกันกับภาพที่มีนามสกุล. svg สำหรับการแสดงผลที่อื่นมันอาจไม่ทำงาน
Arunkumar Srisailapathi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.