มีวิธีการใช้ SVG เป็นเนื้อหาในองค์ประกอบปลอม: ก่อนหรือหลัง


246

ฉันต้องการวางภาพ SVG บางส่วนก่อนองค์ประกอบที่เลือกบางอย่าง ฉันใช้ jQuery แต่นั่นไม่เกี่ยวข้อง

ฉันต้องการให้:beforeองค์ประกอบเป็นดังนี้:

#mydiv:before {
  content: '<svg.. code here</svg>';
  display: block;
  width: 22px;
  height: 10px;
  margin: 10px 5px 0 10px;
}

ถ้าฉันทำตามที่แสดงด้านบนมันก็แค่แสดงสตริง ฉันตรวจสอบรายละเอียดและดูเหมือนว่ามีข้อ จำกัด บางประการเกี่ยวกับเนื้อหาที่สามารถเป็นได้ มีการแก้ไขข้อ จำกัด นี้หรือไม่? css เนื้อหาเท่านั้นที่เกี่ยวข้องกับคำถามของฉัน


1
มีบางอย่างผิดปกติในการใช้เป็นภาพพื้นหลังหรือไม่?
cimmanon

1
ฉันต้องการใช้เพื่อสร้างพอยน์เตอร์แฟนซีให้กับคำแนะนำเครื่องมือ JQuery UI ฉันทำตอนนี้ด้วยการแฮ็คองค์ประกอบหลอก CSS แต่นั่นให้สามเหลี่ยมเดียวกับฉัน ภาพพื้นหลังจะไม่ทำงานในกรณีนี้เพราะฉันต้องการสิ่งที่อยู่นอกองค์ประกอบ
ซันนี่

คำตอบ:


252

ใช่คุณสามารถ! เพิ่งทดสอบและใช้งานได้ดีมันยอดเยี่ยมมาก! มันยังใช้งานไม่ได้กับ html แต่ใช้กับ svg ได้

ใน index.html ของฉันฉันมี:

<div id="test" style="content: url(test.svg); width: 200px; height: 200px;"></div>

และ test.svg ของฉันมีลักษณะเช่นนี้:

<svg xmlns="http://www.w3.org/2000/svg">
   <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
   <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" style="fill:none;stroke:black;stroke-width:3"/>
</svg> 

18
เว้นแต่ SVGs content: url(path/to/my.svg)เป็นพิเศษคุณควรจะสามารถที่จะปฏิบัติต่อพวกเขาเช่นเดียวกับที่คุณต้องการในภาพ: ไม่ได้แปลว่ามันจะทำงานกับ jQuery UI tooltips library
cimmanon

1
@cimmanon อืมมันน่ารักฉันต้องการทดสอบมัน ดังนั้นใน my.html หรืออะไรก็ตามที่ฉันสามารถมีรหัส html ให้แสดง ... ฟังดูยอดเยี่ยม
dezman

2
ทำไมคุณต้องการทำเช่นนี้? หากคุณมีรหัส svg ในไฟล์อยู่แล้วคุณไม่จำเป็นต้องใส่รหัสในคลาสหลอก จุดรวมของคลาสหลอกคือการลดองค์ประกอบ DOM เมื่อคุณต้องการเพิ่มเนื้อหาเล็กน้อย แต่ในกรณีของคุณถ้าคุณใช้รหัส svg ของคุณตามปกติมันจะไม่แย่กว่า (และอาจจะสะอาดกว่า) กว่าวางไว้ในหลอก - คลาส (ซึ่งอาจเป็นไปไม่ได้เช่นกัน) ยกเว้นกรณีที่คุณต้องการใส่รหัส svg ของคุณในหลาย ๆ ตำแหน่งในกรณีนี้คุณควรเก็บรหัส svg ไว้ในไฟล์แยกต่างหากเช่นรูปภาพ
dezman

