练习-将函数方法封装成面向对象

 

闲来无事的练习:

将函数方法封装成面向对象方法:

原本JS代码:

    window.onload= function () {
    scrollHandle('.scroll-wrap')
    scrollHandle('.scroll-wrap2')
    function scrollHandle(element) {
        var scroll = document.querySelector(element);
        var ul = scroll.querySelector('.scroll');
        var stY = 0;
        var oldY = 0;
        var dy = 0;
        var maxScroll = 50;
        var minScroll = (scroll.offsetHeight - ul.offsetHeight - maxScroll)
        var backMax = 0;
        var backMin = (scroll.offsetHeight - ul.offsetHeight)
        //下拉
        ul.addEventListener('touchstart', tsHandle)
        function tsHandle(e) {
            stY = e.changedTouches[0].pageY
        }
        ul.addEventListener('touchmove', mvHandle)
        function mvHandle(e) {
            ul.style.transition = 'none'
            dy = e.changedTouches[0].pageY - stY;
            if ((dy + oldY) > maxScroll) {
                ul.style.transform = 'translateY(' + maxScroll + 'px)'
            } else if ((dy + oldY) < minScroll) {
                ul.style.transform = 'translateY(' + minScroll + 'px)'
            } else {
                ul.style.transform = 'translateY(' + (dy + oldY) + 'px)'
            }
        };
        ul.addEventListener('touchend', edHandle)
        function edHandle(e) {
            oldY = oldY + dy
            comeBack()
        }

        //反弹
        function comeBack() {
            if (oldY > backMax) {
                ul.style.transition = 'transform .5s'
                ul.style.transform = 'translateY(' + backMax + 'px)'
                oldY = backMax
            } else if (oldY < backMin) {
                ul.style.transition = 'transform .5s'
                ul.style.transform = 'translateY(' + backMin + 'px)';
                oldY = backMin
            }
        }
    }
}

封装后:

window.onload = function () {
    var scroll1=document.querySelector('.scroll-wrap')
    var scroll2=document.querySelector('.scroll-wrap2')
    var myScroll1=new Repository(scroll1)
    var myScroll2=new Repository(scroll2)
    var myTool1=new Event()
    var myTool2=new Event()
    scrollUp(myScroll1,myTool1)
    scrollUp(myScroll2,myTool2)
    function scrollUp(myScroll,myTool){
        //touchstart时记录下初始pageY
    myScroll.scroll.addEventListener('touchstart', function (e) {
        myScroll.stY=myTool.getPageY(e)
    })
    myScroll.scroll.addEventListener('touchmove', function (e) {
        //touchmove时触发,清除过渡
        myTool.setTransition(myScroll.scroll)
        //计算真实滚动距离
        myScroll.dy=myTool.getPageY(e)-myScroll.stY;
        //判断是否超出滚动区,如果是就锁住不让滚
        if(myScroll.fullY()>myScroll.maxScroll){
            myTool.setTranslateY(myScroll.scroll,myScroll.maxScroll)
        }else if(myScroll.fullY()<myScroll.minScroll){
            myTool.setTranslateY(myScroll.scroll,myScroll.minScroll)
        }else{
            //如果没有超出,就实时更新滚动距离
            myTool.setTranslateY(myScroll.scroll,myScroll.fullY())
        }
    })
    myScroll.scroll.addEventListener('touchend', function () {
        //touchend时触发,重置oldY,记录上一次的滚动距离
        myScroll.reOldY()
        //给上过渡属性,如果后面需要反弹就会使用过渡,如果不需要反弹则会在touchmove时清除
        myTool.setTransition(myScroll.scroll,'transform .5s')
        //给上过渡属性,如果后面需要反弹就会使用过渡,如果不需要反弹则会在touchmove时清除
        if(myScroll.oldY>myScroll.backMax){
            myTool.setTranslateY(myScroll.scroll,myScroll.backMax)
            myScroll.oldY=myScroll.backMax
        }else if(myScroll.oldY<myScroll.backMin){
            myTool.setTranslateY(myScroll.scroll, myScroll.backMin);
            myScroll.oldY=myScroll.backMin
        }
    })
    }
};


