Bisakah saya mengubah ketinggian gambar di CSS: sebelum /: setelah elemen semu?


251

Misalkan saya ingin menghias tautan ke jenis file tertentu menggunakan gambar. Saya dapat mendeklarasikan tautan saya sebagai

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

kemudian punya CSS like

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

Sekarang, ini berfungsi dengan baik, kecuali jika pdf.pngbukan ukuran yang tepat untuk teks tautan saya.

Saya ingin dapat memberitahu browser untuk skala :aftergambar, tetapi saya tidak bisa seumur hidup saya menemukan sintaks yang tepat. Atau apakah ini seperti gambar latar belakang, di mana pengubahan ukuran saja tidak dimungkinkan?

ETA: Saya condong ke arah a) mengubah ukuran gambar sumber menjadi ukuran "benar", sisi server dan / atau b) mengubah markup untuk sekadar memasok inline tag IMG. Saya mencoba menghindari kedua hal itu tetapi kedengarannya mereka akan lebih kompatibel daripada mencoba melakukan hal-hal murni dengan CSS. Jawaban untuk pertanyaan asli saya tampaknya menjadi "Anda dapat mengurutkan dari melakukannya, kadang-kadang".


1
Apakah ada alasan kuat bahwa Anda tidak menggunakan tag 'img' dengan tag 'a' melilitnya? Itu sintaksis yang lebih khas untuk gambar yang juga merupakan tautan. Saya mengatakan ini karena meskipun Anda menggunakan metode Anda, Anda mungkin membingungkan pengembang lain. CSS juga memiliki reputasi yang kuat untuk ketidaksesuaian antar browser / versi.
Servy

4
Saya menghargai masalah ini, hanya saja saya tidak perlu mengendalikan generasi markup - dalam hal ini saya hanya dapat mengubah gaya, bukan menyusun ulang.
Coderer

Jawaban:


375

Menyesuaikan background-sizediizinkan. Anda masih harus menentukan lebar dan tinggi blok.

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

Lihat Tabel Kompatibilitas lengkap di MDN .


3
Ini bagus kecuali bahwa sebagian besar klien kami menggunakan IE 7 atau 8 (omong kosong perusahaan, maaf).
Coderer

14
Jika itu masalahnya, Anda seharusnya tidak menggunakan :aftersama sekali. Itu tidak didukung di bawah IE8.
Ansel Santosa

24
Teknik ini juga membutuhkan pengaturan width: 10px; height: 20px;untuk melihat gambar.
sini

5
Untuk dicatat juga bahwa ini memang berfungsi, tetapi hanya dengan background-imageproperti spesifik , yang sederhana backgroundtidak akan berfungsi.
Gruber

4
(Untuk :before) saya juga perlu position: absolute, dan left: -10px.
Hugo

95

Perhatikan bahwa :afterelemen pseudo adalah kotak, yang pada gilirannya berisi gambar yang dihasilkan. Tidak ada cara untuk menata gambar, tetapi Anda bisa menata kotak.

Berikut ini hanyalah sebuah ide, dan solusi di atas lebih praktis.

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

http://jsfiddle.net/Nwupm/

Kelemahan: Anda perlu tahu dimensi intrinsik dari gambar, dan ia meninggalkan Anda dengan spasi putih, yang saya tidak bisa hilangkan dari ATM.


6
zoom: 0,5 juga patut dipertimbangkan.
Alex

Saya suka ide solusi ini, tapi itu membuang posisi, khususnya dalam skenario inline-block. (IE 11)
Christopher Davies

1
zoom tidak didukung dengan baik.

1
jsfiddle tidak mengubah ukuran. Saya menggunakan Firefox terbaru. Saya juga mencoba contoh jsfiddle terakhir dalam posting ini menggunakan zoom, dan tidak berhasil juga.
Ryan

1
Hanya sebuah catatan: dalam kasus saya, saya harus meletakkan position: absoluteuntuk mendapatkan transform: scale(0.5)untuk benar-benar bekerja. Saya juga harus memasukkan position: relativeelemen "induk" (pemilik :afterpseudo) untuk kewarasan. Juga, saya harus menambahkan translate(-16px, -16px)transformasi saya ke posisi ikon 16x16 dengan benar. Ini position: absolutejuga memiliki manfaat menghilangkan masalah spasi putih.
Braden Best

