《月熊志》技术解析——沉浸式的翻阅体验
《月熊志》为大家提供了一个沉浸式的翻阅体验,用户可以在页面切换时体验到真实的3D翻书效果,非常的酷炫。而要实现这个效果,需要用到CSS3 3D transform和JavaScript,同时为了实现跨浏览器和跨设备的统一体验,用到hammer.js库去处理滑动操作。
示例效果:
网页的结构十分简单,整个杂志是一个ID为magazine的div,子元素. page即页面元素,其中还需要包含一层.page-content层。
css:
- .page {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- overflow: hidden;
- display: none;
- }
- .page-content {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- }
当用户拖拽页面时,我们会复制一份当前页和下一页,作为3D翻页的元素存在,层之间的关系如下:
$currentPage -> 当前页
$newPage -> 新的一页(上一页/下一页)
$pageBack -> 克隆的$newPage
$pageFront -> 克隆的$currentPage
除了当前页的其他页面,为了只显示页面一半,需要将外层div的宽度设置为50%,同时将.page-content设为200%。
CSS:
- .page.front,
- .page.back,
- .page.prev,
- .page.next {
- width: 50%;
- }
- .page.front .page-content,
- .page.back .page-content,
- .page.prev .page-content,
- .page.next .page-content {
- width: 200%;
- }
当开始拖拽时,通过鼠标位置在屏幕的左边或者右边判断翻页的方向并复制页面。然后在拖拽时,根据移动距离计算翻页进度并转换为角度应用到元素上。最后使用css transition完成余下动画。
JS代码关键部分:
- $("#magazine").hammer({prevent_default: true}).on("dragstart", function(event) {
- //开始拖拽
-
- //根据指针的位置判断新的一页是上一页还是下一页
- var pageX = event.gesture.center.pageX;
- _.$newPage = pageX > centerX ? _.$currentPage.next(".page").addClass("next") : _.$currentPage.prev(".page").addClass("prev");
-
- //复制当前页和新的一页
- _.$pageFront = $("<div class='page front' />").append(_.$currentPage.children().clone());
- _.$pageBack = $("<div class='page back/>").append(_.$newPage.children().clone());
-
- $(this).on("drag", function(event) {
- //拖拽中
-
- //获得手势方向
- var direction = event.gesture.direction;
-
- //如果是左右滑动才继续
- if (direction != "left" && direction != "right") return;
-
- //获得鼠标x坐标,和窗口宽度相除获得百分比和角度
- var deltaX = Math.max((_.direction == "left" ? -1 : 1) * event.gesture.deltaX, 0),
- progress = deltaX / winWidth,
- angle = (direction == "left" ? -180 : 180) * progress;
-
- //使用transform翻转页面
- _.$pageFront.css("transform", "perspective(2200px) rotateY(" + angle + "deg)");
- _.$pageBack.css("transform", "perspective(2200px) rotateY(" + (angle - 180) + "deg)");
-
- }).on("dragend", function(event) {
- //拖拽结束
-
- var deltaX = Math.max((direction == "left" ? -1 : 1) * event.gesture.deltaX, 0),
- time = event.gesture.deltaTime,
- progress = deltaX / winWidth,
- flipped = progress > 0.5 || deltaX / time > 0.5, //如果滑动距离超过屏幕的一半或者速度大于0.5就认为页面被翻过去了
- duration = !flipped ? 1 - progress : progress,
- angle = !flipped ? 0 : _.direction == "left" ? -180 : 180;
-
- //通过css3 transition完成余下动画
- _.$pageFront.css({
- "transition": "all " + duration + "s ease-out",
- "transform": "perspective(2200px) rotateY(" + angel + "deg)"
- });
- _.$pageBack.css({
- "transition": "all " + duration + "s ease-out",
- "transform": "perspective(2200px) rotateY(" + (angel - 180) + "deg)"
- });
- });
- });
如果你的页面包含视频或者Canvas等元素,那还需要再做一些额外的工作,因为这些元素并不能以同样的状态被直接复制。
最后如果你需要兼容不支持CSS3浏览器。可以借助Modernizr判断,以水平滑动的方式切换页面。
- if (Modernizr.csstransforms3d && Modernizr.csstransitions) {
- //支持
- } else {
- //不支持
- };

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
程序员移动端【订阅下载】
微博关注
最新文章
鸿蒙生态爆发:金融、教育等多领域创新成果集中亮相,服务商共建产业新未来华为云亮相数博会,携手法大大发布全链路合同风险智控解决方案泊松软件携手华为云,为工业数智化筑造核心技术通路使用单模块双天线RTK + Ardupilot 多旋翼无人机完成厘米级稳定电力巡检Pixhawk px4让集成更安心,让连接更高效:鸿蒙生态伙伴SDK优选库双端赋能鸿蒙生态服务商迈入发展快车道,移动办公平台鸿蒙化助力政企数智转型Shokz韶音「型动花田」街区快闪亮相,开启开放聆听新浪潮共话发展新动能,“自信自强,共创新质生产力“大会在贵阳成功举办产学研用联动!工信部人才交流中心等14家单位发起《鸿蒙人才领航行动倡议》鸿蒙版QQ多端同步升级,新增10个功能,专注职场与家校沟通场景
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】