我不确定这是否可能,但我可以使用 CSS/Jquery 技术来创建渐变网格吗?类似的东西
我想随机生成这个网格然后可能对其进行动画处理,所以我试图避免使用图像。我不确定这样的事情是否可能。
我在想也许可以创建几层单独的渐变,然后将它们全部分层到一个固定位置并更改它们的不透明度设置?
现在
几年前,我使用 SVG、HTML5 画布标签和最近的 CSS3 渐变,尝试了一些类似的东西。我不相信目前有一种自然的方法可以超越简单的线性或径向渐变。
问题是是否可以仅使用简单的线性和径向渐变(这是唯一可用的工具)来模拟网格渐变。
不幸的是,当您使用 opacity 或 rgba 组合多个渐变时,不同渐变的颜色往往会以一种无用的方式组合,从而导致颜色褪色。避免这种情况需要能够在浏览器中将其呈现为单个复杂渐变。
渐变可以具有的形状也有很大的限制——任意角度的线性渐变和径向对称的椭圆渐变。两者都不允许自由形式的不规则形状。可应用于结果图像的 2D 变换在本质上也相当规则(缩放、倾斜等)。
在将来
在不久的将来,我所知道的最有希望的选择是可能支持 SVG 2.0 中的网格渐变(也许还有扩散曲线)。如果确实发生了这种情况并且最终得到浏览器的支持,那应该会开始大大扩展选项。HTML5 画布标签和 CSS3 可能很快就会出现。
正如@vals 在下面的评论中指出的那样,WebGL 应该提供一些非常有前途的选项(对于使用 3D 上下文的 HTML5 画布标签)。
相关链接
我做了一个简单的布局来演示这一点。
首先我放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 类一个背景线性,倾斜 5 度,并以 rgba 格式指定颜色以允许透明度。
然后,为了能够覆盖更多的渐变,我将伪元素指定为之前和之后,共享相同的布局属性。
对于后元素,我给出一个圆形渐变,与 mesh2 共享。对于前元素,我给出一个椭圆渐变,偏离中心。他们都可以是rgba。
最后,您会在网格 div 中看到所有内容重叠的结果
(我在任何地方都使用了 webkit 表示法来缩短它)
我不会说它很有艺术性,但我把这部分留给你:-)
在我的第一个答案中,我更多地以“艺术”的方式解释了这一点,而不是“数学”的方式。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%);}
我将每个 div 用作网格的本地贡献者,仅“触摸”中间邻居,并在此之后达到完全透明。
结果是这样的:
作为测试,前两种颜色都是红色。在一个完美的系统中,连接 2 个点的线应该一直是完美的红色。
确实不是完美的结果,但或多或少避免了结果的“浑浊”或“水洗”
我写了一个使用光栅图像创建轻量级、可扩展网格渐变的解决方案:https ://peterhrynkow.com/performance/2019/01/13/blowing-up-images-to-make-them-small.html
它不能解决您希望随机生成它们的问题,但至少可以为您提供 CSS 或 SVG 解决方案所期望的小文件大小和与分辨率无关的缩放。