就像您可以在 CSS 中将元素的 背景 声明为纯色一样,您也可以将该背景声明为渐变。 使用在 CSS 中声明的渐变,而不是使用实际的图像文件,对于控制和性能来说更好。
渐变通常是一种颜色逐渐过渡到另一种颜色,但在 CSS 中您可以控制渐变过渡的所有方面,从方向到颜色(您可以使用任意数量的颜色),再到颜色变化的位置。 让我们逐一讲解。
渐变是背景图像
虽然在 CSS 中使用 background-color
属性声明纯色,但渐变使用 background-image
。 这在很多方面都很有用,我们稍后会讲到。 如果你声明其中之一,速记 background
属性会知道你的意思。
.gradient {
/* can be treated like a fallback */
background-color: red;
/* will be "on top", if browser supports it */
background-image: linear-gradient(red, orange);
/* these will reset other properties, like background-position, but it does know what you mean */
background: red;
background: linear-gradient(red, orange);
}
线性渐变
也许最常见和最有用的渐变类型是 linear-gradient()
。 渐变的“轴”可以从左到右、从上到下或您选择的任何角度。
不声明角度将默认为从上到下
这些用逗号分隔的颜色可以使用您通常使用的任何颜色类型:十六进制、命名颜色、rgba、hsla 等。
要使渐变从左到右,您需要在 linear-gradient()
函数的开头传递一个额外的参数,以“to”开头,指示方向,例如“to right”。
这种“to”语法也适用于角。 例如,如果您希望渐变的轴线从左下角开始到右上角,您可以说“to top right”。
如果该框是正方形,那么该渐变的角度将是 45°,但由于它不是正方形,因此角度也不相同。 如果您希望确保它是 45°,您可以声明它。
.gradient {
background-image:
linear-gradient(
45deg,
red, #f06d06
);
}
您也不限于仅使用两种颜色。 实际上,您可以使用任意数量的用逗号分隔的颜色。 这里有四种颜色
.gradient {
background-image:
linear-gradient(
to right,
red,
#f06d06,
rgb(255, 255, 0),
green
);
}
您还可以声明希望任何特定颜色“开始”的位置。 这些被称为“颜色停止点”。 假设您希望黄色占据大部分空间,而红色仅在开头占据一小部分空间,您可以使黄色的 color-stop
非常早。
我们倾向于将渐变视为逐渐过渡的颜色,但是如果您有两个相同的颜色停止点,则可以使一种纯色立即过渡到另一种纯色。 这对于声明一个模拟列的全高背景很有用。
浏览器支持/前缀
到目前为止,我们只介绍了新语法,但是 CSS 渐变已经存在相当长的时间了。 浏览器支持良好。 棘手的部分是语法和前缀。 浏览器已经支持了三种不同的语法。 这不是它们正式的名称,但您可以将其想象成:
- 旧版:最初的 WebKit 专用方式,使用类似 from() 和 color-stop() 的内容
- 中间版:旧的角度系统,例如“left”
- 新版:新的角度系统,例如“to right”
然后还有前缀。
让我们尝试一个图表
Chrome | 1-9:旧版,带前缀 10-25:中间版,带前缀 26:新版,无前缀 |
---|---|
Safari | 3-:不支持 4-5.0:旧版,带前缀 5.1-6.0:中间版,带前缀 6.1:新版,无前缀 |
Firefox | 3.5-:不支持 3.6-15:中间版,带前缀 16:新版,无前缀 |
Opera | 11.0-:不支持 11.1-11.5:中间版,带前缀,仅线性 11.6-12:中间版,带前缀,添加径向 12.1:中间版,无前缀 15:新版,无前缀 |
IE | 8-:不支持 9:仅支持滤镜 10+:新版,无前缀(也支持带前缀的中间版) |
Android | 2.0-:不支持 2.1-3.0:中间版,带前缀 4.0-4.3:新版,带前缀 4.4+:新版,无前缀 |
iOS | 3-:不支持 3.2-4.3:中间版,带前缀 5.0-6.1:新版,带前缀 7.0:新版,无前缀 |
其中有一些重叠。 例如,当浏览器支持新语法时,它们可能也支持旧语法,包括前缀。 最佳做法是:如果支持新语法,就使用新语法。
因此,如果您希望获得最深层次的浏览器支持,线性渐变可能看起来像这样
.gradient {
/* Fallback (could use .jpg/.png alternatively) */
background-color: red;
/* SVG fallback for IE 9 (could be data URI, or could use filter) */
background-image: url(fallback-gradient.svg);
/* Safari 4, Chrome 1-9, iOS 3.2-4.3, Android 2.1-3.0 */
background-image:
-webkit-gradient(linear, left top, right top, from(red), to(#f06d06));
/* Safari 5.1, iOS 5.0-6.1, Chrome 10-25, Android 4.0-4.3 */
background-image:
-webkit-linear-gradient(left, red, #f06d06);
/* Firefox 3.6 - 15 */
background-image:
-moz-linear-gradient(left, red, #f06d06);
/* Opera 11.1 - 12 */
background-image:
-o-linear-gradient(left, red, #f06d06);
/* Opera 15+, Chrome 25+, IE 10+, Firefox 16+, Safari 6.1+, iOS 7+, Android 4.4+ */
background-image:
linear-gradient(to right, red, #f06d06);
}
那里的代码太多了。 手动编写代码会容易出错,而且工作量很大。 Autoprefixer 可以很好地处理它,允许您根据要支持的浏览器数量来减少代码量。
如果对您很重要,Compass 混合器可以为 IE 9 创建 SVG 数据 URI。
为了使事情变得稍微 更复杂,OLD 与 NEW 语法中的度数工作方式略有不同。 OLD(和 TWEENER - 通常带前缀)方式将 0deg 定义为从左到右,并逆时针进行,而 NEW(通常无前缀)方式将 0deg 定义为从下到上,并顺时针进行。
OLD(或 TWEENER)= (450 – new) % 360
或者更简单地说
NEW = 90 – OLD
OLD = 90 – NEW
例如
OLD linear-gradient(135deg, red, blue)
NEW linear-gradient(315deg, red, blue)
IE 滤镜
Internet Explorer (IE) 6-9 虽然不支持 CSS 渐变语法,但它们确实提供了一种通过编程方式实现背景渐变的方法
/* "Invalid", but works in 6-8 */
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#1471da, endColorstr=#1C85FB);
/* Valid, works in 8-9 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient (GradientType=0, startColorstr=#1471da, endColorstr=#1C85FB)";
在决定是否使用它方面有一些注意事项
filter
通常被认为是一种会影响性能的坏做法,background-image
会覆盖滤镜,因此如果您需要将其用作回退,则滤镜将失效。 如果纯色是可接受的回退(background-color
),则滤镜是一种可能性
即使滤镜只适用于十六进制值,您仍然可以通过在十六进制值前添加透明度值(从 00(0%)到 FF(100%))来获得 Alpha 透明度。 例如
rgba(92,47,90,1) == #FF5C2F5A
rgba(92,47,90,0) == #005C2F5A
径向渐变
径向渐变与线性渐变不同,它们从一个点开始,向外扩散。 渐变通常用于模拟光线,我们知道光线并不总是直线,因此它们对于使渐变看起来更自然很有用。
默认情况下,第一种颜色从元素的(center center
)开始,并逐渐过渡到元素边缘的结束颜色。 渐变过渡速度相同,无论哪个方向。
您可以看到该渐变如何形成椭圆形,因为元素不是正方形。 这是默认值(ellipse
,作为第一个参数),但是如果我们说我们希望得到一个圆形,我们可以强制它成为圆形
.gradient {
background-image:
radial-gradient(
circle,
yellow,
#f06d06
);
}
请注意,渐变是圆形的,但仅沿着最远边缘逐渐过渡到结束颜色。 如果我们需要该圆形完全位于元素内,我们可以通过指定我们希望渐变过渡到“最近的一侧”来确保这一点,它与形状之间用空格隔开,例如
这里可能的取值有:closest-corner
、closest-side
、farthest-corner
、farthest-side
。 您不妨将其想象成:“我希望该径向渐变从中心点逐渐过渡到________,其他所有区域则进行填充以适应这种情况。”
径向渐变也不必从默认的中心开始,您可以通过使用“at ______”作为第一个参数的一部分来指定特定点,例如
为了更清楚地说明这一点,我将示例设置为正方形,并调整了颜色停止点
径向渐变的浏览器支持与 linear-gradient()
几乎相同,但 Opera 在刚开始支持渐变的时候,只支持线性渐变,不支持径向渐变。
但是与线性渐变类似,radial-gradient()
也经历了一些语法更改。 同样,有“旧版”、“中间版”和“新版”。
/* Example of Old */
background-image:
-webkit-gradient(radial, center center, 0, center center, 141, from(black), to(white), color-stop(25%, blue), color-stop(40%, green), color-stop(60%, red), color-stop(80%, purple));
/* Example of Tweener */
background-image:
-webkit-radial-gradient(45px 45px, farthest-corner, #F00 0%, #00F 100%) repeat scroll 0% 0% rgba(0, 0, 0, 0);
/* Example of New */
background-image:
radial-gradient(circle farthest-side at right, #00F, #FFF);
其标志是
- 旧版:使用
-webkit-
前缀,使用类似from()
和color-stop()
的内容 - 中间版:第一个参数是中心的定位。 在支持无前缀的新语法的浏览器中,这将完全失效,因此确保任何中间版语法都带前缀。
- 新版:详细的第一个参数,例如“circle closest-corner at top right”
同样,我建议使用 Autoprefixer 来处理这个问题。 您使用最新语法编写代码,它会创建回退。 径向渐变比线性渐变更令人费解,因此我建议尝试只习惯最新语法并使用它(如果有必要,忘记您对旧语法的了解)。
圆锥渐变
圆锥渐变类似于径向渐变。 两者都是圆形的,都使用元素的中心作为颜色停止点的源点。 但是,径向渐变的颜色停止点从圆形中心出现,而圆锥渐变的颜色停止点位于圆形周围。

它们被称为“圆锥形”,因为它们看起来像从上面看到的圆锥形。 好吧,至少当有一个明显的角度提供并且颜色值之间的对比度足够大以区分差异时。
圆锥形渐变语法用简单的英语更容易理解。
创建一个位于 **[某个点]** 的 **圆锥形渐变**,从 **[一种颜色]** 开始,角度为 **某个角度**,并以 **[另一种颜色]** 结束,角度为 **[某个角度]**。
在最基本的层面上,它看起来像这样。
.conic-gradient {
background: conic-gradient(#fff, #000);
}
... 其中假设渐变的位置从元素的正中心(`50% 50%`)开始,并且在白色和黑色颜色值之间均匀分布。
我们可以用几种其他方法来写它,所有这些都是有效的。
.conic-gradient {
/* Original example */
background-image: conic-gradient(#fff, #000);
/* Explicitly state the location center point */
background: conic-gradient(at 50% 50%, #fff, #000);
/* Explicitly state the angle of the start color */
background: conic-gradient(from 0deg, #fff, #000);
/* Explicitly state the angle of the start color and center point location */
background: conic-gradient(from 0deg at center, #fff, #000);
/* Explicitly state the angles of both colors as percentages instead of degrees */
background: conic-gradient(#fff 0%, #000 100%);
/* Explicitly state the angle of the starting color in degrees and the ending color by a full turn of the circle */
background: conic-gradient(#fff 0deg, #000 1turn);
}
如果我们没有为颜色指定角度,则假设渐变在颜色之间均匀分配,从 `0deg` 开始,到 `360deg` 结束。 这会在 `0deg` 和 `360deg` 处创建硬性停止,颜色会在那里彼此紧挨着。 如果我们的起始颜色从圆圈上的其他位置开始,比如在 `90deg` 的四分之一处,那么这会创建一个更平滑的渐变,并且我们开始获得那种酷炫的锥形透视感。
.conic-gradient {
background: conic-gradient(from 90deg, #fff, #000);
}

我们可以用圆锥形渐变做很多有趣的事情。 例如,我们可以用它来创建与颜色选择器或臭名昭著的 Mac 旋转海滩球指示器中看到的图案类似的图案。
.conic-gradient {
background: conic-gradient(red, yellow, lime, aqua, blue, magenta, red);
}

或者,让我们通过在三个颜色值之间添加硬性停止来尝试一个简单的饼图。
.conic-gradient {
background: conic-gradient(lime 40%, yellow 0 70%, red 0);
}

不幸的是,`conic-gradient` 在撰写本文时没有浏览器支持。 它目前是 CSS 图片和 替换内容模块级别 4 规范的一部分,该规范处于工作草案阶段。 同时,Lea Verou(他为规范做出了贡献) 提供了一个 polyfill,它使它们成为可能。
这些浏览器支持数据来自 Caniuse,它有更多细节。 数字表示浏览器从该版本开始支持该功能。
台式机
Chrome | Firefox | IE | 边缘 | Safari |
---|---|---|---|---|
69 | 83 | 否 | 79 | 12.1 |
移动设备 / 平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 127 | 12.2-12.5 |
重复渐变
使用 浏览器支持略少 的是重复渐变。 它们有线性变体和径向变体。
对于非重复渐变,有一个技巧可以创建渐变,这样如果它是一个很小的矩形,它会与自身的其他很小的矩形版本对齐以创建一个重复模式。 因此,本质上创建该渐变并设置 `background-size` 以使该矩形变小。 这使得创建条纹变得很容易,然后可以旋转或进行其他操作。
使用 `repeating-linear-gradient()`,您不必诉诸于这种技巧。 渐变的大小 **由最后一个颜色停止决定**。 如果它位于 20px 处,则渐变的大小(然后重复)为 20px x 20px 的正方形。
径向渐变也是一样。
不正确的回退加载
正如我们所述,一些非常旧的浏览器根本不支持任何 CSS 渐变语法。 如果您需要仍然是渐变的回退,则图像(.jpg / .png)可以解决问题。 令人担忧的是,一些稍微旧一点的浏览器(它们刚刚开始支持 CSS 渐变)会加载回退图像。 也就是说,即使它会渲染 CSS 渐变,也会为图像发出 HTTP 请求。
Firefox 3.5.8 这样做过(见截图),以及 Chrome 5 和 Safari 5.0.1。 见

好消息是这不再是什么问题。 唯一有问题的浏览器是 Chrome 和 Safari,Chrome 从 6 开始就没有这样做,Safari 从 5.1 开始就没有这样做,已经过去三年了。
其他资源
- 从 CSS3 Please! 获取包含所有前缀/语法的 CSS 代码块。
- Can I Use 关于渐变
- Mozilla 文档,关于 线性渐变、重复线性渐变、径向渐变 和 重复线性渐变。
- 渐变图库(您可以使用渐变创建一些疯狂的图案)
提醒一下:不同的渲染引擎有不同的语法,“渲染”拼写错误。
:)
很棒的文章! 我真的很希望有更多浏览器和用户使用 CSS3。
是的。 现在做绝对值得。 借助服务器端脚本和一些 JavaScript,CSS3 的可能性呈指数级增长。
很高兴知道。
Jeffrey Way 不久前在这里使用这些内容制作了一个很棒的屏幕截图 http://bit.ly/9zFMQR
感谢发布该链接。 提供的信息对我来说非常有用,这篇文章本身也是一样。 我学到了很多。
Chris,很棒的文章! 绝对会去试试的!
我们不能向 Mozilla 和 Webkit 报告(或询问)不要请求回退图像吗? 像错误/功能请求一样?
如果您不想变得太花哨,Firefox 的简写方法。
您可以用 bottom、left 或 right 替换 top。
很棒的文章! Webkit 有最好的语法。
不错的文章,但是 180 度示例的演示在 Safari 4.0.4 中仍然显示 90 度。 此外,如果我们不邀请 IE(trident)参加这个聚会,因为没有性能提升,那么 Safari/Webkit 也一样,因为它也会加载图像。 此外,我还没有测试过,使用条件注释来使用它的过滤器使用 `!important` 覆盖来定位 IE 会迫使 Trident 引擎使用渐变而不是图像吗?
Trident 的问题有两个方面。
• 无论如何,它都会加载回退图像。
• 如果声明了回退图像,它会使用该图像而不是渐变过滤器。
所以是的,如果您能找到一种方法让它至少使用渐变过滤器而不是图像,那么使用它会有一些优势(颜色的编程声明)。 但正如本文所述,没有优势。
我们可以定位 IE(可能是条件注释或下划线技巧)并将背景设置为“none”,并声明过滤器。 工作量会多一些,但这意味着不会加载图像,这很值得。
对不起! 我没有看到你最后一段。
实际上,有一个专有的 IE 过滤器可以在 IE 5.5+ 中使渐变起作用。 您只能获得起始值和停止值,而不是我们在 Webkit 和 Mozilla 中拥有的细粒度控制。
aaaaanndd 我假设这就是你用“过滤器”的意思。
不过我喜欢回退图像解决方案,它似乎是最合乎逻辑的。
正如 Sean 所提到的,演示代码中有一个小错误。 它是 180 度代码错误。 使用当前代码,Webkit 浏览器会在两个示例中都显示 90 度渐变。
我相信应该是
background-image: -webkit-gradient(linear, 0% 0%, 100% 0%, from(#1a82f7), to(#2F2727)) !important;
或者,在这种情况下,更容易理解
background-image: -webkit-gradient(linear, left top, right top, from(#1a82f7), to(#2F2727)) !important;
感谢您发表了这篇文章!
谢谢,我修复了它…… 只是我在学习如何使用它时,我改变了一些东西,只是在搞乱它。
我会保留你建议的关键字版本,这样就有两种方式的示例。
非常实用,值得现在就实施。
我至今对*渐进增强*的问题是,它只对个人网站和博客实用。试着向客户解释,他们在模型中看到的漂亮渐变,实际上不会被很大一部分访问者看到。现在每个人都能看到预期的设计,无需使用条件样式表。
CSS 渐变很酷很性感,但我还没有完全信服。如果它们不是通过供应商特定语法声明的,并且它们的语法是标准化的,我会做所有的增强魔法(就像我对 rgba() 和 text-shadow 做的那样)。但现在对我来说,它们的代码太乱了。尽管整个想法很棒。
我完全同意。所有语义化、干净代码的爱好者都在使用这些特定于浏览器的“CSS hack”真是奇怪。
虽然我认为保持渐进性并尝试新事物很酷,但同时它也有一些矛盾的地方。
从 Safari 5 和 Chrome 10 开始,语法已经标准化,而且由于这些浏览器的用户会被强烈提示更新(或者在 Chrome 的情况下,自动更新),因此可以说我们不需要提供旧的 Webkit 语法,只需要依靠图像回退来解决极少数会被影响的人。
虽然我认为这很棒,但我有点厌倦了所有这些东西都需要在样式表中写三行才能生效的事实。这种特定于供应商的语法很烦人。然后还要为 IE 垃圾解决方法烦恼?呸!
我和上面的迈克一样……当你有一个使用旧浏览器的客户,他们不能或不愿升级时,你试着告诉他们这对于其他人来说看起来很棒,但对你来说只是还可以。
或者,嘿,客户先生,这在你正在使用的浏览器上看起来很棒,但对于你的很多访客来说,一些东西会丢失或者看起来不一样。
客户不想听到这些。他们希望它在所有浏览器上都保持一致。渐进增强对他们来说并没有太大意义。更糟糕的是,我工作的公司会监控客户的访问者使用哪些浏览器……而 IE6 仍然占大约 25-30%。
我认为这没有用。
一个专业的网页设计师会使用雪碧图,所以请求在这里不是问题(如果你在页面上使用了 8 个渐变,如果你知道自己在做什么,你可能不会保存 8 个文件)……
在 IE 上无法工作是一个问题。在基于 webkit 的浏览器中无法正常工作(仍然发出请求)也是一个问题。
我会坚持使用雪碧图。而且我大部分的渐变都有很多效果,我认为 CSS(目前)无法轻松地再现。
抱歉,我不得不纠正你,克里斯,但 Firefox 3.6 支持径向渐变。
语法很简单,你只需使用 -moz-radial-gradient 而不是 -moz-linear-gradient。
查看这篇文章,了解更多信息:Firefox 3.6 中的 CSS 渐变
你也可以看看我的使用 CSS3 创建类似 Photoshop 的精美按钮教程,其中在 Firefox 中使用了径向渐变。
无论如何,这是一个关于 CSS 渐变的不错的总结,谢谢!
Mozilla 支持径向渐变,只是属性不同:-moz-radial-gradient。
查看Mozilla 开发者中心上的参考页面。
当我只需要一种语法,并且不需要单独的浏览器声明时,我会支持 CSS 渐变。
目前你暗示的方向是带有渐变的丑陋的矩形框
一旦设计需要更多细节,这就会变得很棘手
我知道 CSS3 也会有阴影和圆角等等,但我们距离所有这些功能完美地协同工作(相互之间以及与回退图像/颜色)还有很长的路要走
所以我的意见是“等待”
因为我的老板不会同意一个看起来不像设计的网站(是的,像素级一致,是的,在所有主要浏览器中,包括我最大的敌人 IE6)。
桑德
我发现,反对渐进增强想法的人实在太多了,他们都提到了愤怒的老板和客户。
但请记住……
在这种情况下,这不是“外观”渐进增强,而是“工作方式”渐进增强。因为我们可以使用回退,所以这里的外观将保持一致。
正是这种细微之处让现代网页设计如此有趣。能够在 Photoshop 之外完成这些事情将彻底改变网站的设计方式。
克里斯,我认真尝试过使用渐变。我尽我所能尝试过,一次又一次。我发现,在很多情况下,为多个浏览器指定样式会导致它们之间不兼容。
也就是说,为 Mozilla 和 Webkit 指定样式会导致其中一个或另一个被忽略。而将 Opera 加入其中会导致所有浏览器都被忽略。而将提出的 W3 规范加入其中……好吧……什么都没有。
我尝试过按所有顺序使用规范(先使用一个,再使用另一个,等等)。我尝试过使用一个 background 语句,然后分别使用一个。没有效果。所以,我放弃了,退回到使用图片。
我是一个渐变爱好者。我非常乐意通过规范使用它们。也许是我做错了什么。但目前还没有效果。
由于 CSS 3 的支持仍然不是很好,我建议使用不同的方法——使用 SVG 作为背景,并使用少量 JavaScript(支持所有主要浏览器)。
看看 AListApart.com 上的这篇文章。
http://www.alistapart.com/articles/using-svg-for-flexible-scalable-and-fun-backgrounds-part-i/.
好主意!我从来没有想过这一点,因为我不习惯使用 SVG。但我愿意尝试这种方法。
所以,剩下的问题是
为什么要费心使用回退呢?
如果某些浏览器不支持 CSS2 的所有方面,并且没有开始支持 CSS3,那么我们为什么要为他们的用户提供服务呢?
“但这样东西看起来就不一样了!”
我说,那又怎么样?
作为设计师和开发者,我认为我们应该停止尝试让所有浏览器都显示相同的外观。只要考虑了标准合规性和优雅降级,这就不应该成为问题。如果某些元素在某些浏览器中不显示,那么那些用户不会获得与其他人一样丰富的用户体验。只要网站仍然能正常工作,这并不重要。
太棒了……不。为什么你要为他们的用户提供服务?因为网站就是为他们而建的!
我喜欢渐进增强(而不是优雅降级),并且真的想/尝试尽可能多地使用 CSS3,但我永远不会(例如)让一个 IE7 用户遭受比一个 Chrome 用户更糟糕的*体验*,仅仅为了追求前沿技术。
如果我的设计师创建了一个很棒的设计,那么在我看来,尽可能多的人应该有机会体验它。
而且,通常情况下,“优雅降级”后的版本看起来很糟糕——从按钮上移除圆角、渐变和阴影,你得到的只是一个盒子。
所以,现在我的长篇大论结束了,非常感谢你,克里斯!这是一篇非常有见地的文章!
我站在中间。优雅降级应该在专业上得到考虑。一个人应该看看他们的目标市场/用户群/预算,评估应该花费多少时间来改进旧浏览器的体验。
@马特——相信我,如果你构建了一个网站,它在你自己的浏览器中看起来是预期的那样,但在他们的浏览器中却不是,你会从客户那里听到关于这件事的。
@乔纳森——我不会说用户因为缺乏设计而“遭受”痛苦。我同意,网站在旧浏览器中仍然应该具有一定的吸引力,但是,在预算有限的情况下,告诉使用旧浏览器的用户,如果他们升级,他们将能够体验“完整”的体验是可以接受的。
克里斯,这篇文章写得很好。
克里斯,文章很棒!我得试试这个。
我相信这里的大多数人都见过modernizr,它可以检测哪些浏览器支持哪些 HTML5 和 CSS3 属性。这解决了回退图片的问题,但也引入了一个 3.9 kb 的 JS 文件,以及 HTTP 请求和客户端处理。我很好奇,这里其他人对 modernizr 的看法如何,以及它是否值得进行请求、大小和处理。
我们希望 modernizr 2.0 拥有一个构建系统,这样你就可以只包含你想要的测试。
在那之前,我认为用我们内部使用的检测技术自己动手完全没问题。
再说一次,3.9k 并不是很大。:)
听到 2.0 版本的消息很令人兴奋!3.9k IMO 很小,我一直在所有新网站上使用它。试图找出其他使用它或考虑使用它的人的想法。
如果使用 CSS3 渐变,那么很可能也在使用其他 css3 功能,如 border-radius、box-shadow 等,我认为这足以证明 js 文件的必要性。不过,我还没有成为优化专家。
我需要动起来开始使用 modernizr……我喜欢它的一切。
在使用这些更酷的 CSS3 技术的早期阶段,你可能想问的另一个问题是浏览器渲染 CSS3 的速度和效果如何。
如果 CSS3 快捷方式比实际的图像检索花费更长的时间,那么我们最好直接获取图像。
至于浏览器特定的声明,像 https://lesscss.org.cn/ 这样的东西将是理想的。
太好了,谢谢,我肯定会开始使用 CS3,CSS3 有跨浏览器问题吗?
在这里找到了一个不错的交互式渐变生成器:http://gradients.glrzad.com/
我更喜欢
http://westciv.com/tools/gradients/index.html
我从这个列表中受益匪浅。
感谢您的分享!
我最近在一个网站上使用了渐变,因为它在视觉上创造了优势,因为渐变可以拉伸以匹配背景的高度。这是网站
http://www.bronzetouchwf.com/
比较短页面和长页面,或使用 Ctrl+鼠标滚轮(在 Windows 上的 Chrome 中有效)缩小(文档 > 缩放以修复)。
很微妙,但很好……与没有渐变的 IE 或其他浏览器相比,你可以看到区别。
已经在使用它了。广而告之!
我赞成已经在使用它
Chris,一如既往的好东西,非常感谢
在不得不加载 PS 甚至创建一个简单的图像时,我会变得很懒。CSS 渐变要容易得多,而且我很乐意用纯色来为那些能看到渐变的人提供备份。
此外,我写了一个小程序来显示各种网络统计信息,我讨厌看到图像资源占据大部分 http 请求的榜首。我现在正在努力削减图像资源,只要有可能。这当然有助于做到这一点。
只是一个奇怪的提示,但这个网站的页脚在 IE7 中看起来奇怪吗?
nm……当你缩小窗口大小的时候。页脚不会移动。
上个月我刚开始使用 css 渐变,在那之前我看到了几篇关于它们的 Nettut 文章。
到目前为止,我只在 div 上使用它们来添加阴影,为使用 Firefox、Chrome 和 Safari 的用户增加一些深度。不过,我会避免在依赖它们的元素上使用它们。
我问自己的问题是:“没有它,艺术会受到影响吗?”如果答案是“是”,我会以牺牲页面加载速度为代价使用更旧、更可靠的方法。
不错!我一直没有使用 CSS 渐变,因为大多数浏览器下载了图像。我尝试过的。
它只是一个浏览器,只是一个 http 请求,但它不需要太多努力,并且会提高性能。
非常棒的文章。我一定要尝试一下。
我现在使用 js 渐变,它在所有浏览器中都能使用相同的语法,对我来说很容易让所有加载更轻,使用 svg 也是一项很棒的交易,但如果没有 adobe 插件,它在 ie 上不工作。
另一种看待它们的方式是,如果在网站上使用微妙的渐变,那么回退可以根本没有渐变,只是一个纯色。所以网站在 IE8 及更早版本、FF3.5 及更早版本、Opera 9 及更早版本等中不会很好看。任何不支持渐变规则的非 CSS3(甚至部分)浏览器都会看到纯色。但很快,IE9 就会发布,可能在一年半内,这种简单的纯色微妙渐变回退可能是可以接受的。
Chris,很棒的文章。我将在下一个项目中使用一些 css3 渐变。
-Anthony
很棒的文章!我之前花了很长时间研究这个,真希望我早点看到你的文章——它能节省我很多时间。
对于那些不想花太多时间构建 CSS 渐变(像我一样)的人,我创建了一个小工具
http://www.display-inline.fr/projects/css-gradient/
它还支持使用 SVG 背景的 Opera 渐变。
嘿,Chris,写得不错!
我将添加一个新技巧:将渐变作为 data-URI 直接嵌入到 background 属性中怎么样?这也可以节省带宽,并且可以在所有现代浏览器(除了……IE 当然)中使用。
此外,你可以使用 IE 的过滤器,因为 IE 不会用这个“奇怪”的 background 属性接收消息。
PS:是的,IE 知道 MHTML 的专有 data-URI 等效项,但在 IE7 上 >=Vista 上存在错误……
感谢这篇文章,尤其是演示。无论何时需要制作渐变,我都会去你的演示中复制代码。这非常有用!
似乎这种回退不仅适用于渐变,还适用于 RGBA 背景。
例如,当想要半透明背景时,可以使用
Firefox 3.6 不会下载背景图像。
感谢这篇文章。
FYI,我在顶部的“查看演示”链接上看到一个小的拼写错误,/examples/CSS3Gradient/ 在那个页面上,你有两个渐变的相同 webkit 属性,即使渐变不同。
很棒的文章!我对 CSS 3 渐变有了更多了解。
如果使用
-webkit-gradient(linear, 0 0, 0 100, from(#0f82f7), to(#072727));
而不是
-webkit-gradient(linear, 0% 0%, 0% 100%, from(#0f82f7), to(#072727));
渐变不会拉伸。
你可以使用 SVG 作为回退,如下所示
background-image:url('data:image/svg+xml,');
即,编写通常的 SVG 作为 data:url,你只需要将“#”替换为“%23”。优点:你可以在 CSS 中直接修改渐变。缺点:语法非常大。
代码错误,正确的是
background-image:url(‘data:image/svg+xml,<svg xmlns=”http://www.w3.org/2000/svg”><defs><linearGradient id=”g” x2=”0″ y2=”100%”><stop offset=”0″ stop-color=”%232F2727″/><stop offset=”100%” stop-color=”%231a82f7″/></linearGradient></defs><rect width=”100%” height=”100%” style=”fill:url(%23g)”/></svg>’);
我不明白。如果图像不受支持,为什么还要添加另一个图像?
谢谢!你帮我节省了大约 13 个月的独自摸索时间!
CSS 渐变现在终于得到了很好的支持,感谢你的提醒。
只有一点,Mozilla 不是渲染引擎,它叫 Gecko。
那么,补充一下 Sunny Singh 的评论,Opera 也不是渲染引擎,它叫 Presto(布局引擎)。=)
我正在使用 CSS3 渐变,Opera、Safari 和 Mozilla 对它们的支持都很好。
我使用了一个渐变生成器,它生成 moz 和 webkit 渐变,以及一个 IE 的过滤器。但是我仍然删除了 IE 的过滤器,并改用图片。
是的,当每次需要为同一个元素指定 3-4 个背景时,CSS 会变得很大。但这不会和背景图片一样大,而且我写代码很整洁,所以很容易更新,我为支持它的浏览器节省了请求和流量。所以为什么不使用它们呢?我只是在想。
如果可能,我永远不会在创建网站时打开 Photoshop。因为我可以编写我需要的图形代码,并且为了修复 Chrome 和 IE 等,我会在网站上截取一个漂亮的截图。然后在 Mac 上的 Preview 中开始切分图形。效果很好。然后我会优化图片,使它完美工作 :)
这是我创建网站的方法。而且它们相当快 :)
如果你将备用图片作为数据 URI 包含在内,所有浏览器都会加载它并跳过 CSS 渐变。在渐变声明中添加 !important 会强制浏览器使用它。此外,在 IE9 中,如果你使用 IE 过滤器和圆角,它就无法工作。IE9 不会将背景裁剪到边框。
一个简单的解决方法是在支持的浏览器中声明渐变,并在 IE 条件样式表中添加备用图片。IE 的性能会受到影响,但这只是使用糟糕浏览器需要付出的代价。
这里还有另一个很棒的技巧。演示很好,希望可以下载源代码,以便我立即测试它。
我最近开始使用 CSS 渐变,除了浏览器特有的语法之外 (http://www.colorzilla.com/gradient-editor/ 帮助很大),它们运行良好。
与雪碧最大的优势在于它们可以垂直缩放。即使是 IE6 也能很好地处理线性渐变,这可能是它们最常见的用途。
我在网站的菜单上使用渐变。我想尽可能地减少图像的使用,使用 CSS3 技术(从你那里学到很多)。对我来说,结果实际上是一个视觉上更刺激、更令人满意,并且在目标上更成功的网站,比我拥有 Photoshop 的全部力量时要好。完全不使用图片可以说是限制更多,但这几乎迫使我创造一个更干净、更实用的设计,而不是过度堆砌视觉效果。
至于备用,我坚持使用纯色。
你在哪里找到了 Opera 11.10?
Opera.com 页脚中的链接。
这是一篇我发现的关于使用 SVG 在 IE9 中以非 ms-filter 方式实现渐变的有趣文章。
http://css3wizardry.com/2010/10/29/css-gradients-for-ie9/
还没尝试过,不知道它如何影响 HTTP 请求,可能只会增加不必要的复杂性,但可能值得研究?
我很高兴看到你没有使用 IE9 SVG 修复来实现渐变。我相信一个替代的(老式)背景图片就足够了。
这是正确的解决方案,谢谢,它也适用于我的新网站。我一直都在寻找,但 PageSpeed 中没有解决方案。
我一直试图让渐变背景在我的网站草稿中起作用。但我没有找到太多关于跨浏览器支持的信息。
http://www.denisebeaudet.com/new-index.html
例如:这在 Mac 上的 FF4 中运行良好,但在 Windows 上的 FF4 中则*不存在*。很烦人。
另一个相当令人困扰的地方是,如果你的浏览器窗口设置为小于全屏,然后你滚动查看“折叠下方”(即视窗底部边距下方)的内容,它会恢复到开始颜色。非常令人讨厌,而且视觉上具有干扰性。
有什么想法吗?拜托?
谢谢!
使用正确的代码可能会有所帮助。你遗漏了 Chrome 的新语法,你并不真正需要 Chrome 的旧语法(恕我直言),因为 Chrome 会自动更新。你还在 Opera 中使用 SVG,为什么?Opera 支持渐变。
重新阅读本文,你会很快发现你的问题。
好吧,它肯定会加快网站速度。但是兼容性问题呢?对于 IE,我们需要使用 JS 代码来获取背景渐变。
感谢这篇博文。
我在最新的网站上使用了一些渐变。
效果很好。
不幸的是,仍然有人用 IE6 浏览我的网站。
但只有 3% 的人,我很幸运。
太棒了!感谢你的细致分析!
这里有一个很酷的技巧,我之前不知道。我打算在我的一个网站上试试。
注意:虽然你已经排除了 IE,但我不能,因为我们 95% 的访客使用 IE7-9。我发现可以用以下方法使用简单的线性渐变。
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#FFFAE5′, endColorstr=’#FFDB95′);
希望这能帮助一些必须生活在现实世界中的人。
Dick
网络变得更加多彩了。我有一个工具可以为任何线性渐变生成 CSS,甚至可以使用我为 IE 编写的简单行为文件在 IE6 中创建渐变。
尽情享用(在我的联系信息中查看链接)!
Ron
很棒的资源和渐变技巧。不过,我一直试图在我的 CSS 渐变中添加噪声,但没有在网上找到太多帮助,所以我想要分享我的解决方案。
哇!CSS3 就像魔法一样!感谢这篇教程!
你只需要两行代码就可以覆盖几乎所有支持渐变的浏览器
第一行实际上只需要用于 iOS 6-、Safari 6.1- 和 Android 4.3-。
正如你所指出的,IE 的
filter
很糟糕(顺便说一下,这不仅仅是性能问题,它还会关闭 ClearType),因此如果你的渐变至关重要,而不是纯粹的装饰性,你需要备用图片。这些备用图片还将覆盖仍然需要前缀的极少数浏览器,例如旧版本的桌面 Opera (
-o-
)、Konquerer (-khtml-
) 以及没有获得 Chrome 和 Firefox 自动更新的人(根据 StatCounter,几乎没有人)。Opera Mini 没有帮助(我们希望避免对图片的 HTTP 请求),因为它不支持带或不带前缀的
linear-gradient
。许多网站包含
-ms-
变体,但这只对 IE 10 的一个开发人员预览版是必要的,而不是任何公开发布版本。一些细微的说明
请记住,对于过渡语法要非常小心。对于你的从上到下的示例,这很好,但我不想让人们以为,哦,我会用我已知的语法来处理前缀。然后像这样写。
因为这不会起作用。那里的非前缀版本使用的是过渡语法,并导致错误。你需要这样做。
我个人觉得很难记住,而且很容易弄错。
另外,我不确定是否有公开发布的浏览器需要
-khtml-
来实现渐变,是吗?很棒的新工具: 渐变生成器
请不要放在心上。我仍然更喜欢现在的背景图片版本。无论如何,我仍然可以将图片大小设置为 1 像素宽度,并将其转换为
base64
版本。更便于控制,但可能对性能没有帮助。使用 CSS 渐变(特别是多个 CSS 渐变)会使网页变得很重,滚动起来也很费力。
CSS 渐变可能只适用于大小可扩展的容器上的渐变,容器大小不是固定的。事实上,我更常为固定大小或特定高度创建渐变,然后将剩余部分留为纯色,不带渐变。
我需要看到一些真实测试来证明图片渐变在滚动性能方面更出色。你有测试结果吗?我确信这是可能的,但我不喜欢随便发表这种言论。
抱歉。不同的操作系统可能会产生不同的结果。至少这是我的感觉(缓慢)。在**Google**上搜索关键字CSS3+gradient+slow+scroll,我得到了一些链接。
http://stackoverflow.com/a/4023133/1163000
https://bugzilla.mozilla.org/show_bug.cgi?id=657603
http://yannesposito.com/Scratch/en/blog/2010-07-07-CSS-rendering-problems-by-navigator
http://www.tricedesigns.com/2013/03/11/performance-ux-considerations-for-successful-phonegap-apps(见**保持图形简单**)
作为一个实际例子,你可以尝试访问http://lea.verou.me/css3patterns,使用相当小的屏幕,然后向下滚动并感受一下。
然后点击**Carbon**或**Carbon Fibre**图案,再滚动并感受。
示例图像图案网站,滚动性能更好:http://subtlepatterns.com
**CodePen**示例:背景图像 vs. CSS3 渐变
我很惊讶没有人提到CSS3Pie,它在将 CSS3 渐变带到旧版本的 IE 浏览器方面做得很好。
CSS3 pie 也使用 IE 过滤器来实现旧版本的 IE 中的渐变,但我们可以自己编写(如果我们真的,真的需要)。
我在使用
background
或background-image
的色调回退支持方面遇到过问题,特别是在 IE7 和 IE8 中。因此,我这样开始编写代码http://codepen.io/anon/pen/cuCql
不要使用两个背景属性来进行回退和 svg,将它们放在一行上。这对于旧版本的 IE 来说是完美的,而 svg 适用于 IE9。
我通常不会来这里评论,但这篇文章非常完整和周到,我不得不表示感谢:谢谢你!
太棒了。但是它在 ie9 上不起作用。你对 ie9 有什么规则吗?
关于 CSS 渐变的新方法的伟大更新,Chris,你做得真的很棒,非常彻底,继续努力!
这是我总是用来帮我生成它们的东西:http://colorzilla.com/gradient-editor/.
它将为你生成 CSS,并提供可选的 IE9 支持。
我认为使用图像而不是 css 属性有其优缺点。首先,使用 css 创建渐变会使其难以在旧的浏览器和计算机中工作。我通常倾向于使用 Photoshop 而不是 css 属性来创建渐变。使用 css 很快,不需要使用第三方软件,如 Photoshop 或其他图形程序。
这就是我使用的方法(使用 LESS)
然后只要在需要渐变作为背景的地方调用它即可
这篇文章中有一个错误。从 11.60 版本开始,Opera 支持用于渐变的新“to”语法。从 12.10 版本开始,渐变属性没有前缀。如果它们已弃用,与标准化语法不同,它们不会没有前缀。
最新的基于 Presto 的 Opera 支持所有与渐变相关的函数(线性、径向,可选重复)并且在这方面与 W3C 标准兼容。
因此,正确的列表如下
11.00-: 不支持
11.10-11.50: 过渡,带前缀,仅线性
11.60-12.00: **新旧过渡**,带前缀,添加径向
12.10-12.16, 15+: **新**,无前缀
12.16 版本仍在使用,因此很重要。
(还有一个小的错别字:“repeating liner gradients”)
哇!这是我第一次听说径向渐变。这真是太棒了。我一定会试试的。说实话,我曾经记得如何编写一个几乎完全跨浏览器友好的渐变。但现在我只是使用一个在线工具来为我生成所有内容。
是的,我同意。你可以创建这样的东西并摆脱所有这些图像,这很酷。
很高兴看到许多浏览器不再需要供应商前缀。这确实减少了文件大小。
很棒的演示,我一直在寻找一个全面的脚本,可以在我们新的蓝天渐变设计中实现。我希望一些浏览器不会有限制。
我不喜欢考虑诸如可能的回退之类的要求。希望有一天我可以忘记 less 和类似的东西,变得更加现代和直观。我们走在正确的道路上。无论如何,“repeating-radial-gradient”对我来说是新的。
太棒了,你可以指定角度并进行径向渐变。