CSS'deki bir görüntünün yüksekliğini değiştirebilir miyim: sahte elemanlardan önce /: sonra?


251

Bir görüntü kullanarak belirli dosya türlerine bağlantıları süslemek istediğimi varsayalım. Bağlantılarımı şu şekilde beyan edebilirim:

<a href='foo.pdf' class='pdflink'>A File!</a>

sonra CSS gibi

.pdflink:after { content: url('/images/pdf.png') }

pdf.pngBağlantı metnim için doğru boyutta değilse , şimdi bu harika çalışıyor .

Tarayıcıya :afterresmi ölçeklendirmesini söyleyebilmek istiyorum , ancak hayatım boyunca doğru sözdizimini bulamıyorum. Yoksa yeniden boyutlandırmanın mümkün olmadığı arka plan resimleri gibi mi?

ETA: a) kaynak görüntüyü "doğru" boyut, sunucu tarafı ve / veya b) olarak yeniden boyutlandırıyorum. Her iki şeyden de kaçınmaya çalışıyordum ama sadece CSS ile bir şeyler yapmaya çalışmaktan daha uyumlu olacak gibi görünüyorlar. Benim asıl soruya cevabı "yapabilirsiniz gibi görünüyor arasında sıralamak bazen bunu".


1
'İmg' etiketlerini 'a' etiketlerinin etrafına sarılmış olarak kullanmamanızın zorlayıcı bir nedeni var mı? Bu, aynı zamanda bir bağlantı olan bir resim için daha tipik bir sözdizimidir. Bunu söylüyorum çünkü metodunuzu çalıştırsanız bile, diğer geliştiricileri karıştırıyor olabilirsiniz. CSS ayrıca tarayıcılar / sürümler arasındaki tutarsızlık konusunda da güçlü bir üne sahiptir.
12'de

4
Sorunu takdir ediyorum, sadece işaretleme üretimini kontrol etmem gerekmiyor - bu durumda sadece yeniden şekillendirebilirim, yeniden yapılandıramam.
Kodlayıcı

Yanıtlar:


375

Ayarlanmasına background-sizeizin verilir. Ancak yine de bloğun genişliğini ve yüksekliğini belirtmeniz gerekir.

.pdflink:after {
    background-image: url('/images/pdf.png');
    background-size: 10px 20px;
    display: inline-block;
    width: 10px; 
    height: 20px;
    content:"";
}

MDN'deki Uyumluluk Tablosunun tamamına bakın .


3
Müşterilerimizin çoğunun IE 7 veya 8'de (kurumsal saçmalık, üzgünüm) olması dışında bu harika.
Kodlayıcı

14
Eğer durum buysa, hiç kullanmamalısınız :after. IE8'in altında desteklenmez.
Ansel Santosa

24
Bu teknik ayrıca width: 10px; height: 20px;görüntüyü görmek için ayar gerektiriyordu .
burada

5
Bu gerçekten işe yarıyor, ancak sadece belirli bir background-imageözellik ile, basit backgroundişe yaramaz unutmayın.
Gruber

4
(İçin :before) Ayrıca gerekli position: absoluteve left: -10px.
Hugo

95

:afterSözde öğenin, oluşturulan görüntüyü içeren bir kutu olduğunu unutmayın . Görüntüyü biçimlendirmenin bir yolu yoktur, ancak kutuyu biçimlendirebilirsiniz.

Aşağıdaki sadece bir fikirdir ve yukarıdaki çözüm daha pratiktir.

.pdflink:after {
    content: url('/images/pdf.png');
    transform: scale(.5);
}

http://jsfiddle.net/Nwupm/

Dezavantajları: görüntünün gerçek boyutlarını bilmeniz gerekir ve ATM'den kurtulamadığım bazı boşluklar bırakır.


7
zoom: 0,5 da dikkate değer.
Alex

Ben bu çözüm fikrini seviyorum, ama bir satır içi senaryo, esp konumlandırma atar. (IE 11)
Christopher Davies

1
zoom iyi desteklenmiyor.

1
jsfiddle boyutunu değiştirmiyor. En yeni Firefox'u kullanıyorum. Ayrıca zoom kullanarak bu yazıdaki son jsfiddle örneğini denedim ve o da çalışmıyor.
Ryan

1
Sadece bir not: Benim durumumda, gerçekten işe position: absolutebaşlamak için koymak zorunda kaldım transform: scale(0.5). Ayrıca akıl sağlığı position: relativeiçin "ebeveyn" elementi ( :aftersözde sahibi ) koymak zorunda kaldı . Ayrıca, translate(-16px, -16px)16x16 simgesini doğru bir şekilde konumlandırmak için dönüşümüme eklemek zorunda kaldım. Aynı position: absolutezamanda boşluk problemini ortadan kaldırma avantajına da sahiptir.
Braden Best

34

Diğer cevabım açıkça anlaşılmadığından, ikinci bir girişim:

Soruyu cevaplamak için iki yaklaşım var.

Pratik (sadece bana lanet olası resmi göster!)

:afterYalancı seçiciyi unut ve benzeri bir şeye git