6
น่าเสียดายที่ฉันไม่เชื่อว่าวิธีนี้ใช้ได้กับสไปรต์ SVG เช่นcontent: url(mysprite.svg#my-icon)จะไม่ดึงไอคอนของคุณขึ้นมา ฉันชอบที่จะได้รับการพิสูจน์ผิด แต่ :)
Jason

1
@ วัตสันความหมาย HTML = โครงสร้าง, CSS = การนำเสนอ หาก SVG มีการตกแต่งก็ไม่ควรอยู่ในโครงสร้าง HTML ควรเป็น CSS
Deathlock

137

ใช่. คุณสามารถเพิ่ม SVG เป็นภาพพื้นหลังของว่าง: หลังหรือ: ก่อน ไปเลย:

.anchor:before {
  display: block;
  content: ' ';
  background-image: url('../images/anchor.svg');
  background-size: 28px 28px;
  height: 28px;
  width: 28px;
}

4
ฉันพบหนึ่งในโซลูชันที่ดีที่สุดหลังจากมองไประยะหนึ่ง คุณสามารถควบคุมทุกแง่มุมเดียวขององค์ประกอบที่แทรกและทำงานในลักษณะชีทสไตล์ชีท CSS ปกติโดยใช้ตรรกะแยกกัน ยอดเยี่ยม
Danielo515

... อ่าสิ่งนี้ทำให้ฉันมีความหวังจนกระทั่งฉันรู้ว่าbackground-sizeไม่รองรับ Opera Mini มันช่างน่าหงุดหงิดเหลือเกิน
Deathlock

ใช้งานได้ดีมาก @dlocklock ไม่จำเป็นต้องมีขนาดพื้นหลังเนื่องจากคุณกำหนดขนาดใน svg เองฉันไม่ต้องการมัน
Eric Soyke

1
ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากคำถามบอกว่า "ในองค์ประกอบปลอม: ก่อนหรือหลัง:"
ZalemCitizen

ฉันต้องเพิ่ม<?xml version="1.0" encoding="utf-8"?>ไปยังจุดเริ่มต้นของไฟล์ svg ของฉันเพื่อให้มันใช้งานได้
Nicolas Boisteault

130
#mydiv:before {
    content: url("data:image/svg+xml; utf8, <svg.. code here</svg>");
    display:block;
    width:22px;
    height:10px;
    margin:10px 5px 0 10px;
}

ตรวจสอบให้แน่ใจ svg ของคุณไม่มีเครื่องหมายคำพูดคู่และ uriencode สัญลักษณ์ # ใด ๆ


8
เนื่องจาก SVG มักใช้เครื่องหมายคำพูดคู่คุณจึงสามารถใช้เครื่องหมายคำพูดเดี่ยวด้านนอกได้ @ ข้อเสนอแนะของ Jenny เป็นวิธีที่ยอดเยี่ยมในการทำเช่นนี้หากคุณไม่ต้องการใช้ไฟล์ SVG ภายนอก
Micros

2
มันเยี่ยมมาก น่าเสียดายที่ใช้งานได้กับ Chrome สำหรับฉันเท่านั้น (ทดสอบบน Chrome, Firefox และ Edge)
Arsen

2
ตกลงใช้ได้กับ FF เพียงแค่ต้องใส่ใจกับส่วน "no #" ตรวจสอบให้แน่ใจด้วยว่าใช้แท็ก div (ดูเหมือนจะไม่ทำงานกับ span) น่าเศร้าที่ยังไม่ประสบความสำเร็จสำหรับ Edge
Arsen

เช่นเดียวกับโซลูชันที่ยอดเยี่ยมมากมายมันไม่รองรับโดย IE11 url('file.svg')ทำงานอย่างไร
Bob Stein

6
สิ่งที่ฉันพบว่าสำคัญคือการเพิ่มxmlns='http://www.w3.org/2000/svg'ในส่วน <svg> เพื่อทำงานใน Chrome 66.x ตัวอย่างเช่นเชฟรอนขนาดเล็กจะเป็น: content:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24px' height='24px' fill='white'><path d='M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z' /></svg>");
darth0s

28

การใช้ CSS sprites และ data uri ให้ประโยชน์ที่น่าสนใจเป็นพิเศษเช่นการโหลดที่รวดเร็วและการร้องขอที่น้อยลงและเราได้รับการสนับสนุน IE8 โดยใช้อิมเมจ / base64:

ตัวอย่างโค้ดโดยใช้ SVG

HTML

<div class="div1"></div>
<div class="div2"></div>

CSS

