在SVG渐变中,您可以设置起始xy和终止xy位置。是否有可能在CSS中做到这一点。
这是原始设计:
这是我的线性梯度的SVG:
.myRectangle {
width: 331px;
height: 137px;
left: 0px;
top: 0px;
}
这是我的CSS线性渐变:
#rectangle {
width: 100%;
height: 200px;
position: absolute;
top: 0;
left: 0;
background: linear-gradient(225deg, rgba(255,255,255,1) 0%, rgba(250,0,0,1) 27.59%, rgba(108,22,95,1) 76.35%, rgba(39,32,32,1) 100%)
}
我一直在引用此页面的MDN与此页面上的W3C。
SVG包含渐变的方向
x1="1" x2="0.5" y1="0" y2="0.5"
元素还具有其他几个属性,这些属性指定渐变的大小和外观。渐变的方向由两个点控制,这两个点由属性x1,x2,y1和y2指定。这些属性定义了一条渐变线。渐变默认为水平方向,但可以通过更改它们来旋转。上面示例中的Gradient2设计为创建垂直渐变。-来自https://developer.mozilla.org/zh-CN/docs/Web/SVG/Tutorial/Gradients
从其他文档中:
渐变线起点的X和Y位置,为对象边界框的倍数:X = 0表示边界框的左边缘,X = 1表示右边缘。渐变线可能在对象边界框外开始或结束,因此值可能<0或> 1。
Temani Afif.. 13
您可以将色标的所有值除以相同的系数,以减小渐变的大小并使它类似于SVG。
我使用CSS变量使其变得简单,但这不是强制性的
.rectangle {
width: 100%;
height: 200px;
--s:2;
background:
linear-gradient(225deg,
rgba(255,255,255,1) 0%,
rgba(250,0,0,1) calc(27.59%/var(--s)),
rgba(108,22,95,1) calc(76.35%/var(--s)),
rgba(39,32,32,1) calc(100%/var(--s)));
}
您可以添加一个额外的变量来补偿渐变,该渐变将模拟起点:
.rectangle {
width: 100%;
height: 200px;
--s:2;
--p:10%;
background:
linear-gradient(225deg,
rgba(255,255,255,1) var(--p),
rgba(250,0,0,1) calc(27.59%/var(--s) + var(--p)),
rgba(108,22,95,1) calc(76.35%/var(--s) + var(--p)),
rgba(39,32,32,1) calc(100%/var(--s) + var(--p)));
}
这是SVG和CSS渐变之间的一些比较:
.rectangle {
background:
linear-gradient(var(--a),
#f7f7f7 var(--p),
#ea0000 calc(26.6%/var(--s) + var(--p)),
#6c165f calc(76.85%/var(--s) + var(--p)),
#272020 calc(100%/var(--s) + var(--p)));
}
.myRectangle,
.rectangle {
width:100px;
height:100px;
display:inline-block;
}
您可以保持颜色和percetange值相同。对于SVG,您可以调整x,y值;对于CSS,您可以调整变量(角度,偏移量和除法器)
角度的公式如下:
angle = arctang(Height*(x2 - x1)/Width*|y2 - y1|)
如果y2 > y1
我们再做一步angle = 180deg - angle
为了找到分频器,我们需要考虑CSS梯度的长度,该长度等于
Dc = |Width * sin(angle)| + |Height * cos(angle)|
SVG梯度的长度等于:
Ds = sqrt(Width²*(x2 - x1)² + Height²*(y2 - y1)²)
然后我们做一个简单的除法 Dc/Ds
偏移量的公式p
为((Dc/2 - d)*100) / Dc
,它Dc
是先前定义的CSS渐变的长度,d
等于:
d = (Width²*(x1-0.5)*(x1-x2)+Height²*(y1-0.5)*(y1-y2))/(sqrt(Width²*(x2-x1)²+Height²*(y2-y1)²))
这是一个互动演示
angle = arctang(Height*(x2 - x1)/Width*|y2 - y1|)
Dc = |Width * sin(angle)| + |Height * cos(angle)|
Ds = sqrt(Width²*(x2 - x1)² + Height²*(y2 - y1)²)
当处理正方形时,以上给出了完美的结果。对于矩形形状,仍然存在一些差异。检查公式...
您可以将色标的所有值除以相同的系数,以减小渐变的大小并使它类似于SVG。
我使用CSS变量使其变得简单,但这不是强制性的
.rectangle {
width: 100%;
height: 200px;
--s:2;
background:
linear-gradient(225deg,
rgba(255,255,255,1) 0%,
rgba(250,0,0,1) calc(27.59%/var(--s)),
rgba(108,22,95,1) calc(76.35%/var(--s)),
rgba(39,32,32,1) calc(100%/var(--s)));
}