//存储变量的
function Repository(element) {
    //获取element下的scroll便于获得高度
    this.scroll = element.querySelector('.scroll');
    //touchstart触发时获得stY
    this.stY=0;
    //touchmove触发时不断改变dy
    this.dy=0;
    //touchend触发时reset oldY
    this.oldY=0;
    this.reOldY= function () {
        this.oldY=this.oldY+this.dy
    }
    //获取dy和oldY之和,用于计算真实滚动距离(原本就有的距离+现在滚动的距离)
    this.fullY= function () {
        return this.dy+this.oldY
    }
    //最大滚动区域和最小滚动区域
    this.maxScroll = 50;
    this.minScroll=element.offsetHeight-this.scroll.offsetHeight-this.maxScroll;
    //设置区域最高和最低值,超出此区域就会反弹
    this.backMax=0;
    this.backMin = element.offsetHeight - this.scroll.offsetHeight;
    return this
}
//存储事件的
function Event() {
    //获得事件触发时的pageY ,必须给注册事件的时候使用
    this.getPageY= function (e) {
        return e.changedTouches[0].pageY
    }
    //设置translateY
    this.setTranslateY = function (element, num) {
        element=element||{};
        num = num || 0;
        element.style.transform='translateY('+num+'px)'
    };
    //设置过渡
    this.setTransition = function (element, string) {
        element=element||{};
        string=string||'none';
        element.style.transition=string
    };
}

 

页面结构+CSS

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
	<title>Document</title>
	<link rel="stylesheet" href="css/base.css">
	<link rel="stylesheet" href="css/common.css">
	<link rel="stylesheet" href="css/category.css">
</head>
<body>
	<!-- 头部区域 -->
	<header class="common-header clearfix">
		<div class="left fl jd-icons jdw-center"></div>
		<div class="right fr jd-icons jdw-center"></div>
		<div class="center">
			<input type="search" placeholder="京东3C 百万件爆品岂止5折">
		</div>
	</header>
	
	<!-- 主体区域 -->
	<section class="cate-main">
		<aside class="left fl scroll-wrap">
			<ul class="scroll">
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
				<li><a href="#">列表一</a></li>
			</ul>
		</aside>
		<article class="right scroll-wrap2">
			<div class="scroll">
				<div class="img-wrap">
					<img src="image/imgs/cate_banner.jpg" alt="">
				</div>
				<h4 class="zc-tit">专场推荐</h4>
				<ul class="zc-info">
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
				</ul>
				<h4 class="zc-tit">专场推荐</h4>
				<ul class="zc-info">
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
				</ul>
				<h4 class="zc-tit">专场推荐</h4>
				<ul class="zc-info">
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
				</ul>
				<h4 class="zc-tit">专场推荐</h4>
				<ul class="zc-info">
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
				</ul>
				<h4 class="zc-tit">专场推荐</h4>
				<ul class="zc-info">
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
					<li class="w33 fl"><a href="#"><img src="image/imgs/cate_item01.jpg"  alt=""></a><p>新鲜水果</p></li>
				</ul>
			</div>
		</article>
	</section>

	<!--<script type="text/javascript" src="js/category.js"></script>-->
	<script src='js/tomodule.js'></script>
</body>
</html>
@charset "utf-8";

/* 这个css是初始化的css,在任何项目里面都可以使用 */

/* 禁用iPhone中Safari的字号自动调整 */
html {
	-webkit-text-size-adjust: 100%;
	-ms-text-size-adjust: 100%;
	/* 解决IOS默认滑动很卡的情况 */
	-webkit-overflow-scrolling : touch; 
}

/* 禁止缩放表单 */
input[type="submit"], input[type="reset"], input[type="button"], input {
	resize: none;
	border: none;
}

/* 取消链接高亮  */
a {
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

/* 设置HTML5元素为块 */
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
	display: block;
}

/* 图片自适应 */
img {
	width: 100%;
	height: auto;
	width: auto\9; /* ie8 */
	display: block;
	-ms-interpolation-mode: bicubic;/*为了照顾ie图片缩放失真*/
}

/* 初始化 */
body, div, ul, li, ol, h1, h2, h3, h4, h5, h6, input, textarea, select, p, dl, dt, dd, a, img, button, form, table, th, tr, td, tbody, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
	margin: 0;
	padding: 0;
}
body {
	font: 12px/1.5 'Microsoft YaHei','宋体', Tahoma, Arial, sans-serif;
	color: #555;
	background-color: #F7F7F7;
}
em, i {
	font-style: normal;
}
ul,li{
	list-style-type: none;
}
strong {
	font-weight: normal;
}
.clearfix:after {
	content: "";
	display: block;
	visibility: hidden;
	height: 0;
	clear: both;
}
.clearfix {
	zoom: 1;
}
a {
	text-decoration: none;
	color: #969696;
	font-family: 'Microsoft YaHei', Tahoma, Arial, sans-serif;
}
a:hover {
	text-decoration: none;
}
ul, ol {
	list-style: none;
}
h1, h2, h3, h4, h5, h6 {
	font-size: 100%;
	font-family: 'Microsoft YaHei';
}
img {
	border: none;
}
input{
	font-family: 'Microsoft YaHei';
}
/*单行溢出*/
.one-txt-cut{
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}
/*多行溢出 手机端使用*/
.txt-cut{
	overflow : hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    /* -webkit-line-clamp: 2; */
    -webkit-box-orient: vertical;
}
.w50{
	width: 50%;
}
.w25{
	width: 25%;
}
.w20{
	width: 20%;
}
.w33{
	width: 33.333333%;
}
.fl{
	float: left;
}
.fr{
	float: right;
}
.db{
	display: block !important;
}
.dn{
	display: none;
}
/*
* @Author: Administrator
* @Date:   2017-02-23 15:59:41
* @Last Modified by:   Administrator
* @Last Modified time: 2017-02-26 16:40:10
*/