.div1:after, .div2:after {
  content: '';
  display: block;
  height: 80px;
  width: 80px;
  background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20height%3D%2280%22%20width%3D%22160%22%3E%0D%0A%20%20%3Ccircle%20cx%3D%2240%22%20cy%3D%2240%22%20r%3D%2238%22%20stroke%3D%22black%22%20stroke-width%3D%221%22%20fill%3D%22red%22%20%2F%3E%0D%0A%20%20%3Ccircle%20cx%3D%22120%22%20cy%3D%2240%22%20r%3D%2238%22%20stroke%3D%22black%22%20stroke-width%3D%221%22%20fill%3D%22blue%22%20%2F%3E%0D%0A%3C%2Fsvg%3E);
}
.div2:after {
  background-position: -80px 0;
}

สำหรับ IE8 เปลี่ยนเป็น:

  background-image: url(data:image/png;base64,data......);

แต่มันไม่สามารถปรับขนาดได้ใช่ไหม ฉันไม่สามารถปรับขนาดเป็น 16px หรือ 320px ตามต้องการ
Deathlock

@dlocklock แน่นอนว่ามันจะสเกลแม้ว่าจะไม่ใช่ตัวอย่างของฉันเพราะมันมีชุดขนาดคงที่ 80px กว้าง / สูง
Ason

1
@deathlock ฉันขอถามคุณได้ไหมว่าคุณลงคะแนนเพราะตัวอย่างข้างต้นไม่ได้ขยายขนาดหรือไม่
Ason

คุณจะทำให้มันขยายขนาดได้อย่างไร และไม่ฉันไม่ได้ทำ
Deathlock

@dlocklock ขอบคุณและนี่เป็นวิธีหนึ่งในการปรับขนาด svg: jsfiddle.net/ess6ywce ... โดยใช้เปอร์เซ็นต์ นอกจากนี้ค้นหาด้วยscale svgและคุณจะพบวิธีมากมายอีกมากมาย
Ason

22
<div class="author_">Lord Byron</div>

.author_ {  font-family: 'Playfair Display', serif; font-size: 1.25em; font-weight: 700;letter-spacing: 0.25em; font-style: italic;
  position:relative;
  margin-top: -0.5em;
  color: black;
  z-index:1;
  overflow:hidden;
  text-align:center;
 
}


.author_:after{
   left:20px;
  margin:0 -100% 0 0;
  display: inline-block;
  height: 10px;
  content: url(data:image/svg+xml,%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120px%22%20height%3D%2220px%22%20viewBox%3D%220%200%201200%20200%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%3Cpath%20stroke%3D%22black%22%20stroke-width%3D%223%22%20fill%3D%22none%22%20d%3D%22M1145%2085c17%2C7%208%2C24%20-4%2C29%20-12%2C4%20-40%2C6%20-48%2C-8%20-9%2C-15%209%2C-34%2026%2C-42%2017%2C-7%2045%2C-6%2062%2C2%2017%2C9%2019%2C18%2020%2C27%201%2C9%200%2C29%20-27%2C52%20-28%2C23%20-52%2C34%20-102%2C33%20-49%2C0%20-130%2C-31%20-185%2C-50%20-56%2C-18%20-74%2C-21%20-96%2C-23%20-22%2C-2%20-29%2C-2%20-56%2C7%20-27%2C8%20-44%2C17%20-44%2C17%20-13%2C5%20-15%2C7%20-40%2C16%20-25%2C9%20-69%2C14%20-120%2C11%20-51%2C-3%20-126%2C-23%20-181%2C-32%20-54%2C-9%20-105%2C-20%20-148%2C-23%20-42%2C-3%20-71%2C1%20-104%2C5%20-34%2C5%20-65%2C15%20-98%2C22%22%2F%3E%0A%3C%2Fsvg%3E%0A);
}
.author_:before {
  right:20px;
  margin:0 0 0 -100%;
  display: inline-block;
  height: 10px;
  content: url(data:image/svg+xml,%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120px%22%20height%3D%2220px%22%20viewBox%3D%220%200%201200%20130%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%3Cpath%20stroke%3D%22black%22%20stroke-width%3D%223%22%20fill%3D%22none%22%20d%3D%22M55%2068c-17%2C6%20-8%2C23%204%2C28%2012%2C5%2040%2C7%2048%2C-8%209%2C-15%20-9%2C-34%20-26%2C-41%20-17%2C-8%20-45%2C-7%20-62%2C2%20-18%2C8%20-19%2C18%20-20%2C27%20-1%2C9%200%2C29%2027%2C52%2028%2C23%2052%2C33%20102%2C33%2049%2C-1%20130%2C-31%20185%2C-50%2056%2C-19%2074%2C-21%2096%2C-23%2022%2C-2%2029%2C-2%2056%2C6%2027%2C8%2043%2C17%2043%2C17%2014%2C6%2016%2C7%2041%2C16%2025%2C9%2069%2C15%20120%2C11%2051%2C-3%20126%2C-22%20181%2C-32%2054%2C-9%20105%2C-20%20148%2C-23%2042%2C-3%2071%2C1%20104%2C6%2034%2C4%2065%2C14%2098%2C22%22%2F%3E%0A%3C%2Fsvg%3E%0A);
}
	<div class="author_">Lord Byron</div>

