HTML列表滑动出现删除块点击删除(平板手机适用)

代码:

<script type="text/javascript" src="js/delete.js"></script>
<script>
// 列表往左滑动可删除
    window.onload = function() { 
        var qslide = new qSlide('listItem', ajaxDel);
    }
    //delId为传回来的要删除的数据的ID
    function ajaxDel(delId) {

        console.info("后台删除请求在这里写" + delId);
    }
</script>

.js代码

(function(){
	
	var isTouchPad = (/hp-tablet/gi).test(navigator.appVersion),
	hasTouch = 'ontouchstart' in window && !isTouchPad,	
	START_EV = hasTouch ? 'touchstart' : 'mousedown',
	MOVE_EV = hasTouch ? 'touchmove' : 'mousemove',
	END_EV = hasTouch ? 'touchend' : 'mouseup',
	CANCEL_EV = hasTouch ? 'touchcancel' : 'mouseup';
	var qSlide = function(cName,callBack){
		var that = this;
		that.cName = cName;
		var slideObjArr = document.getElementsByClassName(cName);//获取class为cName的元素

		if (slideObjArr.length>0) {
			for (var i = 0; i < slideObjArr.length; i++) {
				var el = slideObjArr[i];
				var div = that.createDelObj(el,i);//创建列表右侧的删除按钮
				that.initDelete(div,el,el.parentNode);
				that._bind(START_EV,el);
			}
		}
		that.callBack = callBack;

	};

	function getTargetEle(obj,cName){
		if (obj.className == cName) {
			return obj;
		}else{
			return getTargetEle(obj.parentNode,cName);
		}
	}

	qSlide.prototype = {
		handleEvent: function (e) {
			var that = this;
			switch(e.type) {
				case START_EV:
					if (!hasTouch && e.button !== 0) return;
						that._start(e);
					break;
				case MOVE_EV: that._move(e); break;
				case END_EV:
				case CANCEL_EV: that._end(e); break;
			}
		},
		createDelObj:function(obj,i){
			var self = this;
			obj.style.cssText += 'position: relative;';
			var div = document.createElement('div');
			div.className = 'delDiv';
			div.id = 'toBeDeletedId'+i;
			div.style.cssText = 'position: absolute;background:-webkit-linear-gradient(left, #ccc,#FFFFFF);background:-o-linear-gradient( #ccc,#FFFFFF);ackground:-moz-linear-gradient( #ccc,#FFFFFF);background:linear-gradient(to right, #ccc,#FFFFFF);z-index: 99;right: 0;top:0px;\
			height: 100%;width: 20%;text-align:center;line-height:80%;left:91%;  opacity: 0;-webkit-transition: opacity .1s;\
			-o-transition: opacity .6s;transition: opacity .1s;';
			var p = document.createElement('p');
			p.style.cssText = 'color: rgba(102, 102, 102, 1);font-size: 17px;';
			p.innerHTML = '删除';
			div.appendChild(p);
			obj.appendChild(div);
			return div;
		},
		initDelete:function(obj,delItem,slideParent){
			var self = this;
			obj.addEventListener('touchstart',  function(){
				//console.info(obj.className+','+slideParent.className);
				var p = obj.style.opacity;
				if (p == '1') {
					slideParent.removeChild(delItem);
					self.callBack(obj.getAttribute('id'));
				};

			});
		},
		_start:function(e){
			var self = this,point = hasTouch ? e.touches[0] : e;
			//记录手指按下的坐标
			self.startX = e.touches[0].pageX;
			self.startY = e.touches[0].pageY; 		
			self.actDir = '';//左右滑动标识
			self._bind(MOVE_EV, window);
			self._bind(END_EV, window);
			self._bind(CANCEL_EV, window);
			var obj = e.srcElement || e.target;
			obj = getTargetEle(obj,self.cName);
			self.obj = obj;
			self.slideParent = obj.parentNode;
			var delDiv = obj.getElementsByClassName('delDiv')[0];
			self.delDiv = delDiv;
		},
		_move:function(evt){			
			var self = this,point = hasTouch ? evt.touches[0] : evt;
			//兼容chrome android,阻止浏览器默认行为
			evt.preventDefault();
			//计算手指的偏移量
			var xDis = evt.touches[0].pageX - self.startX;
			var yDis = Math.abs(evt.touches[0].pageY - self.startY);
			var moveDis = Math.abs(xDis)>20?20:Math.abs(xDis);//滑动的横向距离
			
			if (yDis < 10) {//纵向距离在15像素内,精确到滑动的一行范围
				if (xDis < 0) {//向左滑
					self.delDiv.style.opacity = 1;
					self.delDiv.style.cssText += 'right:'+(moveDis-200)+'px;opacity:1';
					self.actDir = 'left';
				}else{//向右滑
					self.delDiv.style.cssText += 'right:-'+ moveDis+'px;opacity:1';
					self.actDir = 'right';
				}
			}else{
				self.actDir = '';
			}
		},
		_end:function(evt){
			var self = this;
			evt.preventDefault();
			var obj = evt.srcElement || evt.target;	
			if (self.actDir == 'left' && self.delDiv) {
				self.delDiv.style.cssText += 'right:0px;opacity:1';
				
			}else if(self.actDir == 'right'){
				console.info(self.actDir+'===right');
				var p =self.delDiv.style.opacity;
				if (p == '1') {
					self.delDiv.style.opacity = 0;
				}
			}
			self._unbind(MOVE_EV, window);
			self._unbind(END_EV, window);
			self._unbind(CANCEL_EV, window);
		},
		
		_bind: function (type, el, bubble) {
			el.addEventListener(type, this, !!bubble);
		},

		_unbind: function (type, el, bubble) {
			el.removeEventListener(type, this, !!bubble);
		}
	};
	if (typeof exports !== 'undefined') {
		exports.qSlide = qSlide;
	}else{
		window.qSlide = qSlide;
	}
})();

调用:

 <!--  列  -->
                                        <ul class="ulBody" style="padding-left: 0px;margin-top: 0px;">
                                            <li class="listItem">
                                                <div class="list flex-col">
                                                    <div class="list2 flex-row justify-between" style="margin-top: 4%;">
                                                        <div class="gongchengimg flex-col"></div>
                                                        <span >工程名称1</span>
                                            </li>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值