小孩男走路是贯穿三个主题页面,因此小男孩在布局上不能嵌入任何一个页面内,否则无法切换到下一个页面中了。所以最终小男孩的布局与页面根节点属于并列结构
页面的整体结构如下:
<div id='content'> <ul class='content-wrap'> <li> 页面1 </li> <li> 页面2 </li> <li> 页面3 </li> </ul> //与页面根节点并列 <div id="boy" class="charector"></div> </div>
小男孩的布局很简单,但是要注意3个问题:
观察效果会发现:小男孩总是会沿着中间那个路线走动。因为背景图是靠百分比控制的,会随着分辨率的变化而变化。但是人物是固定的尺寸是无法变化的(合成图的关系),这里只能通过JS动态调整
人物坐标的算法也比较简单:
小男孩的top坐标值 = 中间路段的中间坐标值 - 小男孩的高度
具体可以参考右边代码区域的实现,增加了pageA文件设置第一个页面的背景布局,因为人物的布局需要以背景布局为参考点
这里我特别提出一个问题:
雪碧图一般情况下是无法自适应缩放的,本课程为了简单处理使用"雪碧图"的元素都是原尺寸,没有缩放。 大家可以思考下,雪碧图如何做是自适应处理? 具体我在9-2最后一节给我给了具体是缩放方案,做为一个课后的思考点。
打开index.html文件,在代码的63行填入相应代码,这样可以通过JS动态修正小孩男的top布局坐标了
$boy.css({ top: pathY - boyHeight + 25 });
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>慕课七夕主题</title> <link rel='stylesheet' href='style.css' /> <link rel='stylesheet' href='pageA.css' /> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="Swipe.js"></script> </head> <style type="text/css"> .charector { width: 151px; height: 291px; background: url(http://img1.sycdn.imooc.com//55ade248000198ae10550582.png) -0px -291px no-repeat; position: absolute; /* 设置一个元素的坐标 */ left: 6%; top: 55%; } </style> <body> <div id='content'> <ul class='content-wrap'> <li> <div class="a_background"> <div class="a_background_top"></div> <div class="a_background_middle"></div> <div class="a_background_botton"></div> </div> </li> <li> 页面2 </li> <li> 页面3 </li> </ul> <div id="boy" class="charector"></div> </div> <script type="text/javascript"> var swipe = Swipe($("#content")); // 获取数据 var getValue = function(className) { var $elem = $('' + className + ''); // 走路的路线坐标 return { height: $elem.height(), top: $elem.position().top }; }; // 路的Y轴 var pathY = function() { var data = getValue('.a_background_middle'); return data.top + data.height / 2; }(); var $boy = $("#boy"); var boyHeight = $boy.height(); // 修正小男孩的正确位置 // 路的中间位置减去小孩的高度,25是一个修正值 //? </script> </body> </html>
* { padding: 0; margin: 0; } ul, li { list-style-type: none; } /*主体部分*/ #content { width: 100%; height: 100%; /* top: 20%; */ overflow: hidden; position: absolute; } .content-wrap { position: relative; } .content-wrap > li { float: left; overflow: hidden; position: relative; }
/*背景图*/ .a_background { width: 100%; height: 100%; position: absolute; } .a_background_top{ width: 100%; height: 71.6%; background-image: url("http://img1.sycdn.imooc.com//55addf6900019d8f14410645.png"); background-size: 100% 100%; } .a_background_middle{ width: 100%; height: 13.1%; background-image: url("http://img1.sycdn.imooc.com//55addf800001ff2e14410118.png"); background-size: 100% 100%; } .a_background_botton{ width: 100%; height: 15.3%; background-image: url("http://img1.sycdn.imooc.com//55addfcb000189b314410138.png"); background-size: 100% 100%; }
///////// //页面滑动 // ///////// /** * [Swipe description] * @param {[type]} container [页面容器节点] * @param {[type]} options [参数] */ function Swipe(container) { // 获取第一个子节点 var element = container.find(":first"); var swipe = {}; // li页面数量 var slides = element.find("li"); // 获取容器尺寸 var width = container.width(); var height = container.height(); // 设置li页面总宽度 element.css({ width: (slides.length * width) + 'px', height: height + 'px' }); // 设置每一个页面li的宽度 $.each(slides, function(index) { var slide = slides.eq(index); // 获取到每一个li元素 slide.css({ width: width + 'px', height: height + 'px' }); }); // 监控完成与移动 swipe.scrollTo = function(x, speed) { // 执行动画移动 element.css({ 'transition-timing-function' : 'linear', 'transition-duration' : speed + 'ms', 'transform' : 'translate3d(-' + x + 'px,0px,0px)' }); return this; }; return swipe; }