34

Karena jawaban saya yang lain jelas tidak dipahami dengan baik, inilah upaya kedua:

Ada dua pendekatan untuk menjawab pertanyaan itu.

Praktis (cukup tunjukkan gambarnya!)

Lupakan :afterpemilih-semu, dan pergi untuk sesuatu seperti

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

Teoretis

Pertanyaannya adalah: Dapatkah Anda menata konten yang dihasilkan ? Jawabannya adalah: Tidak, Anda tidak bisa. Sudah ada diskusi panjang di milis W3C tentang masalah ini, tetapi sejauh ini tidak ada solusi.

Konten yang dihasilkan dirender ke dalam kotak yang dibuat, dan Anda bisa menata kotak itu, tetapi bukan konten seperti itu . Browser yang berbeda menunjukkan perilaku yang sangat berbeda

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

Chrome mengubah ukuran yang pertama, tetapi menggunakan dimensi intrinsik gambar untuk yang kedua

firefox dan ie tidak mendukung yang pertama, dan menggunakan dimensi intrinsik untuk yang kedua

opera menggunakan dimensi intrinsik untuk kedua kasus

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

Demikian pula, browser menunjukkan hasil yang sangat berbeda pada hal-hal seperti http://jsfiddle.net/Nwupm/1/ , di mana lebih dari satu elemen dihasilkan. Perlu diingat bahwa CSS3 masih dalam tahap pengembangan awal, dan masalah ini belum diselesaikan.


1
@TJ Setiap jawaban terpisah layak mendapat jawaban (Jika itu tidak cukup jelas), yang akan mendapatkan jumlah upvotes yang berbeda dan akan dilihat / dikutip / dibagikan secara berbeda berdasarkan pada isi jawaban.
Timo Huovinen

13

Anda harus menggunakan latar belakang alih-alih gambar.

.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; tidak memiliki efek apa pun

positionin juga bekerja sangat aneh sesuai dengan fondasi frontend, jadi berhati-hatilah

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

4

Berikut ini adalah solusi lain (yang berfungsi): sesuaikan ukuran gambar Anda dengan ukuran yang Anda inginkan :)

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

Anda perlu pdf.png menjadi 20px * 10px agar ini berfungsi. 20px / 10px dalam css ada di sini untuk memberikan ukuran blok sehingga elemen-elemen yang datang setelah blok tidak semuanya kacau dengan gambar

Jangan lupa menyimpan salinan gambar mentah dalam ukuran aslinya


Ini lelucon panggilan !!
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

Anda bisa menggunakan zoomproperti. Periksa jsfiddle ini


1
Memeriksa jsfiddle, keduanya berukuran sama dan zoom disorot dengan warna merah.
Ryan

Itu tidak mengubah ukuran di Firefox 53 saat ini. Semoga ini bisa diterapkan di versi Firefox yang lebih baru. Senang mengetahui bahwa ini berfungsi setidaknya di Chrome. :-)
Ryan

2

Anda dapat mengubah tinggi atau lebar elemen Sebelum atau Setelah seperti ini:

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

1

Saya menggunakan lebar kendali ukuran font ini

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

1

Saat ini dengan flexbox Anda dapat sangat menyederhanakan kode Anda dan hanya menyesuaikan 1 parameter sesuai kebutuhan:

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

Sekarang Anda hanya dapat menyesuaikan lebar elemen dan ketinggian akan secara otomatis menyesuaikan, menambah / mengurangi lebar hingga ketinggian elemen berada pada angka yang Anda butuhkan.


1
Tidak berfungsi untuk saya, mungkin karena gambarnya svg, mungkin karena induknya adalah wadah fleksibel.
Miguel Pynto

tidak pada jpg baikurl(//placeimg.com/800/200/arch)
BananaAcid

0
content: "";
background-image: url("yourimage.jpg");
background-size: 30px, 30px;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.