Sahte bir öğede SVG'yi içerik olarak kullanmanın bir yolu var mı: before veya: after


246

Bazı SVG görüntülerini seçilen öğelerin önüne yerleştirmek istiyorum. Ben jQuery kullanıyorum ama bu ilgisiz.

:beforeÖğe gibi olmak istiyorum :

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

Yukarıda gösterildiği gibi yaparsam, sadece dize görüntüler. Teknik özellikleri kontrol ettim ve içeriğin ne olabileceğine dair bazı kısıtlamalar var gibi görünüyor. Bu kısıtlamaya bir çözüm var mı? Sorumla yalnızca içerik css alakalı.


1
Arka plan resmi olarak kullanmayla ilgili bir sorun mu var?
cimmanon

1
JQuery UI araç ipuçlarına süslü işaretçiler oluşturmak için kullanmak istiyorum. Bunu şimdi CSS sözde elemanları kesmekle yapıyorum ama bu bana sadece üçgenler veriyor. Öğenin dışına çıkan bir şeye ihtiyacım olduğu için arka plan görüntüsü bu durumda çalışmaz.
Güneşli

Yanıtlar:


252

Evet yapabilirsin! Sadece bunu test ve harika çalışıyor, bu harika! Hala html ile çalışmıyor, ancak svg ile çalışıyor.

Benim index.html benim var:

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

Ve benim test.svg şöyle görünüyor:

<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
SVG lezyonu özeldir sürece, bir görüntü olduğu gibi hepsine aynı tedavi etmek gerekir: content: url(path/to/my.svg). Bu, jQuery UI araç ipuçları kitaplığıyla çalışacağı anlamına gelmez.
cimmanon

1
@cimmanon hmm, bu tatlı, bunu test etmek istiyorum. Yani my.html veya html kodu oluşturmak için bir demet olabilir ne olursa olsun ... kulağa harika geliyor.
dezman

2
Bunu neden yapmak istiyorsun? Dosyada svg kodu zaten varsa, sözde sınıfa yerleştirmenize gerek yoktur. Sözde sınıfların tüm amacı, biraz içerik eklemek istediğinizde DOM öğelerini azaltmaktır, ancak sizin durumunuzda svg kodunuzu normal olarak kullanırsanız, sözde kod koymaktan daha kötü (ve muhtemelen daha temiz) olmayacaktır. -sınıf (muhtemelen imkansızdır). Elbette svg kodunuzu bir sürü yere koymak istemiyorsanız, bu durumda svg kodunuzu görüntü gibi ayrı bir dosyada tutmanız gerekir.
dezman

