Я хотел бы заполнить фигуру SVG двумя градиентами, один из которых расположен под углом 45 градусов к другому:
<linearGradient id="wave" x1="0%" x2="100%" y1="0%" y2="0%"
spreadMethod="pad">
<stop offset="0%" stop-color="gray" />
<stop offset="25%" stop-color="black"/>
<stop offset="65%" stop-color="white"/>
<stop offset="100%" stop-color="gray" />
</linearGradient>
<linearGradient id="red-yellow" x1="0%" x2="100%" y1="0%" y2="100%"
spreadMethod="pad" gradientTransform="rotate(7)">
<stop offset="0%" stop-color="gold" />
<stop offset="30%" stop-color="gold"/>
<stop offset="50%" stop-color="red"/>
<stop offset="100%" stop-color="red" />
</linearGradient>
Есть ли способ смешать (умножить) эти градиенты? Конечным результатом должен быть прямоугольник (или произвольная форма), цвет которого изменяется от «золотого» вверху слева до «красного» в правом нижнем углу, а значение (как в HSV) изменяется от среднего до низкого до высокого и среднего от слева направо.
2 ответа
Вы можете сделать это с помощью SVG-фильтра, а также выполнить наложение «умножение», «растрирование», «осветление» или «затемнение». (Хотя он будет полностью корректно работать только в Chrome / Safari, потому что они поддерживают как импорт объектов в фильтры с feImage, так и правильный размер импорта feImage - если вы хотите, чтобы это работало и в Firefox, тогда используйте URI встроенных данных в качестве входных данных для feImage, а не ссылку на объект) Ниже приведен пример использования множественного смешивания:
<svg width="600px" height="600px" viewbox="0 0 600 600">
<defs>
<linearGradient id="wave" x1="0%" x2="100%" y1="0%" y2="0%"
spreadMethod="pad">
<stop offset="0%" stop-color="gray" />
<stop offset="25%" stop-color="black"/>
<stop offset="65%" stop-color="white"/>
<stop offset="100%" stop-color="gray" />
</linearGradient>
<linearGradient id="red-yellow" x1="0%" x2="100%" y1="0%" y2="100%"
spreadMethod="pad" gradientTransform="rotate(7)">
<stop offset="0%" stop-color="gold" />
<stop offset="30%" stop-color="gold"/>
<stop offset="50%" stop-color="red"/>
<stop offset="100%" stop-color="red" />
</linearGradient>
<rect id="wave-rect" x="0" y="0" width="400" height="400" fill="url(#wave)"/>
<rect id="ry-rect" x="0" y="0" width="400" height="400" fill="url(#red-yellow)"/>
<filter id="blend-it" x="0%" y="0%" width="100%" height="100%">
<feImage xlink:href="#wave-rect" result="myWave" x="100" y="100"/>
<feImage xlink:href="#ry-rect" result="myRY" x="100" y="100"/>
<feBlend in="myWave" in2="myRY" mode="multiply" result="blendedGrad"/>
<feComposite in="blendedGrad" in2="SourceGraphic" operator="in"/>
</filter>
</defs>
<circle filter="url(#blend-it)" cx="300" cy="300" r="200"/>
</svg>
Вы можете разместить серые оттенки сверху, но используйте прозрачность вместо белого. Это должно объединить оба.
Похожие вопросы
Новые вопросы
svg
Масштабируемая векторная графика (SVG) - это формат двумерной векторной графики на основе XML, который также можно использовать в HTML. Не добавляйте этот тег только потому, что ваш проект использует SVG. Вместо этого добавьте тег, если ваш вопрос касается SVG или тесно связан с ним, например, как добиться чего-то с SVG.