Учитывая прозрачный PNG, отображающий простую форму в белом, возможно ли каким-то образом изменить его цвет с помощью CSS? Какая-то накладка или что нет?
Учитывая прозрачный PNG, отображающий простую форму в белом, возможно ли каким-то образом изменить его цвет с помощью CSS? Какая-то накладка или что нет?
Ответы:
Вы можете использовать фильтры с -webkit-filter
и filter
: Фильтры являются относительно новыми для браузеров, но поддерживаются в более чем 90% браузеров согласно следующей таблице CanIUse: https://caniuse.com/#feat=css-filters
Вы можете изменить изображение на оттенки серого, сепию и многое другое (посмотрите на пример).
Теперь вы можете изменить цвет файла PNG с помощью фильтров.
body {
background-color:#03030a;
min-width: 800px;
min-height: 400px
}
img {
width:20%;
float:left;
margin:0;
}
/*Filter styles*/
.saturate { filter: saturate(3); }
.grayscale { filter: grayscale(100%); }
.contrast { filter: contrast(160%); }
.brightness { filter: brightness(0.25); }
.blur { filter: blur(3px); }
.invert { filter: invert(100%); }
.sepia { filter: sepia(100%); }
.huerotate { filter: hue-rotate(180deg); }
.rss.opacity { filter: opacity(50%); }
<!--- img src http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/500px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg -->
<img alt="Mona Lisa" src="https://www.pexels.com/photo/photo-of-a-green-leaf-2563743/?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="original">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="saturate" class="saturate">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="grayscale" class="grayscale">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="contrast" class="contrast">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="brightness" class="brightness">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="blur" class="blur">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="invert" class="invert">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="sepia" class="sepia">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="huerotate" class="huerotate">
<img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="opacity" class="rss opacity">
.gifcorrect{ filter: invert(28%) sepia(100%) hue-rotate(-180deg) saturate(3); }
это означает, что вы МОЖЕТЕ перейти от черного и прозрачного или в оттенках серого к цвету, и это работает даже на анимированных GIF-изображениях
Я нашел этот замечательный пример codepen, в котором вы вставляете шестнадцатеричное значение цвета, и он возвращает необходимый фильтр для применения этого цвета к png.
Генератор фильтров CSS для преобразования из черного в целевой шестнадцатеричный цвет
например, мне нужен был мой png, чтобы иметь следующий цвет # 1a9790
тогда вам нужно применить следующий фильтр к вам png
filter: invert(48%) sepia(13%) saturate(3207%) hue-rotate(130deg) brightness(95%) contrast(80%);
filter: invert(1%) sepia(1%) saturate(1%) hue-rotate(1deg) brightness(1000%) contrast(80%);
Возможно, вы захотите взглянуть на Icon шрифты. http://css-tricks.com/examples/IconFont/
РЕДАКТИРОВАТЬ: я использую Font-Awesome в моем последнем проекте. Вы можете даже загрузить его. Просто поместите это в свой <head>
:
<link href="//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 -->
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome-ie7.min.css" rel="stylesheet">
А затем добавьте несколько значков-ссылок, например:
<a class="icon-thumbs-up"></a>
Вот полный шпаргалка
--редактировать--
Font-Awesome использует разные имена классов в новой версии, возможно потому, что это делает CSS-файлы значительно меньше и позволяет избежать двусмысленных классов CSS. Итак, теперь вы должны использовать:
<a class="fa fa-thumbs-up"></a>
РЕДАКТИРОВАТЬ 2:
Только что выяснил, Github также использует свой собственный значок шрифта: Octicons Это бесплатно скачать. У них также есть несколько советов о том, как создавать свои собственные иконки шрифтов .
Я был в состоянии сделать это с помощью фильтра SVG. Вы можете написать фильтр, который умножает цвет исходного изображения на цвет, который вы хотите изменить. В приведенном ниже фрагменте кода цвет заливки - это цвет, который мы хотим изменить на цвет изображения (в данном случае это красный.) FeComposite сообщает фильтру, как мы обрабатываем цвет. Формула для feComposite с арифметикой имеет вид (k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4), где i1 и i2 - входные цвета для in / in2 соответственно. Таким образом, указание только k1 = 1 означает, что он будет делать только i1 * i2, что означает умножение обоих входных цветов вместе.
Примечание. Это работает только с HTML5, так как использует встроенный SVG. Но я думаю, что вы могли бы сделать это с более старым браузером, поместив SVG в отдельный файл. Я еще не пробовал такой подход.
Вот фрагмент:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
<defs>
<filter id="colorMask1">
<feFlood flood-color="#ff0000" result="flood" />
<feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
</filter>
</defs>
<image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask1)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
<defs>
<filter id="colorMask2">
<feFlood flood-color="#00ff00" result="flood" />
<feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
</filter>
</defs>
<image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask2)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
<defs>
<filter id="colorMask3">
<feFlood flood-color="#0000ff" result="flood" />
<feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
</filter>
</defs>
<image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask3)" />
</svg>
Тег img имеет свойство background, как и любой другой. Если у вас есть белый PNG с прозрачной формой, такой как трафарет, то вы можете сделать это:
<img src= 'stencil.png' style= 'background-color: red'>
Да :)
Surfin 'Safari - Blog Archive »CSS маски
WebKit теперь поддерживает альфа-маски в CSS. Маски позволяют накладывать содержимое блока на шаблон, который можно использовать для выбивания частей этого блока на конечном экране. Другими словами, вы можете обрезать сложные формы, основываясь на альфа-изображении.
[...]
Мы ввели новые свойства, чтобы предоставить веб-дизайнерам большой контроль над этими масками и тем, как они применяются. Новые свойства аналогичны уже существующим свойствам фона и изображения границы.-webkit-mask (background) -webkit-mask-attachment (background-attachment) -webkit-mask-clip (background-clip) -webkit-mask-origin (background-origin) -webkit-mask-image (background-image) -webkit-mask-repeat (background-repeat) -webkit-mask-composite (background-composite) -webkit-mask-box-image (border-image)
В большинстве браузеров вы можете использовать фильтры:
на обоих <img>
элементах и фоновых изображений других элементов
и установить их либо статически в вашем CSS, либо динамически с помощью JavaScript
Смотрите демоверсии ниже.
<img>
элементыВы можете применить эту технику к <img>
элементу:
#original, #changed {
width: 45%;
padding: 2.5%;
float: left;
}
#changed {
-webkit-filter : hue-rotate(180deg);
filter : hue-rotate(180deg);
}
<img id="original" src="http://i.stack.imgur.com/rfar2.jpg" />
<img id="changed" src="http://i.stack.imgur.com/rfar2.jpg" />
Вы можете применить эту технику к фоновому изображению:
#original, #changed {
background: url('http://i.stack.imgur.com/kaKzj.jpg');
background-size: cover;
width: 30%;
margin: 0 10% 0 10%;
padding-bottom: 28%;
float: left;
}
#changed {
-webkit-filter : hue-rotate(180deg);
filter : hue-rotate(180deg);
}
<div id="original"></div>
<div id="changed"></div>
Вы можете использовать JavaScript для установки фильтра во время выполнения:
var element = document.getElementById("changed");
var filter = 'hue-rotate(120deg) saturate(2.4)';
element.style['-webkit-filter'] = filter;
element.style['filter'] = filter;
#original, #changed {
margin: 0 10%;
width: 30%;
float: left;
background: url('http://i.stack.imgur.com/856IQ.png');
background-size: cover;
padding-bottom: 25%;
}
<div id="original"></div>
<div id="changed"></div>
hue-rotate
не работает на белом.
Думаю, у меня есть решение для этого: а) именно то, что вы искали 5 лет назад, и б) немного проще, чем другие варианты кода здесь.
С любым белым png (например, белым значком на прозрачном фоне), вы можете добавить селектор :: after, чтобы перекрасить.
.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 */
}
См. Этот кодовый блок (применение цветовой замены при наведении): http://codepen.io/chrscblls/pen/bwAXZO
Самая простая строка, которая работала для меня:
filter: opacity(0.5) drop-shadow(0 0 0 blue);
Вы можете настроить непрозрачность от 0 до 1, чтобы сделать цвет светлее или темнее.
Я нашел это, пока гуглил, я нашел лучшую работу для меня ...
HTML
<div class="img"></div>
CSS
.img {
background-color: red;
width: 60px;
height: 60px;
-webkit-mask-image: url('http://i.stack.imgur.com/gZvK4.png');
}
Мне требовался определенный цвет, поэтому фильтр не работал для меня.
Вместо этого я создал div, используя несколько фоновых изображений CSS и функцию линейного градиента (которая создает само изображение). Если вы используете режим наложения оверлея, ваше фактическое изображение будет смешано с созданным «градиентным» изображением, содержащим желаемый цвет (здесь # BADA55)
.colored-image {
background-image: linear-gradient(to right, #BADA55, #BADA55), url("https://i.imgur.com/lYXT8R6.png");
background-blend-mode: overlay;
background-size: contain;
width: 200px;
height: 200px;
}
<div class="colored-image"></div>
Отвечая, потому что я искал решение для этого.
ручка в ответе @chrscblls хорошо работает, если у вас белый или черный фон, а у меня - нет. Кроме того, изображения были сгенерированы с помощью ng-repeat, поэтому у меня не может быть их URL в моем css, и вы не можете использовать :: after для тегов img.
Итак, я обдумал работу и подумал, что это может помочь людям, если они слишком спотыкаются здесь.
Так что я сделал то же самое с тремя основными отличиями:
Чтобы изменить его с черного на белый или с белого на черный, цвет фона должен быть белым. От черного до цвета, вы можете выбрать любой цвет. От белого до цветов, вам нужно будет выбрать цвет, противоположный тому, который вы хотите.
.divClass{
position: relative;
width: 100%;
height: 100%;
text-align: left;
}
.divClass:hover::after, .divClass:hover::before{
position: absolute;
width: 100%;
height: 100%;
background: #FFF;
mix-blend-mode: difference;
content: "";
}
Нет необходимости в полном наборе шрифтов, если вам нужен только один значок, плюс я чувствую, что он более «чистый» как отдельный элемент. Таким образом, для этой цели в HTML5 вы можете поместить SVG непосредственно в поток документов. Затем вы можете определить класс в вашей таблице стилей .CSS и получить доступ к его цвету фона с помощью fill
свойства:
Рабочая скрипка: http://jsfiddle.net/qmsj0ez1/
Обратите внимание, что в примере я использовал :hover
для иллюстрации поведения; если вы просто хотите изменить цвет для «нормального» состояния, вы должны удалить псевдокласс.
Чтобы буквально изменить цвет, вы можете включить CSS-переход с -webkit-filter, где, когда что-то происходит, вы вызываете -webkit-filter по вашему выбору. Например:
img {
-webkit-filter:grayscale(0%);
transition: -webkit-filter .3s linear;
}
img:hover
{
-webkit-filter:grayscale(75%);
}
При изменении изображения с черного на белый или с белого на черный фильтр поворота оттенка не работает, поскольку черный и белый цвета технически не являются. Вместо этого черно-белые изменения цвета (с черного на белый или наоборот) должны быть выполнены с помощью свойства инвертированного фильтра.
.img1 {
filter: invert(100%);
}
body{
background: #333 url(/images/classy_fabric.png);
width: 430px;
margin: 0 auto;
padding: 30px;
}
.preview{
background: #ccc;
width: 415px;
height: 430px;
border: solid 10px #fff;
}
input[type='radio'] {
-webkit-appearance: none;
-moz-appearance: none;
width: 25px;
height: 25px;
margin: 5px 0 5px 5px;
background-size: 225px 70px;
position: relative;
float: left;
display: inline;
top: 0;
border-radius: 3px;
z-index: 99999;
cursor: pointer;
box-shadow: 1px 1px 1px #000;
}
input[type='radio']:hover{
-webkit-filter: opacity(.4);
filter: opacity(.4);
}
.red{
background: red;
}
.red:checked{
background: linear-gradient(brown, red)
}
.green{
background: green;
}
.green:checked{
background: linear-gradient(green, lime);
}
.yellow{
background: yellow;
}
.yellow:checked{
background: linear-gradient(orange, yellow);
}
.purple{
background: purple;
}
.pink{
background: pink;
}
.purple:checked{
background: linear-gradient(purple, violet);
}
.red:checked ~ img{
-webkit-filter: opacity(.5) drop-shadow(0 0 0 red);
filter: opacity(.5) drop-shadow(0 0 0 red);
}
.green:checked ~ img{
-webkit-filter: opacity(.5) drop-shadow(0 0 0 green);
filter: opacity(.5) drop-shadow(0 0 0 green);
}
.yellow:checked ~ img{
-webkit-filter: opacity(.5) drop-shadow(0 0 0 yellow);
filter: opacity(.5) drop-shadow(0 0 0 yellow);
}
.purple:checked ~ img{
-webkit-filter: opacity(.5) drop-shadow(0 0 0 purple);
filter: opacity(.5) drop-shadow(0 0 0 purple);
}
.pink:checked ~ img{
-webkit-filter: opacity(.5) drop-shadow(0 0 0 pink);
filter: opacity(.5) drop-shadow(0 0 0 pink);
}
img{
width: 394px;
height: 375px;
position: relative;
}
.label{
width: 150px;
height: 75px;
position: absolute;
top: 170px;
margin-left: 130px;
}
::selection{
background: #000;
}
<div class="preview">
<input class='red' name='color' type='radio' />
<input class='green' name='color' type='radio' />
<input class='pink' name='color' type='radio' />
<input checked class='yellow' name='color' type='radio' />
<input class='purple' name='color' type='radio' />
<img src="https://i.stack.imgur.com/bd7VJ.png"/>
</div>
Источник: https://codepen.io/taryaoui/pen/EKkcu
background-color
свойство CSS. Вы можете создать непрозрачную часть, которая будет фиксированной, и прозрачную часть изображения, которая будет заполнена любым цветом, который вам нравится, с помощью CSS. Это то, что вы хотите достичь?