เครื่องมือที่สะดวกสำหรับการเข้ารหัสURLเข้ารหัส SVG


5

ระวังคำตอบอื่น ๆ ทั้งหมดให้มีปัญหาใน IE

ให้มีสถานการณ์นี้ - ปุ่มพร้อมไอคอนแบบเติม เบราว์เซอร์ทั้งหมดจัดการสิ่งนี้อย่างถูกต้อง แต่ IE จะใช้ความกว้างขององค์ประกอบและปรับขนาดเนื้อหาก่อนให้พอดี JSFiddle

#mydiv1 { width: 200px; height: 30px; background: green; }
#mydiv1:before {
    content: url("data:url or /standard/url.svg");
}

วิธีแก้ไขคือการตั้งค่าขนาดก่อนองค์ประกอบและปล่อยไว้ที่:

#mydiv2 { width: 200px; height: 30px; background: green; }
#mydiv2:before {
    content: url("data:url or /standard/url.svg");
    display: inline-block;
    width: 16px; //only one size is alright, IE scales uniformly to fit it
}

background-image+background-sizeการแก้ปัญหาการทำงานเป็นอย่างดี แต่ไม่สะดวกเล็ก ๆ น้อย ๆ เนื่องจากคุณจะต้องระบุขนาดเดียวกันสองครั้ง

ผลลัพธ์ใน IE11:

การแสดงผล IE


5

เพื่อขยายหัวข้อนี้ต่อไป ในกรณีที่คุณต้องการเพิ่มFont Awesome 5ไอคอนคุณต้องเพิ่ม CSS พิเศษบางอย่าง

ไอคอนโดยค่าเริ่มต้นเรียนและsvg-inline--fafa-w-*

นอกจากนี้ยังปรับปรุงการเรียนเช่นfa-lg, fa-rotate-*และอื่น ๆ คุณต้องตรวจสอบsvg-with-js.cssไฟล์และค้นหา CSS ที่เหมาะสมสำหรับสิ่งนั้น

คุณต้องเพิ่มสีของคุณเองไปที่ไอคอน CSS มิฉะนั้นก็จะเป็นสีดำโดยค่าเริ่มต้นตัวอย่างเช่นfill='%23f00'ที่มีการเข้ารหัส%23#

h1::before{

  /* svg-inline--fa */
  display:inline-block;
  font-size:inherit;
  height:1em;
  overflow:visible;
  vertical-align:-.125em;
  
  /* fa-w-14 */
  width:.875em;
  
  /* Icon */
  content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='%23f00' d='M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zM264 408c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48z'%3E%3C/path%3E%3C/svg%3E");
  
  /* Margin */
  margin-right:.75rem;
}
<h1>Lorem Ipsum</h1>


-1
.myDiv {
  display: flex;
  align-items: center;
}

.myDiv:before {
  display: inline-block;
  content: url(./dog.svg);
  margin-right: 15px;
  width: 10px;
}

3
คุณควรอธิบายเพิ่มเติมอีกเล็กน้อย เพียงแค่นี้ก็ยากที่จะบอกว่าทำไมคำตอบของคุณถึงได้ผล
ifconfig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.