2013-02-17 87 views
9

我不确定这是否可行,但我可以使用CSS/Jquery技术创建渐变网格吗? 类似的东西enter image description here在CSS/Jquery中创建渐变网格

我想随机生成这个网格,然后可能动画它,所以我试图避免使用图像。我不确定这样的事情是否可能。

我在想也许是创建几个单独的渐变层,然后将它们全部叠加到一个固定的位置并更改它们的不透明度设置?

+0

+1以上 – 2013-02-18 21:09:27

回答

3

目前

几年前,我使用SVG,HTML5 canvas标签以及最近的CSS3渐变,尝试了一些沿着这些线条的东西。我不相信目前有一种超越简单线性或径向梯度的自然方法。

问题是如果只能使用简单的线性和径向渐变(这是唯一可用的工具)模拟网格渐变。

不幸的是,当您使用不透明度或RGB组合多个渐变时,不同渐变色的颜色倾向于以无用的方式组合,导致颜色变淡。避免这种情况需要能够在浏览器中将其渲染为单个复合渐变。

渐变可以具有的形状也有很大的局限性 - 任意角度的线性渐变和径向对称的椭圆渐变。既不允许自由形式,也不允许形状不规则。可应用于最终图像的2D变换本质上也是相当规则的(缩放,倾斜等)。

今后

最有前途的选择,我知道在不久的将来是在SVG 2.0网格渐变(也许扩散曲线以及)可能的支持。如果这确实发生了并且最终得到浏览器的支持,那应该开始大大扩展选项。之后不久,HTML5画布标签和CSS3可能会出现。

而作为@vals在下面的评论中指出,WebGL的应该提供一些非常有前途的选项(HTML5画布标记使用3D上下文)。

相关链接

+1

你说得对,在叠加多个梯度时,你有无法控制平均/构成函数的问题。给定足够大的渐变集合,你也可以达到足够的准确性(在极限中,每个像素有1个渐变......),但这显然不切合实际。除了你说的可能性之外,还有WebGL。你在顶点之间有一个真实的插值,并且在形状上有完全的自由度。 – vals 2013-02-19 17:12:43

+0

@vals:感谢有关为什么渐变不能很好地覆盖的背景信息;我曾观察过这一点,但无法解释它。我已经尝试将梯度分解成每个都具有固定bg颜色的小方格,但渲染非常缓慢和/或看起来块状。从长远来看,WebGL听起来是一个不错的选择! – 2013-02-19 17:29:35

+0

重新阅读这篇文章,我第一次读到它时会想到一个小小的细节。你谈论通过不透明度来组合渐变。这有一个缺点,即不透明度是所有叠加层的单个值。将渐变指定为rgba会为您提供更好(但仍然有限)的结果,因为您可以随意更改alpha。 – vals 2013-02-21 17:19:15

4

我已经做了一个简单的布局来解释这一点。

首先,我会放4个div,第一个显示部分结果,最后看最后的结果。该标记就是:

<div class="box mesh1"></div> 
<div class="box mesh2"></div> 
<div class="box mesh3"></div> 
<div class="box mesh"></div> 

这里盒只是对尺寸,mesh1 3保持部分结果,在网,我们把它放在一起。

的CSS是:

.box { 
    width: 400px; 
    height: 150px; 
    position: relative; 
    display: inline-block; 
} 

.mesh1, .mesh { 
background: 
    -webkit-linear-gradient(5deg, rgba(0, 250, 0, 0.5), rgba(0, 100, 0, 0.5)) 
} 

.mesh:after, .mesh:before { 
    content: ""; 
    position: absolute; 
    left: 0px; 
    bottom: 0px; 
    top: 0px; 
    right: 0px; 
} 
.mesh2, .mesh:after { 
background: -webkit-radial-gradient(center center, circle cover, rgba(250, 0, 0, 0.6) 0%, rgba(120, 0, 10, 0.5) 100%);} 

.mesh3, .mesh:before { 
background: -webkit-radial-gradient(10% 10%, ellipse cover, rgba(0, 0, 250, 0.6) 0%, white 100%);} 

我给到mesh1类背景的直链,inclinated 5度,并在RGBA格式指定的颜色,以允许透明度。

然后,为了能够覆盖更多的渐变,我指定为前后的伪元素,共享相同的布局属性。

对于after元素,我给出了一个圆形渐变,与mesh2共享 对于before元素,我给出了一个椭圆渐变,偏离中心。 所有这些都可以是rgba。

最后,你看到在网格的div重叠的一切

(我到处都使用WebKit的符号,使之短)

我不会说这是非常艺术的结果,但我离开这个部分你:-)

fiddle here

+0

好的尝试乐于助人的形象 - 问题被它被搅浑了很快。 +1。 – Bosworth99 2013-02-21 17:42:34

2

在我的第一个答案,我解释这是怎么回事更多在 “艺术” 的方式比 “数学” 的方式。 Matt Coughlin的回答让我想到了一个更加数学的答案,至少我们会让“网格”部分的要求更为严格。

也就是说,我们有颜色的矩阵,我们希望在一个表格显示这一点。如果网格的间距为100px,那么矩阵的颜色[x] [y]会以100x和100y的形式提供给像素。它们之间的像素将以双线性方式进行近似处理。

对于这样的做法,在CSS是:

.mesh { overflow: hidden; position: absolute; width: 300px; height: 300px; } 

.tile { width: 200px; height: 200px; position: absolute; display: block; } 

.tile11, .tile21, .tile31 { 
left: -50px; 
} 
.tile12, .tile22, .tile32 { 
left: 50px; 
} 
.tile13, .tile23, .tile33 { 
left: 150px; 
} 
.tile11, .tile12, .tile13 { 
top: -50px; 
} 
.tile21, .tile22, .tile23 { 
    top: 50px; 
} 
.tile31, .tile32, .tile33 { 
top: 150px; 
} 

.tile11 { 
background: -webkit-radial-gradient(center center, 100px 100px, 
     rgba(255, 0, 0, 1) 0%, 
     rgba(255, 0, 0, 0.5) 50%, 
     rgba(255, 0, 0, 0) 100%);} 

.tile12 { 
background: -webkit-radial-gradient(center center, 100px 100px, 
     rgba(255, 0, 0, 1) 0%, 
     rgba(255, 0, 0, 0.5) 50%, 
     rgba(255, 0, 0, 0) 100%);} 

我利用一切格为网格的地方贡献者,只得到“接触”的inmediate邻居,和去一个完全透明超越这一点。

结果是这样的:

fiddle

的2种第一颜色都是红色的作为测试。在一个完美的系统中,连接2个点的线始终应该是完美的红色。

这是真的,这不是一个完美的结果,但该结果的“污浊”或“washyness”或多或少是避免