(отправка другого ответа, потому что это очень отличается)
Демо-версия:
(В идеале вы должны сначала прочитать объяснение, но в случае, если хотите сначала увидеть конечный результат ...)
Внешний интерфейс: https://codepen.io/devanshj/pen/OomRer
Бэкэнд: https://glitch.com/edit/#!/mature-teller?path=server.js:8:0
Пояснение:
Я не мог понять, чего вы пытаетесь достичь с помощью этих масок и фонов (вместо прямых svgs), пока не наткнулся на эту статью: Раскраска SVG в фоновых изображениях CSS ...
Причина, по которой решение (я) в этой статье не работает для вас, заключается в том, что вы хотите использовать несколько цветных svgs (а решение в статье - только для одного svg)
Объединяя проблему, которую решает статья, с тем, что вы хотите в качестве конечной цели, я бы перефразировал вопрос примерно так:
- Я хочу иметь несколько фонов SVG для элемента
- Я также хочу контролировать цвет каждого SVG
- Только решение css. Вам не разрешено изменять html.
Это довольно невозможно. «довольно», - сказал я, следовательно, это возможно (с супер экстраординарным решением).
Довольно невозможная часть - раскраска svg. Несколько фонов SVG только с CSS просто.
Но что, если я сделаю что-нибудь, что раскрасит svg из самого URL, например url(my-icon.svg?fill=#f00)
Если я смогу сделать это, ваша проблема будет решена, и мы можем сделать что-то вроде:
.icon-a{
background-image: url("a.svg?fill=%23000"); // # encoded to %23 so that server doesn't think #000 is the hash part of the request
&.icon-b{
background-image: url("a.svg?fill=%23000"), url("b.svg?fill=%23fff");
&:hover{
background-image: url("a.svg?fill=%23000"), url("b.svg?fill=%23f00");
}
}
}
Это можно сделать с помощью небольшого серверного кода (используя здесь express и nodejs, аналогичный код можно написать и для других языков / сред):
app.get("/icons/*.svg", async (req, res) => {
let svgCode = await readFileAsync(path.join(__dirname, req.path), {encoding: "utf8"});
svgCode = svgCode.replace(/{{queryFill}}/g, req.query.fill);
res.set("Content-Type", "image/svg+xml");
res.send(svgCode);
});
и svg:
<svg xmlns="http://www.w3.org/2000/svg">
<style>
.query-fill{
fill: {{queryFill}};
}
</style>
<rect x="0" y="0" width="100" height="100" class="query-fill"></rect>
</svg>
Альтернатива:
Если вы позволите мне изменить html, решение будет очень простым с использованием встроенного svg и <use>
... Но я думаю, что вам нужно решение только для css ...
PS: Если вам интересно, есть ли решение без какого-либо серверного кода? Нет.
PPS: Если перефразированный вопрос не тот, который вы хотите, то то, что вы ищете (многослойные маски), невозможно только с помощью css.