6
ne yazık ki, bu çözümün SVG spritelarıyla çalıştığına inanmıyorum. örneğin, content: url(mysprite.svg#my-icon)simgenizi kaldırmaz. Ancak, kanıtlanmış olmak isterdim :)
Jason

1
@watson, anlamsal. HTML = yapı, CSS = sunum. Bir SVG dekoratifse, HTML yapısında olmamalı, CSS'de olmalıdır.
deathlock

137

Evet. SVG'yi boş: after veya: before öğesinin arka plan görüntüsü olarak ekleyebilirsiniz. Hadi bakalım:

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

4
Bir süre aradıktan sonra bunu en iyi çözümlerden birini buluyorum. Eklenen öğenin her bir yönünü denetleyebilir ve ayrılmış mantıkla CSS stil sayfalarının normal şekilde çalışmasını sağlayabilirsiniz. Büyük
Danielo515

... ahh background-size, Opera Mini'de desteklenmediğini anlayana kadar bu umutlarımı artırdı . Bu çok sinir bozucu.
deathlock

Harika çalıştı. @deathlock, svg'nin kendi boyutlarını tanımladığınız için arka plan boyutuna gerek yok, buna ihtiyacım yoktu.
Eric Soyke

1
"Sahte bir öğede: önce veya: sonra" sorusunun yanıtlanmasından bu yana kabul edilen cevaplar olmalıdır
ZalemCitizen

<?xml version="1.0" encoding="utf-8"?>Çalışması için svg dosyamın başına eklemek zorunda kaldım .
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'nizin çift tırnak içermediğinden emin olun ve # sembollerini uriencode edin.


8
SVG'ler genellikle çift tırnak kullandığından, yalnızca dış tek tırnakları da kullanabilirsiniz. @ Jenny'nin önerisi, harici bir SVG dosyası kullanmak istemiyorsanız bunu yapmanın harika bir yoludur.
Micros

2
Bu harika. Ne yazık ki sadece benim için Chrome ile çalışıyor (Chrome, Firefox ve Edge'de test edildi).
Arsen

2
Tamam FF üzerinde çalışıyor. Sadece "no #" kısmına dikkat etmek gerekiyordu. Ayrıca div etiketini kullandığınızdan emin olun (span ile çalışmıyor gibi görünüyor). Ne yazık ki Edge için hala başarı yok.
Arsen

Pek çok parlak çözüm gibi, IE11 tarafından desteklenmiyor. url('file.svg')ancak çalışır.
Bob Stein

6
Önemli bulduğum şey xmlns='http://www.w3.org/2000/svg', Chrome 66.x'te çalışmak için <svg> bölümüne eklemektir. Örneğin - küçük 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>");
sembol

28

CSS sprite ve data uri kullanmak hızlı yükleme ve daha az istek gibi ekstra ilginç faydalar sağlar ve image / base64 kullanarak IE8 desteği alırız:

SVG kullanarak kodlama örneği

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 için şunu değiştirin:

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

Ama bu ölçeklenebilir değil, değil mi? İsterseniz 16px veya 320px olarak yeniden boyutlandıramıyorum.
deathlock

@deathlock Tabii ki ölçekleniyor, örneğim olmasa da 80px genişliğinde / yüksekliğinde sabit bir boyut kümesine sahip.
Ason

1
@deathlock Yukarıdaki örnek ölçeklenmediğinden aşağı indirip beğenmediğinizi sorabilir miyim?
Ason

nasıl ölçeklendirirsin? Ve hayır, yapmadım.
deathlock

@deathlock Teşekkürler, ve burada svg ölçeklemek için bir yol var: jsfiddle.net/ess6ywce ... yüzde kullanarak. Ayrıca, SO ile arama yapın scale svgve daha birçok yol bulacaksınız
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>

SVG kodlama url kodlayıcı için kullanışlı araç


5

Diğer cevapların IE'de bazı problemleri olduğuna dikkat edin.

Bu duruma sahip olalım - simgesinin üstünde simge var. Tüm tarayıcılar bunu doğru şekilde yapar, ancak IE öğenin genişliğini alır ve önceki içeriği ona uyacak şekilde ölçeklendirir. JSFiddle

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

Çözüm, boyutu öğeden önce olarak ayarlamak ve olduğu yerde bırakmaktır:

#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Çözümleri de çalışır, ancak iki kez aynı boyutlarda belirtmek zorunda olduğundan, küçük kullanışsız olduğunu.

IE11'de sonuç:

IE oluşturma


5

Bu konuyu daha da genişletmek için. Font Awesome 5 simgeleri eklemek isterseniz, fazladan CSS eklemeniz gerekir.

Varsayılan olarak simgeler sınıflara sahiptir svg-inline--fave fa-w-*.

Ayrıca fa-lg, fa-rotate-*ve diğerleri gibi değiştirici sınıflar da vardır . svg-with-js.cssDosyayı kontrol etmeniz ve bunun için uygun CSS'yi bulmanız gerekir .

Css simgesine kendi renginizi eklemeniz gerekir, aksi takdirde varsayılan olarak siyah olur, örneğin fill='%23f00'nerede %23kodlanır #.

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
Cevabınızı biraz daha açıklamanız gerekir. Sadece bundan, cevabınızın nasıl veya neden çalıştığını söylemek gerçekten zor.
ifconfig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.