以下是 Alexander Futekov 的客座文章。我们最近发布了 一篇文章,作者是 Joshua Bader,文章中介绍了随着页面滚动调整 3D 内嵌外观以获得更真实的交互效果。这与 Alexander 在按钮上使用挤出外观并采用完全不同的技术的做法类似。
CSS3 的引入导致了美观且有趣的按钮的爆发,这些按钮使用渐变、阴影和边框进行样式化,通常是为了实现 3D 效果。此类 3D 按钮的问题在于透视角度是静态的。当您只能看到其正面以及可能的一两个边缘时,3D 效果并不总是非常令人信服,即使页面移动且按钮在页面上的位置发生变化也是如此。
幸运的是,我们可以借助 3D 变换来调整按钮的侧面,从而实现逼真的透视效果。我们可以通过使用伪元素来创建侧面,而无需修改现有的 HTML。然后使用 translateZ
将按钮本身向前移动。
在开始之前,我们必须首先解决一个问题。透视原点通常设置为元素的垂直和水平中心。这意味着当我们根据主体设置它时,我们将得到如下所示的内容

通过将主体的 height 设置为 100%,我们可以将透视原点固定到视口的中心,如下所示

html {
height: 100%;
overflow: hidden;
}
body {
height: 100%;
overflow-y: scroll;
}
对于一个简单的 <button>
,以下是 CSS 代码
button {
position: relative;
display: inline-block;
padding: 4px 16px;
border: 0;
background-color: blue;
background-image: radial-gradient(ellipse at top, rgba(255, 255, 255, 0.15) 50%, transparent);
color: #222;
transform-style: preserve-3d;
transform: translateZ(20px);
}
button::before {
content: "";
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
transform-origin: 0% 0%;
transform: rotateX(-90deg);
}
button::after {
content: "";
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
transform-origin: 0% 0%;
transform: rotateY(90deg);
}
但是我们如何仅使用 2 个伪元素为每个按钮获取 4 个侧面呢?JavaScript!如果我们想避免为每个按钮添加额外的包装器(我们确实需要),则需要使用脚本根据按钮相对于用户视口的位置将顶部向下移动,将左侧向右移动。切换按钮顶部和底部的脚本非常简单 - 更改顶部/底部或左右侧仅在加载和调整大小时发生,而顶部/底部仅在滚动时发生
$(window).on("load resize", function() {
topHalf();
leftHalf();
});
$("body").scroll(function() {
topHalf();
});
function topHalf() {
$("button").each(function() {
var self = $(this),
offTop = self.offset().top,
scrTop = $(window).scrollTop(),
halfWindowHeight = ($(window).height())/2;
self.toggleClass("top-half", (offTop - scrTop) < halfWindowHeight);
});
}
function leftHalf() {
$("button").each(function() {
var self = $(this),
offLeft = self.offset().left,
halfWindowWidth = ($(window).width())/2;
self.toggleClass("left-half", offLeft < halfWindowWidth);
});
}
编辑注: 这当然可以进行一些重构以增强结构并提高效率。随时可以分叉下面的 Pen 并尝试一下!
一些新类将有助于定位侧面
button.top-half::before {
top: auto;
bottom: 0;
transform-origin: 100% 100%;
transform: rotateX(90deg);
}
button.left-half::after {
left: auto;
right: 0;
transform-origin: 100% 100%;
transform: rotateY(-90deg);
}
请记住,如果您使用类来浮动按钮(例如 Twitter Bootstrap 中的 .pull-left
和 .pull-right
),您将知道每个按钮在水平方向上的位置,从而能够跳过一半的 JavaScript 代码。
这是一个可供您体验的样式化演示。它为按钮提供了一个动画向下推效果,并包含一些不需要任何 JavaScript 的其他 3D 元素
Check out this Pen!
类似的技术也可以用来以非常粗略的方式复制 3D 内嵌视差效果。它稍微复杂一些,但不需要任何 JavaScript
Check out this Pen!
在 Chrome 浏览器上无法工作
我使用 Chrome,它对我来说运行良好。也许您可以更具体一些,或者录制屏幕截图(http://www.screenr.com/)来演示“无法工作”的情况。
Chrome 中对我有用!之前在 CodePen 上看到过 :-) 很棒的作品,Chris!
Chrome 上可以运行 - 不过非常微妙,我第一次没有注意到它……
尝试使用 chromeframe,也许可以解决。
对我也不起作用!Chrome 版本 27.0.1453.94 m(最新版本)在 Win XP 系统上。这是一个屏幕截图:http://imgur.com/dW7RjZg
Chrome 中对我也不起作用。
版本:27.0.1453.94 m
操作系统:Win XP
SZRimaging:这是硬件加速在 WinXP 上不可用导致的问题!我想这就是我们生活在过去需要付出的代价……哈哈
D Tondro:并不是真正地停留在过去,只是被困在一台公司机器上……我没有在我的 Win 8 笔记本电脑上测试它……。
企业文化中缓慢的采用速度万岁!
抱歉,Chris……我发送了一个屏幕截图,但许多其他用户已经发送并报告了 Chrome 上的“无法工作”问题 ;-)
Chrome 30 上根本无法工作
太棒了!!!我将开始应用它!
非常酷。起初我以为第二个示例的透视角度是反的,直到我意识到它是内嵌而不是凸出的。使用以下方法,它更加清晰,看起来更酷
对我也不起作用!Chrome 版本 27.0.1453.94 m(最新版本)在 Win XP 系统上。这是一个屏幕截图:http://imgur.com/dW7RjZg
……之前的文章(3D 内嵌)也不起作用!http://i.imgur.com/HuvuDcx.jpg
Chrome 在 XP 上似乎存在一些 3D CSS 问题,这可能是由于缺少硬件加速导致的。
查看此地址“chrome://gpu” - 它在开头会说明 3D CSS 是否可用。
使用 codepen 进行演示非常棒……再次感谢您提供这个精彩的教程……
您能详细介绍一下如何使用 css3 制作 logo 图片吗?谢谢!
我喜欢它。非常流畅,但感觉当你按下按钮时,3D 侧面应该消失,就像你正在向内按下按钮一样。我分叉了您的 Code Pen 演示,这就是我想到的。 http://codepen.io/KenCorbettJr/pen/hnkmv
太棒的分叉了,Ken!这个更改让它感觉像真正的按钮按下 - skeuo3dparallax 获胜!
在我的 Vista Business 和 Chrome 测试版频道上无法工作。根据建议检查了“chrome://gpu”,并且唯一未经硬件加速的项目是面板拟合、视频解码和光栅化。
在 Linux 上的 chrome 27.0.1453.93 中也不起作用:http://www.screenr.com/3n7H
是的!同样的问题……
Mac 上的最新版 Chrome - 对我来说不起作用。
Safari 似乎无法加载 Pen 中的 CSS,看起来很有趣:Imgur
Firefox - 看起来很棒!
它很微妙,尽管它在我的 Mac 上的 Chrome 27.0.1453.93 上可以运行。
抱歉,
是的,这是 Chrome 上的屏幕截图
http://awesomescreenshot.com/0251c3f660
屏幕截图仅持续 3 天……
在 Firefox 上运行良好。
配置:版本 25.0.1364.160 Ubuntu 12.04 (25.0.1364.160-0ubuntu0.12.04.1)
您可以使用简单的
border
实现它。大家好,对我来说看起来都很好,但是当我复制整个内容时,Safari 和 Chrome 仅显示按钮的正面、顶部和左侧。为什么?请帮忙
看起来是一种很有前景的 css 按钮技术,但必须等到浏览器兼容性问题解决后才能使用。
视差是即将到来的 css3 按钮趋势。
这太棒了。在我的 Chrome 27.0.1453.94 m 上运行良好。
赞美 Chris,很棒的发现。
太棒了,它们让我想起了超级马里奥中的盒子,我期望在点击时从顶部弹出硬币。
对于所有遇到此问题无法正常运行的用户,您可能正在使用集成显卡芯片组或不受支持的图形加速器。
一个好的测试方法是查看以下内容是否正确显示。(它应该看起来像一个环或一个立方体,而不是一个扁平的旋转精灵)
https://www.webkit.org/blog-files/3d-transforms/morphing-cubes.html
此页面可能有助于解决此问题
http://stackoverflow.com/questions/7455502/webkit-backface-visibility-not-working/14759299
这太酷了。我必须找到一些借口将这些放到我的下一个设计中。