Có cách nào để sử dụng SVG làm nội dung trong phần tử giả: trước hoặc: sau


245

Tôi muốn đặt một số hình ảnh SVG trước một số yếu tố được chọn. Tôi đang sử dụng JQuery nhưng điều đó không liên quan. Tôi muốn có: trước phần tử là:

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

Nếu tôi làm như hình trên, nó chỉ hiển thị chuỗi. Tôi đã kiểm tra thông số kỹ thuật và dường như có một số hạn chế về nội dung có thể. Có một công việc xung quanh hạn chế này? Chỉ css nội dung có liên quan đến câu hỏi của tôi.


1
Có điều gì đó sai với việc sử dụng nó làm hình nền?
cimmanon

1
Tôi muốn sử dụng nó để tạo các con trỏ ưa thích cho các công cụ UI của JQuery. Bây giờ tôi làm điều đó với các phần tử giả CSS hack nhưng điều đó chỉ mang lại cho tôi các hình tam giác. Hình nền sẽ không hoạt động trong trường hợp này vì tôi cần một cái gì đó nằm ngoài phần tử.
Nắng

Câu trả lời:


251

Có bạn có thể! Chỉ cần thử nghiệm điều này và nó hoạt động tuyệt vời, điều này là tuyệt vời! Nó vẫn không hoạt động với html, nhưng nó không hoạt động với svg.

Trong chỉ mục của tôi.html tôi có:

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

Và test.svg của tôi trông như thế này:

<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
Trừ khi các SVG là đặc biệt, bạn sẽ có thể đối xử với chúng giống như hình ảnh của bạn : content: url(path/to/my.svg). Điều đó không nhất thiết có nghĩa là nó sẽ hoạt động với thư viện công cụ UI UI.
cimmanon

1
@cimmanon hmm, thật ngọt ngào, tôi muốn kiểm tra điều đó. Vì vậy, trong my.html hoặc bất cứ điều gì tôi có thể có một loạt mã html để hiển thị ... nghe thật tuyệt vời.
dezman

2
Tại sao bạn muốn làm điều này? Nếu bạn đã có mã svg trong tệp rồi, thì không cần phải đặt nó trong một lớp giả. Toàn bộ quan điểm của các lớp giả là giảm các phần tử DOM khi bạn muốn thêm một chút nội dung, nhưng trong trường hợp của bạn nếu bạn chỉ sử dụng mã svg của mình thì sẽ không tệ hơn (và có thể sạch hơn) so với đặt nó vào giả -Lớp (điều này cũng có thể là không thể). Tất nhiên trừ khi bạn muốn đặt mã svg của mình vào một loạt các vị trí, trong trường hợp đó bạn chỉ nên giữ mã svg của mình trong một tệp riêng như hình ảnh.
dezman

6
thật không may, tôi không tin rằng giải pháp này hoạt động với các họa tiết SVG. ví dụ, content: url(mysprite.svg#my-icon)sẽ không thực sự kéo biểu tượng của bạn lên. Tuy nhiên, tôi rất muốn được chứng minh là sai :)
Jason

1
@watson, ngữ nghĩa. HTML = cấu trúc, CSS = trình bày. Nếu một SVG là trang trí thì nó không nên có trong cấu trúc HTML, nó phải ở dạng CSS.
deathlock

137

Đúng. Bạn có thể thêm SVG làm hình nền của một sản phẩm nào: sau hoặc: trước. Ở đây bạn đi:

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

4
Tôi tìm thấy một trong những giải pháp tốt nhất, sau khi tìm kiếm một lúc. Bạn có thể kiểm soát mọi khía cạnh của phần tử được chèn và hoạt động theo cách thông thường của các biểu định kiểu CSS hoạt động, với logic riêng biệt. Tuyệt vời
Danielo515

... ahh điều này đã hy vọng của tôi, cho đến khi tôi nhận ra rằng điều đó background-sizekhông được hỗ trợ trong Opera Mini. Điều này thật là bực bội.
deathlock

Làm việc tuyệt vời. @deathlock, kích thước nền không cần thiết vì bạn đang xác định kích thước trong chính Svg, tôi không cần nó.
Eric Soyke

1
Phải là câu trả lời được chấp nhận vì câu hỏi có nội dung "trong phần tử giả: trước hoặc: sau"
ZalemCitizen

Tôi đã phải thêm <?xml version="1.0" encoding="utf-8"?>vào đầu tập tin svg của tôi để làm cho nó hoạt động.
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;
}

