封装,即隐藏对象的属性和实现细节,仅对外公开接口。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员
这个主题案例,我采用的是面向接口编程的写法,简单的说就是将行为封装分布在各个对象中,并让这些对象自己各自负责自己的行为,这也是面向对象设计的一个优点
就拿页面切换的效果来说,在某一时刻,元素A需要让页面进行切换,那么元素A不需要关心页面是怎么切换的,它只能要调用到一个接口方法能让页面切换就行了
基于这样的理论,我们就开始改造一下页面切换的零碎的代码块
页面布局与切换是一个整体,我们想调用切换的时候,并不关心其内部处理的手段,所以我们只需要提供一个可以调用的接口就可以,新建一个Swipe.js文件,内部定义一个Swipe工厂方法,内部会产生一个swipe的滑动对象,暴露了scrollTo的接口
JavaScript中没有抽象类与接口的支持,所以很大程度上实现封装都是靠闭包去模拟
具体我看看右边代码块Swipe.js的实现 与index.html中调用
在31行填入相应代码,通过调用接口让页面滚动
swipe.scrollTo($("#content").width() * 2, 5000);
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>慕课七夕主题</title> <link rel='stylesheet' href='style.css' /> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="Swipe.js"></script> </head> <body> <div id='content'> <ul class='content-wrap'> <!-- 第一副画面 --> <li> 页面1 </li> <!-- 第二副画面 --> <li> 页面2 </li> <!-- 第三副画面 --> <li> 页面3 </li> </ul> <div class="button"> <button>点击切换页面</button> </div> </div> <script type="text/javascript"> var swipe = Swipe($("#content")); $('button').click(function() { // 调用接口 //? }); </script> </body> </html>
* { padding: 0; margin: 0; } ul, li { list-style-type: none; } /*主体部分*/ #content { width: 100%; height: 100%; /* top: 20%; left: 20%; */ overflow: hidden; position: absolute; } .content-wrap { position: relative; } .content-wrap > li { background: #CAE1FF; color: red; float: left; overflow: hidden; position: relative; } li:nth-child(2) { background: #9BCD9B; } li:nth-child(3) { background: yellow; } button { width: 100px; height: 50px; } .button { position: absolute; bottom: 0; }
///////// //页面滑动 // ///////// /** * [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; }