.pdflink {
    min-height: 20px;
    padding-right: 10px;
    background-position: right bottom;
    background-size: 10px 20px;
    background-repeat: no-repeat;
}

Teorik

Soru şudur: Oluşturulan içeriği biçimlendirebilir misiniz ? Cevap: Hayır, yapamazsınız. Orada bir oldu W3C posta listesinde uzun tartışma bu konuda, ama hiçbir çözüm bugüne kadar.

Oluşturulan içerik, oluşturulan bir kutuya dönüştürülür ve bu kutuya stil uygulayabilirsiniz, ancak içeriği bu şekilde yapamazsınız . Farklı tarayıcılar çok farklı davranışlar gösterir

#foo         {content: url("bar.jpg"); width: 42px; height:42px;}  
#foo::before {content: url("bar.jpg"); width: 42px; height:42px;}

Chrome birincisini yeniden boyutlandırır, ancak ikincisi için resmin gerçek boyutlarını kullanır

firefox ve yani birincisini desteklemeyin ve ikincisi için iç boyutları kullanın

opera her iki durum için de içsel boyutlar kullanır

( http://lists.w3.org/Archives/Public/www-style/2011Nov/0451.html adresinden )

Benzer şekilde, tarayıcılar , birden fazla öğenin oluşturulduğu http://jsfiddle.net/Nwupm/1/ gibi şeylerde çok farklı sonuçlar gösterir . CSS3'ün hala erken gelişme aşamasında olduğunu ve bu sorunun henüz çözülmediğini unutmayın.


1
@TJ Her ayrı cevap, farklı miktarlarda upvotes alacak ve cevabın içeriğine göre farklı şekilde görülebilecek / alıntılanacak / paylaşılacak bir cevabı (yeterince açık değilse) hak ediyor.
Timo Huovinen

13

Görüntü yerine arka plan kullanmalısınız.

.pdflink:after {
  content: "";
  background-image:url(your-image-url.png);
  background-size: 100% 100%;
  display: inline-block;

  /*size of your image*/
  height: 25px;
  width:25px;

  /*if you want to change the position you can use margins or:*/
  position:relative;
  top:5px;

}

6

diplay: block; herhangi bir etkisi yok

positionin ayrıca temelleri ön plana göre çok garip çalışır, bu yüzden dikkatli olun

body:before{ 
    content:url(https://i.imgur.com/LJvMTyw.png);
    transform: scale(.3);
    position: fixed;
    left: 50%;
    top: -6%;
    background: white;
}

4

İşte başka (çalışan) bir çözüm: resimlerinizi istediğiniz boyuta getirin :)

.pdflink:after {
    display: block;
    width: 20px;
    height: 10px;
    content:url('/images/pdf.png');
}

Bunun çalışması için pdf.png dosyasının 20px * 10px olması gerekir. Css'deki 20px / 10px, bloğun boyutunu vermek için buradadır, böylece bloktan sonra gelen öğelerin tümü görüntüyle karıştırılmaz

Ham görüntünün bir kopyasını orijinal boyutunda tutmayı unutmayın


Bu çağrı şakalar !!
MD Ashik

3
.pdflink:after {
    background-image: url('/images/pdf.png');
    background-size: 10px 20px;
    width: 10px; 
    height: 20px;
    padding-left: 10px;// equal to width of image.
    margin-left:5px;// to add some space for better look
    content:"";
}

2

zoomÖzelliği kullanabilirsiniz . Bu jsfiddle'ı kontrol edin


1
Jsfiddle'ı kontrol ederken, her ikisi de aynı boyuttadır ve zoom kırmızı renkte vurgulanır.
Ryan

Şu anda Firefox 53'te yeniden boyutlandırılmıyor. Umarım, bu Firefox'un sonraki bir sürümünde uygulanabilir. En azından Chrome'da çalıştığını bilmek güzel. :-)
Ryan

2

Önce veya Sonra öğesinin yüksekliğini veya genişliğini şu şekilde değiştirebilirsiniz :

.element:after {
  display: block;
  content: url('your-image.png');
  height: 50px; //add any value you need for height or width
  width: 50px;
}

1

Bu yazı tipi boyutu kontrol genişliğini kullandım

.home_footer1::after {
color: transparent;
background-image: url('images/icon-mail.png');      
background-size: 100%;      
content: ".......................................";
font-size: 30pt;
}

1

Günümüzde flexbox ile kodunuzu büyük ölçüde basitleştirebilir ve yalnızca 1 parametreyi gerektiği gibi ayarlayabilirsiniz:

.pdflink:after {
    content: url('/images/pdf.png');
    display: inline-flex;
    width: 10px;
}

Şimdi elemanın genişliğini ayarlayabilirsiniz ve yükseklik elemanın yüksekliği ihtiyacınız olan sayıya gelene kadar yüksekliği otomatik olarak ayarlayacak, genişliği artıracak / azaltacaktır.


1
Benim için işe yaramadı, belki görüntü svg olduğu için, belki de ebeveyn esnek bir kap olduğu için.
Miguel Pynto

ya bir jpg değilurl(//placeimg.com/800/200/arch)
BananaAcid

0
content: "";
background-image: url("yourimage.jpg");
background-size: 30px, 30px;
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.