đảm bảo rằng Svg của bạn không chứa dấu ngoặc kép và mã hóa bất kỳ ký hiệu # nào.


8
Vì các SVG thường sử dụng dấu ngoặc kép, bạn cũng có thể chỉ sử dụng dấu ngoặc đơn bên ngoài. Đề xuất của @ Jenny là một cách tuyệt vời để làm điều đó nếu bạn không muốn sử dụng tệp SVG bên ngoài.
Kính hiển vi

2
Điều đó thật tuyệt. Thật không may, nó chỉ hoạt động với Chrome đối với tôi (đã thử nghiệm trên Chrome, Firefox và Edge).
Asen

2
OK nó hoạt động trên FF. Chỉ cần chú ý đến phần "không #". Ngoài ra, hãy đảm bảo sử dụng thẻ div (dường như không hoạt động với span). Đáng buồn là vẫn không có thành công cho Edge.
Asen

Giống như rất nhiều giải pháp tuyệt vời, nó không được IE11 hỗ trợ. url('file.svg')công trình tuy nhiên.
Bob Stein

6
Điều tôi thấy quan trọng là thêm xmlns='http://www.w3.org/2000/svg'phần <svg> để hoạt động trong Chrome 66.x. Ví dụ: chevron nhỏ sẽ là: 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

Việc sử dụng các CSS CSS và uri dữ liệu mang lại nhiều lợi ích thú vị hơn như tải nhanh và ít yêu cầu hơn VÀ chúng tôi nhận được hỗ trợ IE8 bằng cách sử dụng image / base64:

Mẫu Codepen sử dụng 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;
}

Đối với IE8, thay đổi thành:

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

Nhưng điều này không thể mở rộng, phải không? Tôi không thể thay đổi kích thước thành 16px hoặc 320px tùy ý.
deathlock

@deathlock Tất nhiên nó chia tỷ lệ, mặc dù không phải mẫu của tôi vì nó có bộ kích thước cố định, rộng / cao 80px.
Ason

1
@deathlock Tôi có thể hỏi bạn có bị hạ cấp không vì mẫu trên không có tỷ lệ?
Ason

Làm thế nào bạn sẽ làm cho nó quy mô? Và không, tôi đã không.
deathlock

@deathlock Cảm ơn, và đây là một cách để chia tỷ lệ svg: jsfiddle.net/ess6ywce ... bằng cách sử dụng phần trăm. Ngoài ra, tìm kiếm SO với scale svgvà bạn sẽ tìm thấy nhiều cách khác
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>

Công cụ thuận tiện cho bộ mã hóa url mã hóa SVG


5

Hãy cẩn thận tất cả các câu trả lời khác có một số vấn đề trong IE.

Hãy có tình huống này - nút có biểu tượng được chuẩn bị trước. Tất cả các trình duyệt xử lý chính xác điều này, nhưng IE lấy chiều rộng của phần tử và chia tỷ lệ trước nội dung để phù hợp với nó. Câu đố

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

Giải pháp là đặt kích thước thành trước phần tử và để nguyên vị trí:

#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
}

Các giải pháp background-image+ background-sizecũng hoạt động tốt, nhưng hơi khó hiểu, vì bạn phải chỉ định cùng kích thước hai lần.

Kết quả trong IE11:

Kết xuất IE


5

Để mở rộng hơn nữa chủ đề này. Trong trường hợp bạn muốn thêm Font Awesome 5 các biểu tượng bạn cần thêm một số CSS bổ sung.

Các biểu tượng theo mặc định có các lớp svg-inline--fafa-w-* .

Ngoài ra còn có các lớp sửa đổi như fa-lg, fa-rotate-*và khác. Bạn cần kiểm trasvg-with-js.css tệp và tìm CSS thích hợp cho việc đó.

Bạn cần thêm màu sắc của riêng bạn để icon css nếu không nó sẽ có màu đen theo mặc định, ví dụ fill='%23f00'nơi %23được mã hóa #.

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
Bạn nên giải thích thêm một chút câu trả lời của bạn. Chỉ từ điều này, thật khó để nói làm thế nào hoặc tại sao câu trả lời của bạn hoạt động.
ifconfig
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.