Я использую простой SVG треугольный путь, который заливка редактируется через CSS с использованием ссылки на SVG Gradient .
SVG:
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<linearGradient id="gradient">
<stop offset="0%" />
<stop offset="100%" />
</linearGradient>
<polygon id="triangle" points="0,0 100,0 0,66" />
</svg>
CSS:
#triangle {
fill: url(#gradient);
}
Чтобы получить немного больше свободы с цветами , используемыми в градиенте, и получить цвета из разметки Я выбралиспользовать CSS пользовательские свойства (иначе переменные CSS)
CSS:
#gradient stop:first-child {
stop-color: var(--color-stop);
}
#gradient stop {
stop-color: var(--color-stop2);
}
Софар настолько хорош, проблема в том, что я хочу повторно используйте эту треугольную форму и придайте ей другой цвет. Перезапись переменных CSS не имеет никакого эффекта! https://codepen.io/Type-Style/pen/gNYpjL
// nothing in js this time
svg {width: 250px; height:200px;}
:root {
--color-stop: orange;
--color-stop2: red;
}
.second { /* has no effect */
--color-stop: lime;
--color-stop2: green;
}
#gradient stop:first-child {
stop-color: var(--color-stop);
}
#gradient stop {
stop-color: var(--color-stop2);
}
#triangle {
fill: url(#gradient);
}
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<linearGradient id="gradient">
<stop offset="0%" />
<stop offset="100%" />
</linearGradient>
<polygon id="triangle" points="0,0 100,0 0,66" />
</svg>
<svg class="second" viewBox="0 0 100 100">
<use class="use-triangle" href="#triangle" />
</svg>
Ожидаемый результат:
Я хотел, чтобы второй треугольник был окрашен другим способом.
Результат:
Но мне кажется, что после использования градиента его невозможно изменить / перезаписать.Такое ощущение, что градиент принимает только то значение, которое ему непосредственно присвоено, и которое нельзя изменить после его использования.Это может быть связано с характером использования заполнения, ссылающегося на идентификатор, но я не уверен
Что я пробовал / кредит:
Я проверил SVG-градиент, используя CSS , где я получил и изменил пример.(Thx to @ Maciej-Kwas)
Кроме того, я знаю, что вы можете наследовать заливку и использовать currentColor , чтобы обеспечить больше цветов для элемента, который "используется".Но до этого момента я не мог заставить это работать с градиентом.
Неудовлетворительный обходной путь:
Так как моя цель - сохранить цвета снаружиразметки я мог бы переместить svg в строку css в качестве data-Uri, примерно так:
fill: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><linearGradient id='grad'><stop offset='0%' stop-color='%23ff00cc'/><stop offset='100%' stop-color='%23333399'/></linearGradient></svg>#grad")
Большой кредит за статью об этом: https://fvsch.com/svg-gradient-fill/
Но так как этоработает только в Firefox и кажется хакерским.
Заключительные мысли:
Интересно, есть ли какое-нибудь другое решение.И хотелось бы точно знать, почему это не работает так, как я ожидал, в первую очередь, подробно.