Я обнаружил, что визуальный эффект цвета линейного градиента в SVG и CSS различен, особенно в смежной части между двумя цветами. Я хочу знать, связано ли это с различиями в линейной интерполяции. И есть ли решение сделать эффект SVG таким же, как и CSS?
#rectangle {
width: 100px;
height: 300px;
background: linear-gradient( 180deg, rgba(235, 116, 116, 0.1) 0%, rgba(42, 255, 44, 1) 100%);
}
.stop1 {
stop-color: rgba(235, 116, 116);
stop-opacity: 0.1;
}
.stop2 {
stop-color: rgba(42, 255, 44, 1);
}
/* added by editor for comparrison reasons */
.container {
display: flex;
gap: 0.25em;
}
<div class = "container">
<div class = "col">
<p>CSS</p>
<div id='rectangle'></div>
</div>
<div class = "col">
<p>SVG</p>
<svg width = "800" height = "800" version = "1.1" xmlns = "http://www.w3.org/2000/svg">
<defs>
<linearGradient id = "Gradient1" x1 = "0" x2 = "0" y1 = "0" y2 = "1" spreadMethod = "repeat">
<stop class = "stop1" offset = "0%" />
<stop class = "stop2" offset = "100%" />
</linearGradient>
</defs>
<rect x = "0" y = "0" rx = "0" ry = "0" width = "100" height = "300" fill = "url(#Gradient1)" />
</svg>
</div>
</div>
Да, это кажется правильным. Firefox поддерживает цветовую интерполяцию градиентов, и я думаю, что Chrome тоже скоро сделает то же самое.
#rectangle {
width: 100px;
height: 300px;
background: linear-gradient( 180deg, rgba(235, 116, 116, 0.1) 0%, rgba(42, 255, 44, 1) 100%);
}
.stop1 {
stop-color: rgba(235, 116, 116);
stop-opacity: 0.1;
}
.stop2 {
stop-color: rgba(42, 255, 44, 1);
}
/* added by editor for comparrison reasons */
.container {
display: flex;
gap: 0.25em;
}
<div class = "container">
<div class = "col">
<p>CSS</p>
<div id='rectangle'></div>
</div>
<div class = "col">
<p>SVG</p>
<svg width = "800" height = "800" version = "1.1" xmlns = "http://www.w3.org/2000/svg">
<defs>
<linearGradient id = "Gradient1" color-interpolation = "linearRGB" x1 = "0" x2 = "0" y1 = "0" y2 = "1" spreadMethod = "repeat">
<stop class = "stop1" offset = "0%" />
<stop class = "stop2" offset = "100%" />
</linearGradient>
</defs>
<rect x = "0" y = "0" rx = "0" ry = "0" width = "100" height = "300" fill = "url(#Gradient1)" />
</svg>
</div>
</div>
Спасибо за ответ! Я обнаружил, что визуальный эффект ответа на моей стороне все еще разный (Edge/Firefox/Chrome). T_T Я поискал и обнаружил, что цветовая интерполяция по умолчанию для CSS — sRGB, а атрибут цветовой интерполяции в SVG можно установить на sRGB. И я попробовал, к сожалению, визуальный эффект между ними все равно разный. Т_Т
Хотя в Chrome есть явная разница, указывающая на то, что он еще не поддерживает Linearrgb, для меня в Firefox это выглядит так же.
Еще раз спасибо! Я скачал последнюю версию Firefox и увидел, что визуальные эффекты у них одинаковые.
Но мне нужно поддерживать тот же визуальный эффект в Edge (._.). Судя по нынешнему обсуждению, это может оказаться неосуществимым.
Другие браузеры, такие как Chrome и Safari, похоже, работают над добавлением поддержки. Последнее, что я видел, это то, что ожидается, что это будет в Chrome 127.
Избавьтесь от непрозрачности и всё будет вести себя нормально, это интересно