Dengan PNG transparan yang menampilkan bentuk sederhana dalam warna putih, apakah mungkin mengubah warna ini melalui CSS? Semacam overlay atau apa yang tidak?
Anda dapat mengatur background-colorproperti CSS. Anda dapat membuat bagian non-transparan yang akan diperbaiki, dan bagian transparan dari gambar yang akan diisi oleh warna apa pun yang Anda suka melalui CSS. Itukah yang ingin Anda capai?
jakub.g
2
@ qbk, ini layak mendapat jawaban, bukan hanya komentar. Dan Anda mengalahkan saya 1 detik, secara teknis.
Kirill G
2
Anda dapat menggunakan elemen psuedo dengan mode blending untuk mewarnai ulang ikon apa pun yang 100% hitam atau 100% putih (latar belakang tetap transparan). Lihat jawaban saya di sini: stackoverflow.com/a/39796437/1472114
chrscblls
Jawaban:
570
Anda dapat menggunakan filter dengan -webkit-filterdan filter: Filter relatif baru untuk browser tetapi didukung di lebih dari 90% browser berdasarkan tabel CanIUse berikut: https://caniuse.com/#feat=css-filters
Anda dapat mengubah gambar menjadi skala abu-abu, sepia, dan banyak lagi (lihat contoh).
Jadi sekarang Anda dapat mengubah warna file PNG dengan filter.
@datatype_void Terkadang Anda sendiri tidak mengontrol gambar awal. Jadi, sepertinya Anda setuju bahwa poin saya valid, Anda tidak bisa mendapatkan warna apa pun mulai dari hitam atau putih. Oh, dan saya bermain lebih dari 5 menit untuk mencapai kesimpulan ini.
AsGoodAsItGets
5
juga menentukan bahwa Anda dapat melakukan hal-hal seperti ini: .gifcorrect{ filter: invert(28%) sepia(100%) hue-rotate(-180deg) saturate(3); }yang berarti Anda DAPAT beralih dari hitam & transparan atau abu-abu ke warna dan bekerja bahkan pada gif animasi
tatsu
141
Saya menemukan contoh codepen hebat ini bahwa Anda memasukkan nilai warna hex dan mengembalikan filter yang diperlukan untuk menerapkan warna ini ke png
Saya telah mengubah warna menjadi putih dari biru menggunakan kode ini:filter: invert(1%) sepia(1%) saturate(1%) hue-rotate(1deg) brightness(1000%) contrast(80%);
Anjan Biswas
Ini bagus !!
Thiago Pires
2
Penulis pantas mendapatkan patung! (perhatikan: kecerahan (0) saturate (100%) opsional opsional yang membunuh keraguan)
EDIT: Saya menggunakan Font-Awesome pada proyek terbaru saya. Anda bahkan dapat mem-bootstrapnya. Sederhananya di Anda <head>:
<linkhref="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css"rel="stylesheet"><!-- And if you want to support IE7, add this aswell --><linkhref="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome-ie7.min.css"rel="stylesheet">
Dan kemudian lanjutkan dan tambahkan beberapa tautan ikon seperti ini:
Font-Awesome menggunakan nama kelas yang berbeda di versi baru, mungkin karena ini membuat file CSS secara drastis lebih kecil, dan untuk menghindari kelas css yang ambigu. Jadi sekarang Anda harus menggunakan:
+1 untuk berpikir di luar kotak. Dan saat ini ada aplikasi online yang mudah digunakan untuk membantu Anda membuat webfont dari gambar (svg).
yvan vander sanden
Jika <a class="icon-thumbs-up"> </a> adalah nama kelas lama dan <a class="fa fa-thumbs-up"> </a> adalah yang baru, saya tidak berpikir itu membuat CSS lebih kecil, saya bisa melihat spasi tambahan antara fa dan fa-thumbs-up, tambahkan setidaknya 1 byte tambahan ke file CSS itu jika saya tidak salah?
Brandito
Font Awesome hebat di zamannya, sayangnya pemblokirannya membuat, yang membuat google dan penggunanya tidak senang. Kami pertama-tama mengatasi hal ini dengan menghapus font yang tidak terpakai dari CSS dan file font biner, mengurangi data sekitar setengahnya. Kami sekarang sedang dalam proses menghapus sama sekali dan mengganti dengan sprite sederhana, yang tidak memblokir render (proses DOM dan CSSOM lebih cepat, membuat elemen pada halaman tampak lebih cepat), dan akan mengurangi data sebesar 75%, hingga 6KB. FA sekitar 100KB. Topeng CSS dapat membantu dalam kasus kami, tetapi mungkin tidak perlu.
YK
25
Saya sudah bisa melakukan ini menggunakan filter SVG. Anda bisa menulis filter yang mengalikan warna gambar sumber dengan warna yang ingin Anda ubah. Dalam cuplikan kode di bawah ini, warna banjir adalah warna yang ingin kami ubah warna gambar menjadi (yang Merah dalam kasus ini.) FeComposite memberi tahu filter cara kami memproses warna. Rumus untuk feComposite dengan aritmatika adalah (k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4) di mana i1 dan i2 adalah warna input untuk in / in2 sesuai. Jadi hanya menentukan k1 = 1 berarti hanya akan melakukan i1 * i2, yang berarti mengalikan kedua warna input secara bersamaan.
Catatan: Ini hanya berfungsi dengan HTML5 karena ini menggunakan inline SVG. Tapi saya pikir Anda mungkin dapat membuat ini berfungsi dengan browser yang lebih lama dengan meletakkan SVG di file yang terpisah. Saya belum mencoba pendekatan itu.
Man Anda dirampok pada jawaban ini. Siapa pun yang ingin mewarnai gambar di luar filter: hue-rotate dapat melakukannya - ini adalah cara untuk melakukannya.
MaxPRafferty
23
Tag img memiliki properti latar belakang seperti yang lainnya. Jika Anda memiliki PNG putih dengan bentuk transparan, seperti stensil, maka Anda dapat melakukan ini:
Saya ingin bagian putih berwarna berbeda, bukan bagian transparan.
Wesley
2
solusi terbaik yang saya temukan sejauh ini. Sayang sekali itu hanya akan berfungsi jika Anda menggunakan warna latar belakang yang solid di situs web Anda
Jules Colle
8
@ Wesley Anda perlu membalikkan gambar itu (sehingga bit putih menjadi transparan dan sisanya putih) yang dapat Anda lakukan menggunakan editor gambar dan topeng favorit Anda.
Charles Goodwin
5
@CharlesGoodwin Itu hanya berfungsi maka gambar ditempatkan di latar belakang putih.
WebKit sekarang mendukung masker alpha di CSS. Masker memungkinkan Anda untuk overlay konten kotak dengan pola yang dapat digunakan untuk merobohkan bagian-bagian dari kotak itu di tampilan akhir. Dengan kata lain, Anda dapat klip ke bentuk kompleks berdasarkan alpha dari suatu gambar.
[...]
Kami telah memperkenalkan properti baru untuk memberikan banyak kontrol kepada desainer Web atas topeng ini dan bagaimana mereka diterapkan. Properti baru dianalogikan dengan properti gambar latar dan perbatasan yang sudah ada.
Apakah itu bagian dari standar (yang akan datang), karena saya tidak menemukan informasi apa pun yang tidak terkait dengan Webkit, atau apakah itu hanya rasa Apple? Tampaknya bahwa W3 adalah menyarankan SVG untuk usecases seperti: w3.org/TR/SVG/masking.html
feeela
3
Sayangnya ini tampaknya hanya webkit dan blog menipu dengan menggunakan gambar yang dikomposit daripada contoh yang sebenarnya. Jawaban ini sedikit herring merah.
Pertanyaannya adalah tentang mewarnai gambar putih dengan latar belakang transparan. hue-rotatetidak berfungsi pada warna putih.
Synetech
17
Pikirkan saya punya solusi untuk ini yaitu a) persis apa yang Anda cari 5 tahun yang lalu, dan b) sedikit lebih sederhana daripada opsi kode lainnya di sini.
Dengan png putih apa pun (mis., Ikon putih pada latar belakang transparan), Anda dapat menambahkan pemilih :: after ke warna ulang.
.icon {
background: url(img/icon.png);/* Your icon */
position: relative;/* Allows an absolute positioned psuedo element */}.icon::after{
position: absolute;/* Positions psuedo element relative to .icon */
width:100%;/* Same dimensions as .icon */
height:100%;
content:"";/* Allows psuedo element to show */
background:#EC008C; /* The color you want the icon to change to */
mix-blend-mode: multiply;/* Only apply color on top of white, use screen if icon is black */}
Saya memasang ulang gambar imgur, mengalami masalah saat memuatnya.
chrscblls
Di versi terbaru Chrome, sepertinya latar belakang (transparan) juga diatur ke warna. Dalam contoh yang ditautkan, ketika saya mengarahkan kursor, saya hanya melihat kotak merah muda buram ... Bekerja dengan baik di Firefox.
logidelic
1
@ chrscblls Tautannya sudah mati.
Steven Lu
15
Satu baris paling sederhana yang bekerja untuk saya:
filter: opacity(0.5) drop-shadow(000 blue);
Anda dapat mengatur opacity dari 0 ke 1 untuk membuat warna lebih terang atau lebih gelap.
Bagus. Ini menghindari semua batasan dari solusi lain di sini.
Gordon
3
ulangi drop-shadow 2-3 kali untuk membuatnya lebih kuat
djdance
1
SOLUSI GENIUS, terlihat sedikit berantakan di CSS, tetapi dengan komentar, itu bisa dimengerti. Terima kasih!
Richard KeMiKaL GeNeRaL Denton
tidak akan bekerja untuk mendapatkan warna yang tepat, selalu ada semacam campuran antara warna asli dan yang baru.
swisswiss
pendekatan ini sedikit mendistorsi gambar dan semakin buruk setiap kali drop-shadow diterapkan. Seperti membuat salinan salinan, hasilnya berbeda dari aslinya.
SMAG
8
Saya menemukan ini saat googling, saya menemukan yang terbaik bekerja untuk saya ...
Ini berhasil, saya memilih. Tetapi hanya untuk catatan itu memang memiliki beberapa masalah seperti tidak dapat ukuran gambar latar belakang, tidak dapat memposisikan gambar dan itu memang berulang.
Saya membutuhkan warna tertentu, jadi filter tidak berfungsi untuk saya.
Sebagai gantinya, saya membuat div, mengeksploitasi beberapa gambar latar belakang CSS dan fungsi linear-gradient (yang membuat gambar itu sendiri). Jika Anda menggunakan mode campuran overlay, gambar Anda yang sebenarnya akan dicampur dengan gambar "gradien" yang dihasilkan yang mengandung warna yang Anda inginkan (di sini, # BADA55)
Tidak bekerja untuk saya. Saya tidak tahu mengapa, saya menyalinnya dengan tepat
Vic Seedoubleyew
@VicSeedoubleyew snippet berfungsi dengan baik. Periksa div Anda menggunakan alat dev untuk memastikan CSS Anda benar-benar diterapkan. Juga, pastikan URL ke gambar Anda valid jika Anda tidak menggunakan yang saya berikan. EDIT: Jika snipet tidak berfungsi untuk Anda, Anda mungkin menggunakan browser yang kedaluwarsa atau tidak mendukung fungsi linear-gradient.
rolznz
5
Menjawab karena saya sedang mencari solusi untuk ini.
jawaban pena di @ chrscblls berfungsi dengan baik jika Anda memiliki latar belakang putih atau hitam, tetapi pena saya tidak. Juga, gambar dihasilkan dengan ng-repeat, jadi saya tidak bisa memiliki url mereka di css saya DAN Anda tidak bisa menggunakan :: after on img tag.
Jadi, saya mencari jalan keluar dan berpikir itu mungkin membantu orang jika mereka tersandung di sini.
Jadi apa yang saya lakukan hampir sama dengan tiga perbedaan utama:
url yang berada di tag img saya, saya letakkan (dan label) di div lain di mana :: after akan berfungsi.
'campur-campur-mode' diatur pada 'perbedaan' alih-alih 'multiply' atau 'layar'.
Saya menambahkan :: sebelum dengan nilai yang persis sama sehingga :: after akan melakukan 'perbedaan' dari 'perbedaan' yang dibuat oleh :: before dan membatalkannya sendiri.
Untuk mengubahnya dari hitam menjadi putih atau putih menjadi hitam, warna latar belakang harus putih. Dari hitam ke warna, Anda dapat memilih warna apa pun. Dari putih ke warna, Anda harus memilih warna yang berlawanan dari yang Anda inginkan.
Tidak perlu mengatur seluruh font jika Anda hanya membutuhkan satu ikon, ditambah lagi saya merasa itu lebih "bersih" sebagai elemen individu. Jadi, untuk tujuan ini, dalam HTML5 Anda dapat menempatkan SVG langsung di dalam aliran dokumen. Kemudian Anda dapat mendefinisikan kelas di stylesheet .CSS Anda dan mengakses warna latar belakangnya dengan fillproperti:
Perhatikan bahwa, dalam contoh, saya telah digunakan :hoveruntuk menggambarkan perilaku; jika Anda hanya ingin mengubah warna untuk keadaan "normal", Anda harus menghapus pseudoclass.
Untuk benar-benar mengubah warna, Anda bisa memasukkan transisi CSS dengan -webkit-filter di mana ketika sesuatu terjadi Anda akan memanggil -webkit-filter pilihan Anda. Sebagai contoh:
Ketika mengubah gambar dari hitam menjadi putih, atau putih menjadi hitam, filter hue rotate tidak berfungsi, karena hitam dan putih secara teknis bukan warna. Sebaliknya, perubahan warna hitam dan putih (dari hitam ke putih atau sebaliknya) harus dilakukan dengan properti filter invert.
background-color
properti CSS. Anda dapat membuat bagian non-transparan yang akan diperbaiki, dan bagian transparan dari gambar yang akan diisi oleh warna apa pun yang Anda suka melalui CSS. Itukah yang ingin Anda capai?Jawaban:
Anda dapat menggunakan filter dengan
-webkit-filter
danfilter
: Filter relatif baru untuk browser tetapi didukung di lebih dari 90% browser berdasarkan tabel CanIUse berikut: https://caniuse.com/#feat=css-filtersAnda dapat mengubah gambar menjadi skala abu-abu, sepia, dan banyak lagi (lihat contoh).
Jadi sekarang Anda dapat mengubah warna file PNG dengan filter.
Sumber
sumber
.gifcorrect{ filter: invert(28%) sepia(100%) hue-rotate(-180deg) saturate(3); }
yang berarti Anda DAPAT beralih dari hitam & transparan atau abu-abu ke warna dan bekerja bahkan pada gif animasiSaya menemukan contoh codepen hebat ini bahwa Anda memasukkan nilai warna hex dan mengembalikan filter yang diperlukan untuk menerapkan warna ini ke png
CSS filter generator untuk mengkonversi dari warna hitam ke warna hex target
misalnya saya perlu png saya untuk memiliki warna # 1a9790 berikut
maka Anda harus menerapkan filter berikut untuk Anda png
sumber
filter: invert(1%) sepia(1%) saturate(1%) hue-rotate(1deg) brightness(1000%) contrast(80%);
Anda mungkin ingin melihat font Icon. http://css-tricks.com/examples/IconFont/
EDIT: Saya menggunakan Font-Awesome pada proyek terbaru saya. Anda bahkan dapat mem-bootstrapnya. Sederhananya di Anda
<head>
:Dan kemudian lanjutkan dan tambahkan beberapa tautan ikon seperti ini:
Inilah lembar contekan lengkapnya
--edit--
Font-Awesome menggunakan nama kelas yang berbeda di versi baru, mungkin karena ini membuat file CSS secara drastis lebih kecil, dan untuk menghindari kelas css yang ambigu. Jadi sekarang Anda harus menggunakan:
EDIT 2:
Baru tahu github juga menggunakan font ikonnya sendiri: Octicons Gratis untuk diunduh. Mereka juga memiliki beberapa tips tentang cara membuat font ikon Anda sendiri .
sumber
Saya sudah bisa melakukan ini menggunakan filter SVG. Anda bisa menulis filter yang mengalikan warna gambar sumber dengan warna yang ingin Anda ubah. Dalam cuplikan kode di bawah ini, warna banjir adalah warna yang ingin kami ubah warna gambar menjadi (yang Merah dalam kasus ini.) FeComposite memberi tahu filter cara kami memproses warna. Rumus untuk feComposite dengan aritmatika adalah (k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4) di mana i1 dan i2 adalah warna input untuk in / in2 sesuai. Jadi hanya menentukan k1 = 1 berarti hanya akan melakukan i1 * i2, yang berarti mengalikan kedua warna input secara bersamaan.
Catatan: Ini hanya berfungsi dengan HTML5 karena ini menggunakan inline SVG. Tapi saya pikir Anda mungkin dapat membuat ini berfungsi dengan browser yang lebih lama dengan meletakkan SVG di file yang terpisah. Saya belum mencoba pendekatan itu.
Berikut cuplikannya:
sumber
Tag img memiliki properti latar belakang seperti yang lainnya. Jika Anda memiliki PNG putih dengan bentuk transparan, seperti stensil, maka Anda dapat melakukan ini:
sumber
Iya :)
sumber
Di sebagian besar browser , Anda dapat menggunakan filter:
pada
<img>
elemen dan gambar latar belakang elemen lainnyadan atur secara statis di CSS Anda, atau secara dinamis menggunakan JavaScript
Lihat demo di bawah ini.
<img>
elemenAnda bisa menerapkan teknik ini ke
<img>
elemen:Gambar latar belakang
Anda dapat menerapkan teknik ini pada gambar latar:
JavaScript
Anda dapat menggunakan JavaScript untuk menetapkan filter saat runtime:
sumber
hue-rotate
tidak berfungsi pada warna putih.Pikirkan saya punya solusi untuk ini yaitu a) persis apa yang Anda cari 5 tahun yang lalu, dan b) sedikit lebih sederhana daripada opsi kode lainnya di sini.
Dengan png putih apa pun (mis., Ikon putih pada latar belakang transparan), Anda dapat menambahkan pemilih :: after ke warna ulang.
Lihat codepen ini (menerapkan color swap on hover): http://codepen.io/chrscblls/pen/bwAXZO
sumber
Satu baris paling sederhana yang bekerja untuk saya:
Anda dapat mengatur opacity dari 0 ke 1 untuk membuat warna lebih terang atau lebih gelap.
sumber
Saya menemukan ini saat googling, saya menemukan yang terbaik bekerja untuk saya ...
HTML
CSS
http://jsfiddle.net/a63b0exm/
sumber
Saya membutuhkan warna tertentu, jadi filter tidak berfungsi untuk saya.
Sebagai gantinya, saya membuat div, mengeksploitasi beberapa gambar latar belakang CSS dan fungsi linear-gradient (yang membuat gambar itu sendiri). Jika Anda menggunakan mode campuran overlay, gambar Anda yang sebenarnya akan dicampur dengan gambar "gradien" yang dihasilkan yang mengandung warna yang Anda inginkan (di sini, # BADA55)
sumber
Menjawab karena saya sedang mencari solusi untuk ini.
jawaban pena di @ chrscblls berfungsi dengan baik jika Anda memiliki latar belakang putih atau hitam, tetapi pena saya tidak. Juga, gambar dihasilkan dengan ng-repeat, jadi saya tidak bisa memiliki url mereka di css saya DAN Anda tidak bisa menggunakan :: after on img tag.
Jadi, saya mencari jalan keluar dan berpikir itu mungkin membantu orang jika mereka tersandung di sini.
Jadi apa yang saya lakukan hampir sama dengan tiga perbedaan utama:
Untuk mengubahnya dari hitam menjadi putih atau putih menjadi hitam, warna latar belakang harus putih. Dari hitam ke warna, Anda dapat memilih warna apa pun. Dari putih ke warna, Anda harus memilih warna yang berlawanan dari yang Anda inginkan.
https://codepen.io/spaceplant/pen/oZyMYG
sumber
Tidak perlu mengatur seluruh font jika Anda hanya membutuhkan satu ikon, ditambah lagi saya merasa itu lebih "bersih" sebagai elemen individu. Jadi, untuk tujuan ini, dalam HTML5 Anda dapat menempatkan SVG langsung di dalam aliran dokumen. Kemudian Anda dapat mendefinisikan kelas di stylesheet .CSS Anda dan mengakses warna latar belakangnya dengan
fill
properti:Biola yang bekerja: http://jsfiddle.net/qmsj0ez1/
Perhatikan bahwa, dalam contoh, saya telah digunakan
:hover
untuk menggambarkan perilaku; jika Anda hanya ingin mengubah warna untuk keadaan "normal", Anda harus menghapus pseudoclass.sumber
Untuk benar-benar mengubah warna, Anda bisa memasukkan transisi CSS dengan -webkit-filter di mana ketika sesuatu terjadi Anda akan memanggil -webkit-filter pilihan Anda. Sebagai contoh:
sumber
Ketika mengubah gambar dari hitam menjadi putih, atau putih menjadi hitam, filter hue rotate tidak berfungsi, karena hitam dan putih secara teknis bukan warna. Sebaliknya, perubahan warna hitam dan putih (dari hitam ke putih atau sebaliknya) harus dilakukan dengan properti filter invert.
.img1 { filter: invert(100%); }
sumber
Sumber: https://codepen.io/taryaoui/pen/EKkcu
sumber