我想知道是否可以用css渐变做这样的事情:
我搜索了很多,所有渐变都是“线性”或“径向”。我想要的渐变是圆形的线性方式!
答案 0 :(得分:2)
我担心CSS不允许线性径向渐变。然而,svg提供了一个解决方案,尽管很粗糙。请参阅以下主题以获取解决方案。
答案 1 :(得分:1)
您可以使用3个用公共圆切割的三角形。每个三角形都由具有线性渐变的长矩形通过中心投影进行变换。 我在Firefox中使用SVG进行了尝试,但是Chromium在SVG中不支持中央投影,但是支持圆锥形渐变,因此请参见两种浏览器的组合版本。
<svg version="2" viewBox="-207 -207 414 414" xmlns="http://www.w3.org/2000/svg">
<defs>
<radialGradient id="gWt">
<stop style="stop-color:#fff" offset="0"/>
<stop style="stop-color:#fff0" offset="1"/>
</radialGradient>
<!-- part for firefox: using central projection of 3 rectangles -->
<linearGradient id="gYM" x1="0" x2="0" y1="0" y2="100%">
<stop style="stop-color:#ef08" offset="0"/>
<stop style="stop-color:#ff0" offset=".005"/>
<stop style="stop-color:#fc0" offset=".1827"/>
<stop style="stop-color:#f90" offset=".2924"/>
<stop style="stop-color:#f60" offset=".3728"/>
<stop style="stop-color:#f00" offset=".5"/>
<stop style="stop-color:#f06" offset=".6272"/>
<stop style="stop-color:#f09" offset=".7076"/>
<stop style="stop-color:#f0c" offset=".8173"/>
<stop style="stop-color:#f0f" offset=".995"/>
<stop style="stop-color:#e0f8" offset="1"/>
</linearGradient>
<linearGradient id="gCY" href="#gYM">
<stop style="stop-color:#0ef8" offset="0"/>
<stop style="stop-color:#0ff" offset=".005"/>
<stop style="stop-color:#0fc" offset=".1827"/>
<stop style="stop-color:#0f9" offset=".2924"/>
<stop style="stop-color:#0f6" offset=".3728"/>
<stop style="stop-color:#0f0" offset=".5"/>
<stop style="stop-color:#6f0" offset=".6272"/>
<stop style="stop-color:#9f0" offset=".7076"/>
<stop style="stop-color:#cf0" offset=".8173"/>
<stop style="stop-color:#ff0" offset=".995"/>
<stop style="stop-color:#fe08" offset="1"/>
</linearGradient>
<linearGradient id="gMC" href="#gYM">
<stop style="stop-color:#f0e8" offset="0"/>
<stop style="stop-color:#f0f" offset=".005"/>
<stop style="stop-color:#c0f" offset=".1827"/>
<stop style="stop-color:#90f" offset=".2924"/>
<stop style="stop-color:#60f" offset=".3728"/>
<stop style="stop-color:#00f" offset=".5"/>
<stop style="stop-color:#06f" offset=".6272"/>
<stop style="stop-color:#09f" offset=".7076"/>
<stop style="stop-color:#0cf" offset=".8173"/>
<stop style="stop-color:#0ff" offset=".995"/>
<stop style="stop-color:#0fe8" offset="1"/>
</linearGradient>
<rect id="r" width="2000" height="700" style="transform:matrix3d(
-29,0,0,100,
0,1,0,0,
0,0,1,0,
200,-350,1,1
); mix-blend-mode:lighten"/>
</defs>
<clipPath id="cc">
<circle r="200" id="c"/>
</clipPath>
<circle r="199" fill="#000"/>
<g clip-path="url(#cc)" id="m">
<use href="#r" fill="url(#gCY)" transform="rotate(-120)"/>
<use href="#r" fill="url(#gYM)"/>
<use href="#r" fill="url(#gMC)" transform="rotate(120)"/>
<!-- for Chrome use conic gradient (does not work with any svg object but with foreign)
Firefox ignores this object due to unknown keyword in style -->
<foreignObject width="400" height="400" x="-200" y="-200" style="background:conic-gradient(from 90deg,
#f00,#f0f,#00f,#0ff,#0f0,#ff0,#f00);
background-repeat: no-repeat;
background-position: center center;
background-size: auto;"/>
</g>
<g>
<!-- Points for visual test -->
<circle cx="-200" r="6" fill="#0ff"/>
<circle cx="-195.6" cy="-41.6" r="6" fill="#0fc"/>
<circle cx="-182.7" cy="-81.3" r="6" fill="#0f9"/>
<circle cx="-161.8" cy="-117.6" r="6" fill="#0f6"/>
<circle cx="-133.8" cy="-148.6" r="6" fill="#0f3"/>
<circle cx="-100" cy="-173.2" r="6" fill="#0f0"/>
<circle cx="-61.8" cy="-190.2" r="6" fill="#3f0"/>
<circle cx="-20.9" cy="-198.9" r="6" fill="#6f0"/>
<circle cx="20.9" cy="-198.9" r="6" fill="#9f0"/>
<circle cx="61.8" cy="-190.2" r="6" fill="#cf0"/>
<circle cx="100" cy="-173.2" r="6" fill="#ff0"/>
<circle cx="133.8" cy="-148.6" r="6" fill="#fc0"/>
<circle cx="161.8" cy="-117.6" r="6" fill="#f90"/>
<circle cx="182.7" cy="-81.3" r="6" fill="#f60"/>
<circle cx="195.6" cy="-41.6" r="6" fill="#f30"/>
<circle cx="200" r="6" fill="#f00"/>
<circle cx="-195.6" cy="41.6" r="6" fill="#0cf"/>
<circle cx="-182.7" cy="81.3" r="6" fill="#09f"/>
<circle cx="-161.8" cy="117.6" r="6" fill="#06f"/>
<circle cx="-133.8" cy="148.6" r="6" fill="#03f"/>
<circle cx="-100" cy="173.2" r="6" fill="#00f"/>
<circle cx="-61.8" cy="190.2" r="6" fill="#30f"/>
<circle cx="-20.9" cy="198.9" r="6" fill="#60f"/>
<circle cx="20.9" cy="198.9" r="6" fill="#90f"/>
<circle cx="61.8" cy="190.2" r="6" fill="#c0f"/>
<circle cx="100" cy="173.2" r="6" fill="#f0f"/>
<circle cx="133.8" cy="148.6" r="6" fill="#f0c"/>
<circle cx="161.8" cy="117.6" r="6" fill="#f09"/>
<circle cx="182.7" cy="81.3" r="6" fill="#f06"/>
<circle cx="195.6" cy="41.6" r="6" fill="#f03"/>
</g>
<circle r="200" fill="url(#gWt)"/>
</svg>
偏移值是使用公式(对于矩形350x200)计算的:
0.5 ± tan(v/255.*pi/3)/350*100.
v
是不断变化的颜色通道的值。
HTML版本(在Chrome的全窗口中查看代码段)
*{
margin:0;
padding:0;
}
.c{
height:90vmin;
width:90vmin;
margin:5vmin;
overflow: hidden;
border-radius:50%;
position:absolute;
}
.c>div{
position:relative;
height:180vmin;
width:100vmin;
perspective: 0.40vmin;
top:-45vmin;
left:-4.8vmin;
}
.c>div>div{
height: 100%;
width: 100%;
left:0;
top:1%;
height: 98%;
transform-origin:99.98% 50%;
position:relative;
transform: rotate3d(0, 1, 0, -80deg);
border:black;
}
#YM>div{
background:linear-gradient(#ef08,#ff0 0.5%,#fc0 18.27%,#f90 29.24%,#f60 37.28%,#f00 50%,#f06 62.72%,#f09 70.76%,#f0c 81.73%,#f0f 99.5%,#e0f8);
}
#MC{
transform: rotateZ(120deg);
}
#CY{
transform: rotateZ(-120deg);
}
#MC>div{
background:linear-gradient(#f0e8,#f0f 0.5%,#c0f 18.27%,#90f 29.24%,#60f 37.28%,#00f 50%,#06f 62.72%,#09f 70.76%,#0cf 81.73%,#0ff 99.5%,#0fe8);
}
#CY>div{
background:linear-gradient(#0ef8,#0ff 0.5%,#0fc 18.27%,#0f9 29.24%,#0f6 37.28%,#0f0 50%,#6f0 62.72%,#9f0 70.76%,#cf0 81.73%,#ff0 99.5%,#fe08);
}
<div class="c"><div id="YM"><div></div></div></div>
<div class="c"><div id="MC"><div></div></div></div>
<div class="c"><div id="CY"><div></div></div></div>
答案 2 :(得分:0)
现在可行-至少在Chrome中是可行的。 CSS属性conic-gradient
可以轻松实现:
html, body { margin: 0; padding: 0; }
.box {
position: absolute;
width: 200px;
height: 200px;
left: 100px;
}
.colorwheel {
background: conic-gradient(red, yellow, lime, aqua, blue, magenta, red);
clip-path: circle(100px at center);
}
.fallback {
text-align: center;
padding: 50px 0;
}
<div class="fallback box">
If you can read<br>this, your browser<br>doesn't support<br>conic-gradient yet.
</div>
<div class="colorwheel box"></div>
此CSS函数在 CSS图像模块第4级的工作草案中指定,目前仅由最新版本的Chrome,Android浏览器和Safari(macOS和iOS),但都不能使用Firefox或Edge。检查Can I use以获得当前支持。
答案 3 :(得分:0)
我只是在为自己的项目设计一个想法。我不想使用``圆锥渐变'',因为目前(2019年中)对此的支持非常低。所以我想出了以下几点:
Add
https://jsfiddle.net/p5vxek3u/
它不确切,但是足够接近我的需求。我在具有alpha透明性的东西后面使用它,所以您一次只能看到一小部分。
我想我会把它留在这里,以防有人需要。