Есть ли способ раскрасить белое изображение PNG только с помощью CSS?
Я знаю, что есть много фильтров css, особенно для webkit, но я не могу найти решение для раскраски белого (#FFFFFF) изображения. Я пробовал некоторые комбинации фильтров, но ни один из них не делает мое изображение окрашенным. Я могу только изменить изображение в диапазоне оттенков серого или сепии.
Поэтому мой вопрос: есть ли способ изменить мой полностью белый png на (например) красный, используя только css?
Как показано на этом изображении:
Ответы
Ответ 1
Это можно сделать с помощью маскирования css, но, к сожалению, поддержка браузера очень плохая (я считаю, что веб-кит только).
http://jsfiddle.net/uw1mu81k/1/
-webkit-mask-box-image: url(http://yourimagehere);
Поскольку ваш образ полностью белый, он идеально подходит для маскировки. Способ работы маски заключается в том, что везде, где изображение белого цвета, исходный элемент отображается как обычно, где черный (или прозрачный) исходный элемент не отображается. Все, что посередине, имеет некоторый уровень прозрачности.
EDIT:
Вы также можете заставить это работать в FireFox с небольшой помощью svg
.
http://jsfiddle.net/uw1mu81k/4/
div {
width: 50px;
height: 50px;
mask: url(#mymask);
-webkit-mask-box-image: url(http://www.clker.com/cliparts/F/5/I/M/f/U/running-icon-white-on-transparent-background-md.png);
}
<div style="background-color: red;"></div>
<div style="background-color: blue;"></div>
<div style="background-color: green;"></div>
<div style="background-color: orange;"></div>
<div style="background-color: purple;"></div>
<svg height="0" width="0">
<mask id="mymask">
<image id="img" xlink:href="http://www.clker.com/cliparts/F/5/I/M/f/U/running-icon-white-on-transparent-background-md.png" x="0" y="0" height="50px" width="50px" />
</mask>
</svg>
Ответ 2
У меня недавно был такой же вопрос, и я думаю, что этот подход заслуживает внимания для будущих читателей. Попробуй это
filter: brightness(50%) sepia(100) saturate(100) hue-rotate(25deg);
Яркость будет затемнить изображение, сепия сделает его немного желтоватым, насыщенным, чтобы увеличить цвет, и, наконец, оттенок-поворот, чтобы изменить цвет. Это не перекрестный браузер, хотя:
-
Он не поддерживается в IE
-
На хроме, hue-rotate(25deg)
сделает любое изображение красным, но вам нужно отрицательное значение в firefox, например, с помощью hue-rotate(-25deg)
чтобы сделать его красным.
Вы можете использовать это для целевых браузеров mozilla: https://css-tricks.com/snippets/css/css-hacks-targeting-firefox/
Вот несколько полезных советов и инструментов, которые я использовал, когда я работаю с изображениями/значками с помощью css:
- Если у вас есть версия изображения svg, вы можете конвертировать их в значки шрифтов с помощью этого инструмента https://icomoon.io/. Чтобы изменить цвет, вам просто нужен
color:#f00;
точно так же, как шрифты. - Если вам нужно добиться этого эффекта для состояния зависания, используйте красное изображение с
filter: brightness(0) invert();
в состоянии NON-hover и filter: brightness(1);
на зависании. Hovever это все равно не будет работать на IE - Используйте лист спрайта. Вы можете создать себя с помощью инструмента редактирования изображений или использовать генераторы листов спрайтов, доступные в Интернете. Затем вы можете использовать SpriteCow для получения css для каждого суб-изображения вашего спрайта.
Ответ 3
Это можно сделать с помощью CSS-фильтра, который ссылается на SVG-фильтр (webkit browsers + firefox). Вот фильтр SVG.
<svg width="800px" height="600px">
<filter id="redden">
<feColorMatrix type="matrix" values="1 1 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0"/>
</filter>
<image filter="url(#redden)" width="190" height="400" preserveAspectRatio="xMinYMin slice" xlink:href="http://i.stack.imgur.com/e6MUC.jpg"/>
</svg>
Ответ 4
Я попытался покрасить свое изображение белого облака после ответа @zekkai, а затем создать генератор фильтра.
var slider_huerotate = document.getElementById("slider_huerotate");
var slider_brightness = document.getElementById("slider_brightness");
var slider_saturate = document.getElementById("slider_saturate");
var slider_sepia = document.getElementById("slider_sepia");
var output = document.getElementById("demo");
var cloud = document.getElementById('cloud');
let [brightness , sepia, saturate, huerotate] = ["100", "80", "100","360"];
var filtercolor = 'brightness\(${brightness}%\) sepia\(${sepia}\) saturate\(${saturate}\) hue-rotate\(${huerotate}deg\)'
output.innerHTML = filtercolor; // Display the default slider value
// Update the current slider value (each time you drag the slider handle)
slider_huerotate.oninput = function() {
huerotate = this.value;
var filtercolor = 'brightness\(${brightness}%\) sepia\(${sepia}\) saturate\(${saturate}\) hue-rotate\(${huerotate}deg\)'
cloud.style.filter = filtercolor;
output.innerHTML = filtercolor;
}
slider_brightness.oninput = function() {
brightness = this.value;
var filtercolor = 'brightness\(${brightness}%\) sepia\(${sepia}\) saturate\(${saturate}\) hue-rotate\(${huerotate}deg\)'
cloud.style.filter = filtercolor;
output.innerHTML = filtercolor;
}
slider_sepia.oninput = function() {
sepia = this.value;
var filtercolor = 'brightness\(${brightness}%\) sepia\(${sepia}\) saturate\(${saturate}\) hue-rotate\(${huerotate}deg\)'
cloud.style.filter = filtercolor;
output.innerHTML = filtercolor;
}
slider_saturate.oninput = function() {
saturate = this.value;
var filtercolor = 'brightness\(${brightness}%\) sepia\(${sepia}\) saturate\(${saturate}\) hue-rotate\(${huerotate}deg\)'
cloud.style.filter = filtercolor;
output.innerHTML = filtercolor;
}
.slider {
-webkit-appearance: none;
width: 350px;
height: 15px;
border-radius: 5px;
background: #d3d3d3;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 25px;
height: 25px;
border-radius: 50%;
background: #4CAF50;
cursor: pointer;
}
.slider::-moz-range-thumb {
width: 25px;
height: 25px;
border-radius: 50%;
background: #4CAF50;
cursor: pointer;
}
img{
width:300px;
z-index:100;
filter: brightness(100%) sepia(80) saturate(100) hue-rotate(360deg);
padding:70px 25px 50px 25px;
}
.wrapper{
width:600px;
height:500px;
padding:50px;
font-size:small;
}
.slidecontainer_vertical{
margin-top: 50px;
transform: translate(0,300px) rotate(270deg);
-moz-transform: rotate(270deg);
}
.left{
width:50px;
height:300px;
float:left;
}
.cloud{
width:100%;
}
.middle{
width:350px;
height:300px;
float:left;
margin:0 auto;
}
.right{
width:50px;
height:300px;
float:left;
}
#demo{
width:100%;
text-align:center;
padding-bottom:20px;
font-family: 'Handlee', cursive;
}
<head>
<link href="#" onclick="location.href='https://fonts.googleapis.com/css?family=Handlee'; return false;" rel="stylesheet">
</head>
<div class="wrapper">
<div class='left'>
<div class="slidecontainer_vertical">
<input type="range" min="0" max="360" value="360" class="slider" id="slider_huerotate">
</div></div>
<div class=middle>
<div class="slidecontainer">
<input type="range" min="0" max="100" value="100" class="slider" id="slider_brightness">
</div>
<div id='cloud'>
<img src="https://docs.google.com/drawings/d/e/2PACX-1vQ36u4x5L_01bszwckr2tAGS560HJtQz4qblj0jnvFUPSgyM9DAh7z_L3mmDdF6XRgu8FkTjqJKSNBQ/pub?w=416&h=288"></div>
<div id='demo'></div>
<div class="slidecontainer">
<input type="range" min="0" max="100" value="80" class="slider" id="slider_sepia">
</div>
</div>
<div class='right'>
<div class="slidecontainer_vertical">
<input type="range" min="0" max="100" value="100" class="slider" id="slider_saturate">
</div></div>
</div>