/* 这个css主要做的事情是将这个项目的一些公共元素提取出来,为了以后的复用 */


/* 精灵图缩放公共类 */
.jd-icons:before{
	content: '';
	background:  url(../image/icons/jd-sprites.png)  no-repeat;
	/* 这里不能直接写50% 因为这个百分比参照的是当前元素的宽高 */
	-webkit-background-size: 200px 200px;
	background-size: 200px 200px;
}
/* 水平垂直公共类 */
.jd-center,.jdw-center:before {
	position: absolute;
	left: 50%;
	top: 50%;
	-webkit-transform :translate(-50%,-50%);
	transform :translate(-50%,-50%);
}
/* 垂直居中公共类 */
.jd-center-y,.jdw-center-y:before {
	position: absolute;
	top: 50%;
	-webkit-transform :translateY(-50%);
	transform :translateY(-50%);
}
/* 水平居中公共类 */
.jd-center-x,.jdw-center-x:before {
	position: absolute;
	left: 50%;
	-webkit-transform :translateX(-50%);
	transform :translateX(-50%);
}
/* 底部边框公共类 */
.line-bottom {
	position: relative;
}
.line-bottom:before {
	content: '';
	width: 100%;
	height: 0;
	border-bottom: 1px solid #ccc;
	position: absolute;
	left: 0;
	bottom: 0;
}
/* 右边公共边框 */
.right-line {
	position: relative;
}
.right-line:before {
	content: '';
	position: absolute;
	width: 0;
	height: 100%;
	right: 0;
	top: 0;
	border-right: 1px solid #ccc;
}

/* 公共头部区域 */
.common-header {
	height: 44px;
	border-bottom: 1px solid #ccc;
	position: fixed;
	width: 100%;
	top: 0;
	background:linear-gradient(to bottom,#fff,#e0e0e0);
}
.common-header .left {
	width: 40px;
	height: 44px;
	position: relative;
}
.common-header .left:before {
	width: 13px;
    height: 20px;
    background-position: -24px 0;
}
.common-header .right {
	width: 42px;
	height: 44px;
	position: relative;
}
.common-header .right:before {
	width: 18px;
    height: 19px;
    background-position: -61px 0;
}
.common-header .center {
	height: 44px;
	margin: 0 42px 0 40px;
	padding-top: 7px;
	-webkit-box-sizing:border-box;
	box-sizing:border-box;
}
.common-header .center input[type="search"] {
	width: 100%;
	height: 30px;
	border: 1px solid #ccc;
	border-radius: 5px;
	text-indent: 5px;
}
.mt45 {
	margin-top: 45px;
}
/*
* @Author: Administrator
* @Date:   2017-02-26 11:00:31
* @Last Modified by:   Administrator
* @Last Modified time: 2017-02-26 16:40:33
*/

/* 主体区域 */
html,body,.cate-main{
	height: 100%;
}
.cate-main {
	padding-top: 45px;
	-webkit-box-sizing:border-box;
	box-sizing :border-box;
}
.cate-main .left {
	width: 74px;
	height: 100%;
	border-right: 1px solid #ccc;
	overflow: hidden;
}
.cate-main .right {
	height: 100%;
	margin-left: 75px;
	padding-left:10px;
}
.cate-main .left .scroll li {
	height: 40px;
	line-height: 40px;
	border-bottom: 1px solid #ccc;
	text-align: center;
}
.img-wrap {
	padding-top: 10px;
}
.cate-main .right {
	overflow: hidden;
}
.cate-main .right .zc-tit {
	line-height: 25px;
	margin-top: 10px;
	font-size: 16px;
}
.cate-main .right .zc-info {
	overflow: hidden;
}
.cate-main .right .zc-info li {
	background-color: #fff;
}
.cate-main .right .zc-info a {
	display: block;
	padding:0 10px;
}
.cate-main .right .zc-info p {
	line-height: 30px;
	text-align: center;
	font-size: 14px;
}

 

转载于:https://my.oschina.net/u/3281152/blog/846710

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值