这不是“规范”,但 WebKit 浏览器支持 **图像蒙版**。 如果你熟悉 Photoshop,它们的工作方式与之类似。 你声明一个图像用作蒙版。 该图像的黑色部分隐藏它覆盖的内容,白色部分显示其下方的内容,灰色部分部分透明。 因此,如果您有这张图像
<img src="orig.jpg" alt="trees" class="circle-mask">
并且你创建了这张图片作为蒙版
你将在 CSS 中将其应用于该图像,如
.circle-mask {
-webkit-mask-box-image: url(mask.png);
}
结果将是
你不需要实际的图像
我们将要利用的第一个技巧是,我们为 -webkit-mask-box-image
声明的图像不需要是实际的图形图像。 相反,我们可以使用 –webkit-gradient
来创建该图像。 是的,我们也可以制作一张渐变图像,但以编程方式创建渐变蒙版意味着更容易动态调整,并且只需要少一次 HTTP 请求。
-webkit-mask-position: 0 0;
-webkit-mask-size: 200px 200px;
-webkit-mask-image: -webkit-gradient(linear, left top, right bottom,
color-stop(0.00, rgba(0,0,0,1)),
color-stop(0.45, rgba(0,0,0,1)),
color-stop(0.50, rgba(0,0,0,0)),
color-stop(0.55, rgba(0,0,0,0)),
color-stop(1.00, rgba(0,0,0,0)));
在上面的 CSS 中,我们创建了一个 200px x 200px 的图像,该图像从左上角完全不透明开始,以 45 度角渐变,大约在中点位置渐变为完全透明。 它看起来有点像这样
移动蒙版
请注意,我们使用 –webkit-mask-position
设置了蒙版的 position。 由于我们可以设置位置,因此我们可以移动位置。 我们可以在 :hover
上移动它 –
.circle-mask {
-webkit-mask-position: 0 0;
}
.circle-mask:hover {
-webkit-mask-position: -300px -300px;
}
或者我们可以使用 -webkit-animation
来自动移动该蒙版。
@-webkit-keyframes wipe {
0% {
-webkit-mask-position: 0 0;
}
100% {
-webkit-mask-position: -300px -300px;
}
}
.circle-mask {
-webkit-animation: wipe 6s infinite;
-webkit-animation-delay: 3s;
-webkit-animation-direction: alternate;
}
创建擦除
我相信所有聪明人都已经把这一切联系起来了。 想法是,我们有一个图像在另一个图像之上。 顶部的图像获取蒙版,然后我们根据需要移动蒙版。
<div id="banner">
<div><img src="images/banner-1.jpg" alt="Skyline 1"></div>
<div><img src="images/banner-2.jpg" alt="Skyline 2"></div>
</div>
#banner {
width: 800px; /* Size of images, will collapse without */
height: 300px;
position: relative; /* For abs. positioning inside */
border: 8px solid #eee;
-webkit-box-shadow: 1px 1px 3px rgba(0,0,0,0.75);
}
#banner div {
position: absolute; /* Top and left zero are implied */
}
/* Second one is on top */
#banner div:nth-child(2) {
-webkit-animation: wipe 6s infinite;
-webkit-animation-delay: 3s;
-webkit-animation-direction: alternate;
-webkit-mask-size: 2000px 2000px;
-webkit-mask-image: -webkit-gradient(linear, left top, right bottom,
color-stop(0.00, rgba(0,0,0,1)),
color-stop(0.45, rgba(0,0,0,1)),
color-stop(0.50, rgba(0,0,0,0)),
color-stop(0.55, rgba(0,0,0,0)),
color-stop(1.00, rgba(0,0,0,0)));
}
演示和下载
在下载文件中,还有一个示例,其中擦除水平而不是倾斜,并且在悬停事件上使用 -webkit-transition 而不是动画。
不止两个?
我比我应该花的时间更多的时间试图看看是否可以使动画依次擦除三个图像。 这有点可能,但我无法像我希望的那样使其平滑且一致,因此我放弃了。 我仍然相当确定这是可能的,可能是使用两个具有不同延迟的不同动画等等。 如果你尝试并使其成功,请展示一下!
更多
查看 公告,了解有关蒙版本身的更多信息。 其中有一些有用的信息,例如蒙版图像可以拉伸(就像 全页背景)和重复。 它实际上非常类似于 border-image,具有用于拉伸/重复的九宫格系统。
致谢
我从 Doug Neiner 那里借鉴了这个想法,他向我展示了这个想法的简单演示。 经许可发布。
哇哦,太疯狂了! 我从不知道 WebKit 浏览器可以做蒙版! 人们是怎么发现这些东西的!
很棒的文章 :D
太棒了!! 非常感谢。
很酷。 遗憾的是蒙版不是主规范的一部分。
太棒了!!!
感谢 Chris,你又一次为我们打开了通往新视野的大门。
网络以神秘的方式运作!! 我一直在尝试弄清楚如何为我正在开发的网站创建某种“不透明度层”,这看起来像是指向我的解决方案的方向。 我认为,这只有在 webkit 中才能实现,而不能在 mozilla 或 IE 中实现。 太棒的文章!!
非常酷,Chris!
然后,为非 WebKit 浏览器提供回退将非常简单 - 特别是只进行两次照片转换。 像这样…….
然后,在 CSS 中
啊,是的,不错!
我会在有时间的时候更新演示代码。 当我能的时候,我真应该提供像这样的更好的回退内容。 谢谢您花时间写出来。
Jeff,我在哪里以及如何插入上半部分(以“var div…”开头的)代码? 我不熟悉这种编码风格。
太酷了!!!
但为什么只有在 webkit 中才能实现 :(
因为蒙版是 WebKit 独有的功能。
很棒,Chris。 好主意。 但它在实际项目中并不实用 :(
为什么不呢? 查看上面的回退,这在“真实”项目中是完全可以接受的。 特别是由于 JavaScript 无法真正像这样复制蒙版,因此它是一种独特的效果。
这些“不实用”的评论总是让我抓狂。 :)
只要你可以为旧浏览器提供合适的回退,它就是 100% 实用的。 有趣的是,我们对移动用户或 iPad 用户的独特观看体验没有问题……但对旧版 IE 用户却没有问题。
在这种情况下,所有浏览器中的结果都是一样的:你看到下一张照片。 这种方法只是在过渡中添加了一些装饰。 这怎么不实用呢??
这篇文章很棒,WebKit 蒙版非常酷。
我必须同意 Chris 和 Jeffrey 的说法,这完全没有理由说明为什么它不实用,只需确保有一个回退,并且对于不支持它的浏览器来说,它可以优雅地降级。
我基本不同意那些认为使用某段代码不实用的人,尤其是那些说“因为它在IE6中不起作用”的人。
但请记住,也许他只是想说它不实用,因为使用WebKit浏览器的用户并不多。所以,在这种情况下,回退并不是一个真正的回退(因为它应该是一个真正的回退),因为大多数用户使用的是非WebKit浏览器。我认为在这种特殊情况下,让它在其他浏览器中降级是不正确的。
然而,学习像这样的小技巧还是挺好的。
这不是“它在IE6中不起作用,所以我们不能使用它,phhhttf”,而是它在除了Chrome、Safari以及其他使用WebKit驱动其引擎的小于1%的浏览器之外的任何浏览器中都无法使用。它不实用,因为大多数用户看不到效果。然而,正如其他人所说,如果你可以接受这一点(也就是说,遮罩效果对你的设计或信息架构并不关键——为什么它会是呢?),那么它对你WebKit用户来说就是一个美味的小点心。其他人保持现状,不会失去任何东西。
而且,如果这些效果变得流行起来,你可以打赌Firefox和Opera的人会将它们整合到未来的版本中。也许甚至微软那些顽固的家伙……?
这是一点特别重要的观点。规范是对 **现实世界使用情况** 的反应,浏览器供应商也根据流行的使用情况来整合规范。
问题是我在印度,这里大多数用户使用IE6,所以对我来说它不实用。我试图说服我的朋友和家人使用现代浏览器,但他们大多不听。这就是问题所在。
我喜欢WebKit项目真正推动CSS规范边界的方式,我希望其他供应商也能采用遮罩功能。
想象一下,如果他们还添加了像“blending-mode: multiply;”这样的属性,那么Photoshop图层调色板的几乎所有功能都可以通过编程的方式重新创建(和操作)!
这是一个很棒的想法。:)
如果它不在规范中,而且只在WebKit浏览器中有效,我真的不明白这种东西有什么意义。仅仅为了炫耀而做一些花哨的事情对我没有吸引力,我觉得它是多余的。
当然,为了炫耀而做一些花哨的东西是毫无用处的。但是,你不可能知道这种实现和使用是否是仅仅为了炫耀。也许这可以用于一个iPad特定的网站,用于两个城市的自行车骑行,并且页眉从一个城市的图像切换到另一个城市的图像。它保证有效,并且对设计来说很简洁和合适。
我惊讶地发现你的例子在HTC Desire上的默认Android浏览器上运行得完美无缺。我之前没有意识到这种东西已经在移动浏览器上实现了。
太棒了!!你在哪里找到这些东西?另外,如果你告诉我不需要博客,那还会这样吗。
太棒了,伙计!一如既往!!
我注意到很多评论说WebKit浏览器的用户百分比非常低。我认为很多人忘记了WebKit浏览器也预装在iPad、iPod Touch和iPhone上,Android手机上的默认浏览器也是WebKit。
这意味着有很多WebKit用户,这种技术非常适合用于移动网站或iPad特定版本的网站。
谢谢Chris,
我不明白。你用的是矩形/正方形形状,你也可以用边框来实现这个效果。
圆形示例在哪里?
哇,Chris:O 这太酷了!!
怎么样,来点Firefox有而WebKit还没有的东西?
这样,人们在浏览时就能有不同的体验:D
只是一个想法
谢谢Chris,感谢你写了这篇文章
啊,Chris,效果真棒。每次你发布一个你发现的新技术,我都会想要去创建一个演示该功能的网站,并将其全面实践。
让人恼火的是,由于要花费大量时间支持那些老旧的垃圾浏览器、整合后端解决方案,然后再记得向人们展示,这一切都无法快速实现。
成为css-tricks.com的粉丝真不容易,你提供了太多灵感。
一如既往地感谢你!
太棒了,Chris。感谢你一直推动边界。我甚至不知道遮罩功能。如果其他浏览器追赶上WebKit,它会激发我们所有人内心中的乔治·卢卡斯!
非常棒,可惜不是每个互联网用户都使用Chrome:)
我认为在Gecko中可以使用SVG对HTML内容进行效果处理来实现相同的效果(我认为这是一种更强大的方法)。更多信息请查看这里:http://weblogs.mozillazine.org/roc/archives/2008/06/applying_svg_ef.html
好吧,考虑到Safari和Chrome都是WebKit浏览器,Android和iPhone都预装了WebKit浏览器,这似乎是移动网站的一个绝佳选择。这个效果在Android和iPhone的默认浏览器上都有效吗?
我个人认为移动网站将变得与主网站一样重要,尤其是当网站有用户可以随时随地访问的东西(新闻、娱乐、社交互动等)时。
嗨,Chris,不知道你是否知道,但是你的正文(Myriad Pro)在PC/Vista上渲染效果不好。查看 http://i.imgur.com/F7NZc.jpg 获取截图。
任何使用IE6的人都不在乎他们的网络体验,那么人们为什么要关心它是否在该浏览器中有效?像这样的东西很棒。这表明人们很有创意,并且在思考方面取得了进步。它是否在所有平台上得到支持并不是重点。而且,这是一种不会在网站上到处使用的处理方式。它是一个很好的细节添加。细节决定成败。
太棒了!现在我有一个问题……有没有办法实现类似的效果,但鼠标悬停时,彩色图像会失去颜色并变成黑白,但只使用一张图像(不使用精灵图)
这很酷:)
对于像我这样的新手来说,这里有很多资源。
谢谢Chris
它在火狐上不起作用
在(重新)阅读这篇文章、Jeffrey Way(很棒的老师,谢谢!)的绝佳回退以及关于“不实用,因为这仅适用于WebKit”的评论(2010年)之后,我想要查看2010年的浏览器份额,并将其与现在的行为进行比较。
2010年,基于WebKit的浏览器(Safari和Chrome)的平均使用率不到13%。2013年,他们的平均使用率为58%。
对我来说,这意味着那些使用额外功能的人(同时使用回退进行覆盖)赚了大钱!这不仅仅是理论——回退(仍然)是必须的。
嗨,Muhammed,
IE6 几乎死掉了。查看这个链接,看看来自印度的用户。:D