Изменение цвета заливки SVG в: до или: после CSS
У меня есть SVG-графический рисунок, подобный этому:
a::before { content: url(filename.svg); }
Когда я наводил курсор на тег, я действительно хочу, чтобы SVG менял цвет заливки, не загружая новый SVG файл, как я сейчас:
a:hover::before { content: url(filename_white.svg); }
Можно ли достичь использования JavaScript, jQuery или просто чистого CSS, о котором я не знаю?
Спасибо.
Ответы
Ответ 1
Использование свойства content
генерирует (не подвергается риску) разметку, функционально эквивалентную элементу svg в элементе <img> .
Вы не можете применять стиль к элементам внутри документа svg, потому что:
- стили не разрешены для каскадирования документов.
- при использовании <img> (или
content
или любого свойства изображения css, которое ссылается на svg), документ svg не отображается браузерами из-за проблем с безопасностью
Аналогичные вопросы, но для background-image
здесь и здесь.
Итак, чтобы делать то, что вы хотите, вы должны как-то обойти эти два пункта. Для этого существуют различные варианты, например, использование inline svg, использование фильтров (применяется к <img> ) или создание различных svg файлов (или URI данных), как в вашем вопросе.
Ответ 2
Принятый ответ неверен, это фактически возможно, применяя обходной путь с маской SVG и цветом фона:
p:after {
width: 48px;
height: 48px;
display: inline-block;
content: '';
-webkit-mask: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
mask: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
-webkit-mask-size: cover;
mask-size: cover;
}
.red:after {
background-color: red;
}
.green:after {
background-color: green;
}
.blue:after {
background-color: blue;
}
<p class="red">red heart</p>
<p class="green">green heart</p>
<p class="blue">blue heart</p>