CSS3渐变的太阳爆发效果

7

我已经寻找并尝试了几天,但似乎无法完全做到100%正确... 我正在尝试使用css3渐变实现以下效果:

用Illustrator完成的日晷

我最接近的方法是DEMO

html {
  background:
    linear-gradient(80deg, transparent 50%, #ddd 50%, #ddd),
    linear-gradient(90deg, transparent 50%, #ddd 50%, #ddd),
    linear-gradient(82deg, transparent 50%, #eee 50%, #eee),
    linear-gradient(67deg, transparent 50%, #ddd 50%, #ddd),
    linear-gradient(52deg, transparent 50%, #eee 50%, #eee),
    linear-gradient(37deg, transparent 50%, #ddd 50%, #ddd),
    linear-gradient(22deg, transparent 50%, #eee 50%, #eee),
    linear-gradient(7deg, transparent 50%, #ddd 50%, #ddd),
    linear-gradient(-8deg, transparent 50%, #eee 50%, #eee),
    linear-gradient(-23deg, transparent 50%, #ddd 50%, #ddd),
    linear-gradient(-38deg, transparent 50%, #eee 50%, #eee),
    linear-gradient(-53deg, transparent 50%, #ddd 50%, #ddd),
    linear-gradient(-68deg, transparent 50%, #eee 50%, #eee),
    linear-gradient(-83deg, transparent 50%, #ddd 50%, #ddd);
  background-position: center -100%;
  background-color: #eee;
  background-size: 100% 200%;
  min-height: 100%;
}

我会继续尝试...虽然非常感谢任何帮助。

更新:

必须有更好/可重用的方法来解决这个问题...正在研究scss解决方案,以下是我目前的进展:

.sunburst {
  @for $ray from 1 through 26 {
    $color: #eee;
    $degree: 7;
    @if $ray%2 == 0 {
      $color: #ddd;
    }
    background:linear-gradient($degree+deg, transparent 50%, $color 50%, $color),
  }
}

现在我只是试图弄清楚它背后的实际数学...试图从 pow.js 中窃取逻辑,但如果你像我一样对数学很糟糕的话,这有点困难...


我已将您的演示转换为 Stack Overflow 代码片段。(别担心,我也保留了 JSFiddle 链接)。 - James Donnelly
哇,谢谢,我不知道有堆栈溢出片段.. 我已经有一段时间没来了。 - user1278673
谢谢@user2570380,但我正在寻找一些在旧浏览器上更容易的东西...虽然我确实遇到了那个... - user1278673
3
所以你把问题从“如何在CSS中制作这种效果”改成了“如何使用Sass编程生成这个CSS”?如果你已经得到了答案,请不要这样做,而是提出一个不同的问题。 - cimmanon
@cimmanon 不是的,我仍然会接受原问题的答案。但是,如果有一天我想出了Sass解决方案,我也会发布它。 - user1278673
5个回答

5
您可以使用:before和:after伪元素来实现此效果。

html, body {
  width: 100%;
  height: 100%;
  margin: 0;
}
#grad {
  position: relative;
  width: 100%;
  height: 100%;
}
#grad:after, #grad:before {
  content: '';
  position: absolute;
  background: linear-gradient(90deg, transparent 50%, black 50%, black), linear-gradient(82deg, transparent 50%, #12E0DB 50%, #12E0DB), linear-gradient(67deg, transparent 50%, #000000 50%, #000000), linear-gradient(52deg, transparent 50%, #12E0DB 50%, #12E0DB), linear-gradient(37deg, transparent 50%, #000000 50%, #000000), linear-gradient(22deg, transparent 50%, #12E0DB 50%, #12E0DB), linear-gradient(7deg, transparent 50%, #000000 50%, #000000), linear-gradient(-8deg, transparent 50%, #12E0DB 50%, #12E0DB), linear-gradient(-23deg, transparent 50%, #000000 50%, #000000), linear-gradient(-38deg, transparent 50%, #12E0DB 50%, #12E0DB), linear-gradient(-53deg, transparent 50%, #000000 50%, #000000), linear-gradient(-68deg, transparent 50%, #12E0DB 50%, #12E0DB), linear-gradient(-83deg, transparent 50%, #000000 50%, #000000), linear-gradient(-90deg, transparent 50%, #12E0DB 50%, #12E0DB);
  background-position: 0% 0%;
  background-size: 200% 100%;
  height: 100%;
  width: 50%;
}
#grad:before {
  left: 50%;
  transform: rotate(180deg);
}
<div id="grad"></div>


3

在现代基于Chrome的浏览器中,有锥形渐变可以实现这一效果。

       div {
       height:250px;
          background-image:
             repeating-conic-gradient(#fff 0 9deg, #000 9deg 18deg);
        }
<div></div>


虽然这是一个干净而且肯定不错的解决方案,但截至2020年4月,在Firefox中仍不支持“repeating-conic-gradient”(请参见CanIUse.comBugZilla上五年前的错误)。 - Jonas Kohl
现在,2021年5月,Firefox已经支持了这个。非常好,简单明了的解决方案。谢谢! - TAOcode

0

你的 background-position 被设置为 center -100%;。只需使用

background-position: center center;

现在有了这个更改和您提供的代码,您的图像已经完成了一半;)。只需添加更多的linear-gradients即可完成第二部分。


发现得好,我会继续下去,但是该死的,很难跟上进度...不过还是谢谢你。 - user1278673

0

@chipChocolate.py 提供了一个非常棒的解决方案!这是基于他的改进。

  1. 在 Firefox 中,transparent 的行为类似于 rgba(0,0,0,0),会在边缘留下一条细灰线。将其更改为 rgba(255,255,255,0) 看起来更好。

  2. 使视觉效果更接近 OP 的截图:36 条带,每个占据 10 度角。

  3. <html> 标签有效,就像 OP 的尝试。

顺便说一句:Chrome 的渲染引擎很烂,在 Firefox 中查看效果最佳。

html {
  height: 100%;
  position: relative;
}

html:before, html:after {
  content: '';
  height: 100%;
  width: 50%;
  position: absolute;
  top: 0;
  background-size: 200% 100%;
  background-image: linear-gradient(85deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(75deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(65deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(55deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(45deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(35deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(25deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(15deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(5deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(-5deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(-15deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(-25deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(-35deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(-45deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(-55deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(-65deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(-75deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db),
                    linear-gradient(-85deg, rgba(255,255,255,0) 50%, #000 50%, #000),
                    linear-gradient(-95deg, rgba(255,255,255,0) 50%, #12e0db 50%, #12e0db);
}

html:before {
  left: 50%;
  transform: rotate(180deg);
}


0

目前有一个repeating-conic-gradient,它创建了一个由重复渐变组成的图像。

div {
  height: 500px;
  background: repeating-conic-gradient(
    hsl(186deg 100% 50% / 31%) 0deg 15deg,
    hsla(0,0%,100%,0) 0deg 30deg
  ) #1c2c3c
}
<div></div>

您可以在W3 CSS Image Values中了解更多信息。
该属性并非所有浏览器都兼容。请查看caniuse以获取更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接