移动端-表头固定的表格组件

2023-11-07

UI原型

HTML代码

<!-- scroll-table-box开始  -->
<div class="scroll-table-box">
    <div class="scroll-table-head">
        <table class="tb1">
            <thead>
                <tr>
                    <th style="width: 3em;">序号</th>
                    <th style="width: 4em;">品名</th>
                    <th style="width: 4em;">材质</th>
                    <th style="width: 5em;">规格</th>
                    <th style="width: 4em;">计划量</th>
                    <!-- <th>发货量(吨)</th> -->
                    <th style="width: 5em;">未执行量</th>
                    <th style="width: 6em;">备注</th>
                </tr>
            </thead>
        </table>
    </div>

    <div class="scroll-table-body">
        <table class="tb1 no_border_top">
            <tbody>
                <tr v-for="(d,index) in detail.batchDetails" :key="d.batchId">
                    <td style="width: 3em;">
                        <div class="td_div" v-text="index+1"></div>
                    </td>
                    <td style="width: 4em;">
                        <div class="td_div" v-text="d.brandName"></div>
                    </td>
                    <td style="width: 4em;">
                        <div class="td_div" v-text="d.textureName"></div>
                    </td>
                    <td style="width: 5em;">
                        <div class="td_div" v-text="d.specification"></div>
                    </td>
                    <td style="width: 4em;">
                        <div class="td_div" v-text="d.batchPlanWeight"></div>
                    </td>
                    <!-- <td><div class="td_div" v-text="d.totalBuyWeight"></div></td> -->
                    <td style="width: 5em;" v-if="d.batchUndoWeight>=0">
                        <div class="td_div" v-text="d.batchUndoWeight"></div>
                    </td>
                    <td style="width: 5em;" v-if="d.batchUndoWeight<0">
                        <div class="td_div">超发{{-d.batchUndoWeight}}</div>
                    </td>
                    <td style="width: 6em;">
                        <div class="td_div" v-text="d.batchDetailRemark"></div>
                    </td>
                </tr>
                <tr class="bug-tr">
                    <td>
                        <div class="td_div">合计:</div>
                    </td>
                    <td colspan="3">
                        <div class="td_div"></div>
                    </td>
                    <td>
                        <div class="td_div" v-text="planWeight"></div>
                    </td>
                    <td>
                        <div class="td_div" v-text="undoWeight"></div>
                    </td>
                    <td>
                        <div class="td_div"></div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>

    <!-- scroll-table-fixed-left开始 -->
    <div class="scroll-table-fixed-left hide">
        <div class="scroll-table-fixed-left-head">
            <table class="tb1">
                <thead>
                    <tr>
                        <th style="width: 3em;">序号</th>
                    </tr>
                </thead>
            </table>
        </div>

        <div class="scroll-table-fixed-left-body">
            <table class="tb1 no_border_top">
                <tbody>
                    <tr v-for="(d,index) in detail.batchDetails" :key="d.batchId">
                        <td style="width: 3em;">
                            <div class="td_div" v-text="index+1"></div>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <div class="td_div">合计:</div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
    <!-- scroll-table-fixed-left结束 -->
</div>
<!-- scroll-table-box结束  -->

CSS代码

*{
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
input {
		outline: none;
		-webkit-border-radius: 5px;
		-moz-border-radius: 5px;
		border-radius: 5px;
		text-indent: 8px;
}
[v-cloak]{display: none;}
.hide{display: none !important;}
.scroll-table-box {
	position: relative;
}
.scroll-table-head {
	width: 100%;
	overflow: hidden;
}
.scroll-table-body {
	max-height: calc(100vh - 271px);
  overflow: hidden;
}
.no_border_top{
	border-top: none !important;
}
.w_60 {
	width: 60px !important;
}
.scroll-table-box .v-shadow {
	position: absolute;
	left: 129px;
	top: 0;
	width: 0px;
	height: 100%;
	z-index: -1;
	-webkit-box-shadow: -1px 3px 10px 1px #000000;
	-moz-box-shadow: -1px 3px 10px 1px #000000;
	box-shadow: -1px 3px 10px 1px #000000;
}
.scroll-table-fixed-left {
	width: 43px;
	height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  overflow: hidden;
}
.scroll-table-fixed-left .scroll-table-fixed-left-head {
	position: relative;
}
.scroll-table-fixed-left .scroll-table-fixed-left-body {
	position: relative;
	max-height: calc(100% - 39px);
  overflow: hidden;
}
.scroll-table-box .tb1{
	width: 100%; 
	table-layout: fixed;
  border-top: 1px solid #ccc;
  border-right: 1px solid #ccc;
}
.scroll-table-box .tb1 th,.scroll-table-box .tb1 td{
	padding: 8px 4px;
	border-bottom: 1px solid #ccc;
	width: 100px;
	text-align: center;
	font-size: 14px;
}
.scroll-table-box .tb1 th {
	background-color: #edf6fd;
  color: #333;
  border-left: 1px solid #ccc;
}
.scroll-table-box .tb1 td{
	background-color: #fff;
	color: black;
	border-left: 1px solid #ccc;
}
.scroll-table-box .tb1 td .td_div{
  line-height: 20px;
	text-align: center;
	white-space: pre-wrap;
  word-wrap: break-word;
  word-break: break-word;
}
.scroll-table-box .tb1 td .td-input {
	width: 60px;
	color: red;
	text-align:center;
	text-indent: 0px;
	border: 1px solid #A5A5A5;
}
.td-grey {
	background-color: #f8f8f8 !important;
}

 js代码

move.js

(function(){
	window.requestAnimationFrame = window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;
	window.cancelAnimationFrame = window.cancelAnimationFrame|| window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame||window.cancelRequestAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame; 
	if(!requestAnimationFrame){
		var lastTime = Date.now();
		window.requestAnimationFrame = function(callback){
			var id;
			var nowTime = Date.now();
			var delay = Math.max(16.7-(nowTime-lastTime),0);
			id = setTimeout(callback,delay);
			lastTime = nowTime + delay;
			return id;
		};
	}
	if(!cancelAnimationFrame){
		window.cancelAnimationFrame = function(index){
			clearTimeout(index);
		};
	}
})();

/*
	startMove(init)
	init:{
		el: 要动画的元素,
		type: 动画的类型,
		target: {//目标值
			left: 100,
			translateX: 100
		},
		time: //动画时长ms,
		callBack: fn //动画执行完成之后 要执行的函数
		callIn: fn//动画执行中
	}
*/

function transform(el,attr,val){
	if(!el.transform){
		el.transform = {
		};
	}
	if(val === undefined){
		return el.transform[attr];
	}
	el.transform[attr] = val;
	var str = "";
	for(var s in el.transform){
		switch(s){
			case "rotate":
			case "rotateX":
			case "rotateY":
			case "rotateZ":
			case "skewX":
			case "skewY":
				str += s +"("+el.transform[s]+"deg) ";
				break;
			case "scale":
			case "scaleX":
			case "scaleY":
				str += s +"("+el.transform[s]+") ";
				break;
			case "translateX":
			case "translateY":
			case "translateZ":
				str += s +"("+el.transform[s]+"px) ";
				break;	
		}
	}
	el.style.WebkitTransform = el.style.transform = str;
}

function css(el,attr,val){
	var transformAttr = ["rotate","rotateX","rotateY","rotateZ","skewX","skewY","scale","scaleX","scaleY","translateX","translateY","translateZ"];
	for(var i = 0; i < transformAttr.length; i++){
		if(attr == transformAttr[i]){ //如果 attr 等transform其中一个值就代表用用户想要操作的是 transform
			return transform(el,attr,val);
		}
	}
	if(val === undefined){
		val = getComputedStyle(el)[attr];
//		console.log(val);
		val = parseFloat(val);
		return val;
	}
	if(attr == "opacity"){
		el.style[attr] = val;
	} else {
		el.style[attr] = val + "px";
	}
}

function startMove(init){
	var t = 0;
	var b = {};//样式的初始值
	var c = {};//样式的差值	
	var d = Math.ceil(init.time/16.7);
	cancelAnimationFrame(init.el.timer);
	for(var s in init.target) {
		b[s] = css(init.el,s);
		c[s] = init.target[s] - b[s];
	}
	init.el.timer = requestAnimationFrame(move);
	function move(){
		if(t > d || d == 0){
			cancelAnimationFrame(init.el.timer);
			init.callBack&&init.callBack.call(init.el);
		} else {
			t++;
			for(var s in init.target){
				var val = Tween[init.type](t,b[s],c[s],d);
				css(init.el,s,val);
			}
			init.callIn&&init.callIn.call(init.el);
			init.el.timer = requestAnimationFrame(move);
		}
	}
}	

tween.js

var Tween = {
	linear: function (t, b, c, d){
		return c*t/d + b;
	},
	easeIn: function(t, b, c, d){
		return c*(t/=d)*t + b;
	},
	easeOut: function(t, b, c, d){
		return -c *(t/=d)*(t-2) + b;
	},
	easeBoth: function(t, b, c, d){
		if ((t/=d/2) < 1) {
			return c/2*t*t + b;
		}
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInStrong: function(t, b, c, d){
		return c*(t/=d)*t*t*t + b;
	},
	easeOutStrong: function(t, b, c, d){
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeBothStrong: function(t, b, c, d){
		if ((t/=d/2) < 1) {
			return c/2*t*t*t*t + b;
		}
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	elasticIn: function(t, b, c, d, a, p){
		if (t === 0) { 
			return b; 
		}
		if ( (t /= d) == 1 ) {
			return b+c; 
		}
		if (!p) {
			p=d*0.3; 
		}
		if (!a || a < Math.abs(c)) {
			a = c; 
			var s = p/4;
		} else {
			var s = p/(2*Math.PI) * Math.asin (c/a);
		}
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	elasticOut: function(t, b, c, d, a, p){
		if (t === 0) {
			return b;
		}
		if ( (t /= d) == 1 ) {
			return b+c;
		}
		if (!p) {
			p=d*0.3;
		}
		if (!a || a < Math.abs(c)) {
			a = c;
			var s = p / 4;
		} else {
			var s = p/(2*Math.PI) * Math.asin (c/a);
		}
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},    
	elasticBoth: function(t, b, c, d, a, p){
		if (t === 0) {
			return b;
		}
		if ( (t /= d/2) == 2 ) {
			return b+c;
		}
		if (!p) {
			p = d*(0.3*1.5);
		}
		if ( !a || a < Math.abs(c) ) {
			a = c; 
			var s = p/4;
		}
		else {
			var s = p/(2*Math.PI) * Math.asin (c/a);
		}
		if (t < 1) {
			return - 0.5*(a*Math.pow(2,10*(t-=1)) * 
					Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		}
		return a*Math.pow(2,-10*(t-=1)) * 
				Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
	},
	backIn: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
		   s = 1.70158;
		}
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	backOut: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
			s = 1.70158;  //回缩的距离
		}
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	}, 
	backBoth: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
			s = 1.70158; 
		}
		if ((t /= d/2 ) < 1) {
			return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		}
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	bounceIn: function(t, b, c, d){
		return c - Tween['bounceOut'](d-t, 0, c, d) + b;
	},       
	bounceOut: function(t, b, c, d){
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
		}
		return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
	},      
	bounceBoth: function(t, b, c, d){
		if (t < d/2) {
			return Tween['bounceIn'](t*2, 0, c, d) * 0.5 + b;
		}
		return Tween['bounceOut'](t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
	}
};

主要脚本代码(以VUE框架为例)

mounted: function() {
    var self = this;
    this.$nextTick(function () {
        //表格主区域滑动
        self.tableSwiperFunc({
            $scrollTableFixedLeft: $(".scroll-table-fixed-left"),
            wrap: $(".scroll-table-body")[0],
            scroll: $(".scroll-table-body table")[0],
            wrap_one: $(".scroll-table-fixed-left-body")[0],
            scroll_one: $(".scroll-table-fixed-left-body table")[0],
            wrap_two: $(".scroll-table-head")[0],
            scroll_two: $(".scroll-table-head table")[0],
            judgeScroll: $(".scroll-table-body table")[0],
            moveFunc: function (isDir, target, scroll, scroll_one, scroll_two) {
                if (isDir.x) {
                    transform(scroll, 'translateX', target.x);
                    transform(scroll_two, 'translateX', target.x);
                } else if (isDir.y) {
                    transform(scroll, 'translateY', target.y);
                    transform(scroll_one, 'translateY', target.y);
                }
            },
            endFunc: function (isDir, targetX, targetY, time, scroll, scroll_one, scroll_two) {
                if (isDir.x) {
                    startMove({
                        el: scroll,
                        type: "easeOutStrong",
                        time: time.timeX,
                        target: {
                            translateX: targetX
                        }
                    });
                    startMove({
                        el: scroll_two,
                        type: "easeOutStrong",
                        time: time.timeX,
                        target: {
                            translateX: targetX
                        }
                    });
                } else if (isDir.y) {
                    startMove({
                        el: scroll,
                        type: "easeOutStrong",
                        time: time.timeY,
                        target: {
                            translateY: targetY
                        }
                    });
                    startMove({
                        el: scroll_one,
                        type: "easeOutStrong",
                        time: time.timeY,
                        target: {
                            translateY: targetY
                        }
                    });
                }
            }
        });
        //表格左边固定表头区域滑动
        self.tableSwiperFunc({
            $scrollTableFixedLeft: $(".scroll-table-fixed-left"),
            wrap: $(".scroll-table-fixed-left-body")[0],
            scroll: $(".scroll-table-fixed-left-body table")[0],
            wrap_one: $(".scroll-table-body")[0],
            scroll_one: $(".scroll-table-body table")[0],
            wrap_two: $(".scroll-table-head")[0],
            scroll_two: $(".scroll-table-head table")[0],
            judgeScroll: $(".scroll-table-body table")[0],
            wrapIsFixedLeft: true,
            moveFunc: function (isDir, target, scroll, scroll_one, scroll_two) {
                if (isDir.x) {
                    transform(scroll_one, 'translateX', target.x);
                    transform(scroll_two, 'translateX', target.x);
                }
                if (isDir.y) {
                    transform(scroll, 'translateY', target.y);
                    transform(scroll_one, 'translateY', target.y);
                }
            },
            endFunc: function (isDir, targetX, targetY, time, scroll, scroll_one, scroll_two) {
                if (isDir.x) {
                    startMove({
                        el: scroll_one,
                        type: "easeOutStrong",
                        time: time.timeX,
                        target: {
                            translateX: targetX
                        }
                    });
                    startMove({
                        el: scroll_two,
                        type: "easeOutStrong",
                        time: time.timeX,
                        target: {
                            translateX: targetX
                        }
                    });
                }
                if (isDir.y) {
                    startMove({
                        el: scroll,
                        type: "easeOutStrong",
                        time: time.timeY,
                        target: {
                            translateY: targetY
                        }
                    });
                    startMove({
                        el: scroll_one,
                        type: "easeOutStrong",
                        time: time.timeY,
                        target: {
                            translateY: targetY
                        }
                    });
                }
            }
        });
        //表格固定头部表头区域滑动
        self.tableSwiperFunc({
            $scrollTableFixedLeft: $(".scroll-table-fixed-left"),
            wrap: $(".scroll-table-head")[0],
            scroll: $(".scroll-table-head table")[0],
            wrap_one: $(".scroll-table-fixed-left-body")[0],
            scroll_one: $(".scroll-table-fixed-left-body table")[0],
            wrap_two: $(".scroll-table-body")[0],
            scroll_two: $(".scroll-table-body table")[0],
            judgeScroll: $(".scroll-table-body table")[0],
            moveFunc: function (isDir, target, scroll, scroll_one, scroll_two) {
                if (isDir.x) {
                    transform(scroll, 'translateX', target.x);
                    transform(scroll_two, 'translateX', target.x);
                }
            },
            endFunc: function (isDir, targetX, targetY, time, scroll, scroll_one, scroll_two) {
                if (isDir.x) {
                    startMove({
                        el: scroll,
                        type: "easeOutStrong",
                        time: time.timeX,
                        target: {
                            translateX: targetX
                        }
                    });
                    startMove({
                        el: scroll_two,
                        type: "easeOutStrong",
                        time: time.timeX,
                        target: {
                            translateX: targetX
                        }
                    });
                }
            }
        });

        $(".bug-tr").css({
            'line-height': "42px"
        });
        setTimeout(function () {
            $(".bug-tr").css({
                'line-height': "43px"
            });
        }, 1000);
    })
},
updated: function () {
    this.$nextTick(function () {
        $('.scroll-table-fixed-left-body tr').each(function (index, item) {
            var h = $('.scroll-table-body tr').eq(index).height();
            $(item).find('td').outerHeight(h);
        });
    })
},
methods: {
    /**
        * 表格区域滑动
        * init:{
        * 		$scrollTableFixedLeft: 左边固定表头(jq选择器),
        * 		wrap: 主滑动区域(父级),
        * 		scroll: 主滑动区域,
        * 		wrap_one: 副滑动区域1(父级),
        *   	scroll_one: 副滑动区域1,
        * 		wrap_two: 副滑动区域2(父级),
        * 		scroll_two: 副滑动区域2,
        * 		judgeScroll: 某元素控制左侧固定菜单是否显示,
        * 		wrapIsFixedLeft: true||false,//手指是否在左侧固定表头滑动
        * 		moveFunc: function(){},//touchmove的回调
        * 		endFunc: function(){},//touchend的回调
        * }
    */
    tableSwiperFunc: function(init) {
        var self = this;
        var $vShadow = $(".v-shadow");
        var $scrollTableFixedLeft = init.$scrollTableFixedLeft;
        var judgeScroll = init.judgeScroll;
        /*表格主滑动区域*/
        var wrap = init.wrap;
        var scroll = init.scroll;
        var wrap_width = 0;
        var scroll_width = 0;
        var wrap_height = 0;
        var scroll_height = 0;
        /*表格副滑动区域1*/
        var wrap_one = init.wrap_one;
        var scroll_one = init.scroll_one;
        var wrap_width_one = 0;
        var scroll_width_one = 0;
        var wrap_height_one = 0;
        var scroll_height_one = 0;
        /*表格副滑动区域2*/
        var wrap_two = init.wrap_two;
        var scroll_two = init.scroll_two;
        var wrap_width_two = 0;
        var scroll_width_two = 0;
        var wrap_height_two = 0;
        var scroll_height_two = 0;

        var isDir = { // 判断滑动的方向
            x: false,
            y: false
        };
        var isFirst = true;
        var startPonit = {};
        var startEl = {};
        var startTime = 0;
        var dis = {}; // 手指 当前值 和 初始值的一个差值 
        var timeDis = 0; // 时间差值 
        /*设置初始transfrom*/
        transform(scroll, "translateX", 0);
        transform(scroll, "translateY", 0);
        transform(scroll_one, "translateX", 0);
        transform(scroll_one, "translateY", 0);
        transform(scroll_two, "translateX", 0);
        transform(scroll_two, "translateY", 0);

        wrap.addEventListener('touchstart', function (e) {
            var touch = e.changedTouches[0];

            wrap_width = $(wrap).width();
            scroll_width = $(scroll).width();
            wrap_height = $(wrap).height();
            scroll_height = $(scroll).height();

            wrap_width_one = $(wrap_one).width();
            scroll_width_one = $(scroll_one).width();
            wrap_height_one = $(wrap_one).height();
            scroll_height_one = $(scroll_one).height();

            wrap_width_two = $(wrap_two).width();
            scroll_width_two = $(scroll_two).width();
            wrap_height_two = $(wrap_two).height();
            scroll_height_two = $(scroll_two).height();

            scroll.style.transition = "none";
            scroll.style.WebkitTransition = "none";
            scroll_one.style.transition = "none";
            scroll_one.style.WebkitTransition = "none";
            scroll_two.style.transition = "none";
            scroll_two.style.WebkitTransition = "none";

            startPonit = {
                x: touch.pageX,
                y: touch.pageY
            };
            startEl = {
                x: transform(scroll, "translateX"),
                y: transform(scroll, "translateY")
            };
            if (init.wrapIsFixedLeft) {
                startEl = {
                    x: transform(scroll_one, "translateX"),
                    y: transform(scroll, "translateY")
                };
            }
            startTime = Date.now();
        });
        wrap.addEventListener('touchmove', function (e) {
            e.preventDefault();
            var touch = e.changedTouches[0];
            var nowPonit = {
                x: touch.pageX,
                y: touch.pageY
            };
            var nowTime = Date.now();
            /* 手指 当前值 和 初始值的一个差值 */
            dis = {
                x: nowPonit.x - startPonit.x,
                y: nowPonit.y - startPonit.y
            };
            /*确定滑动方向*/
            if (isFirst) {
                if (Math.abs(dis.x) >= Math.abs(dis.y)) {
                    isDir.x = true;
                    isFirst = false;
                } else if (Math.abs(dis.x) < Math.abs(dis.y)) {
                    isDir.y = true;
                    isFirst = false;
                }
            }
            /* 时间差值 */
            timeDis = nowTime - startTime;
            /* 元素应在要在的一个位置 */
            var target = {
                x: Math.round(startEl.x + dis.x),
                y: Math.round(startEl.y + dis.y)
            };
            if (transform(judgeScroll, "translateX") < 0) {
                $scrollTableFixedLeft.removeClass('hide');
            } else if (transform(judgeScroll, "translateX") >= 0) {
                $scrollTableFixedLeft.addClass('hide');
            }
            /* 设置样式 */
            init.moveFunc && init.moveFunc(isDir, target, scroll, scroll_one, scroll_two);
        });
        wrap.addEventListener('touchend', function (e) {
            var x_bottom_back_num = -(scroll_width - wrap_width); // X轴触底值
            var y_bottom_back_num = -(scroll_height - wrap_height); // Y轴触底值
            if (timeDis >= 100) {// 判断 当用户手指抬起时 和 最后一次移动的时候,有比较大的一个时间间隔,就可以认定 用户在抬起手指前有那么一段时间是按着不动的,那么我们也就不执行缓冲
                dis.x = 0;
                dis.y = 0;
            }
            var speedX = dis.x / timeDis; // X轴速度
            var speedY = dis.y / timeDis; // Y轴速度
            speedX = speedX ? speedX : 0;
            speedY = speedY ? speedY : 0;
            //					var s = speed*speed / (2*0.005) * (speed/Math.abs(speed)); // 距离
            var sX = speedX * 170;
            var sY = speedY * 170;
            var nowX = transform(scroll, "translateX");
            var nowY = transform(scroll, "translateY");
            var targetX = Math.round(nowX + sX);
            var targetY = Math.round(nowY + sY);
            //过界处理
            if (targetX > 0) {
                targetX = 0;
            } else if (scroll_width >= wrap_width && targetX < x_bottom_back_num) {
                targetX = x_bottom_back_num;
            }
            if (targetY > 0) {
                targetY = 0;
            } else if (scroll_height >= wrap_height && targetY < y_bottom_back_num) {
                targetY = y_bottom_back_num;
            }
            // time 整个动画的动画时间
            // s - now 移动距离
            // time 移动距离越远 时间就越长
            var timeX = Math.abs(sX) * 1.15;
            var timeY = Math.abs(sY) * 1.15;
            timeX = timeX == 0 ? 200 : timeX;
            timeY = timeY == 0 ? 200 : timeY;
            var time = {
                timeX: timeX,
                timeY: timeY
            };
            if (init.wrapIsFixedLeft) {
                x_bottom_back_num = -(scroll_width_one - wrap_width_one);
                nowX = transform(scroll_one, "translateX");
                targetX = Math.round(nowX + sX);
                if (targetX > 0) {
                    targetX = 0;
                } else if (scroll_width_one >= wrap_width_one && targetX < x_bottom_back_num) {
                    targetX = x_bottom_back_num;
                }
            }
            init.endFunc && init.endFunc(isDir, targetX, targetY, time, scroll, scroll_one, scroll_two);

            isFirst = true;
            isDir = { // 初始化滑动的方向
                x: false,
                y: false
            };
        });
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动端-表头固定的表格组件 的相关文章

  • 下载安装eclipse Jee

    官网下载 下载Windows 64位版本 下载完成后解压 双击eclipse exe 选择workspace 安装成功
  • <audio>数据发生变化,音频播放器实时替换

    写法一 的文件发生变化 音频播放器没有实时替换
  • 刷脸支能降本提效率带来新的交互和应用

    随着5G和AI的深度结合 2019年将提速进入刷脸支付时代 统计显示 未来人脸识别市场规模将保持20 左右的增速 由此可见 刷脸支付迎来全面爆发只是时间问题而已 不少业内人士表示 只有加速布局刷脸支付 才能在这一轮新的科技与产业革命中赢得先
  • 轻量级网络(一):MobileNet V1,V2, V3系列

    轻量级网络 一 MobileNet V1 V2 V3系列 文章目录 轻量级网络 一 MobileNet V1 V2 V3系列 MobileNet V1 卷积计算量 标准卷积 深度可分卷积 模型瘦身 宽度倍增器 分辨率倍增器 MobileNe
  • 凸函数性质习题

    试题专页 1题文 考试题提前练 gt 戳这 凸函数的性质定理为 如果函数f x 在区间D上是凸函数 则对于区间D内的任意x1 x2 xn 有 f x1 f x2 f xn n f x1 x2 xn n 已知函数y sinx在区间 0 上是凸
  • Unity--人物走近调节景物的不透明度

    思路 给景物添加碰撞体后 写入对应脚本 再由角色触碰后调用脚本里改变透明度的函数 设置好对应的碰撞体 导入渐变的组件 设置一下 统一一个集中存放设置的脚本 using System Collections using System Coll
  • Java中的泛型(类,方法,接口)与可变参数

    泛型 泛型的本质是参数化类型 也就是说所操作的数据类型被指定为一个参数 参数化类型 将类型由原来的具体的类型参数化 然后在使用 调用时传入具体的类型 参数化类型可以用在类 方法和接口中 分别被称为 泛型类 泛型方法 泛型接口 泛型的好处 把
  • C++容器deque的用法

    目录 1 deque容器概念 2 deque对象的构造 2 1deque对象的默认构造 2 2deque对象的带参数构造 3 deque头部和末尾的添加移除操作 4 deque的数据存取 5 deque与迭代器 6 deque的赋值 7 d
  • 大数据-玩转数据-Dataphin调度节点参数设置

    一 节点参数配置项 默认参数值 yyyyMMdd 为业务日期 即当前日期的前一天T 1 yyyyMMdd 为执行日期 即当前日期T 默认参数 bizdate nodeid taskid nodeid是节点id taskid是节点生成实例时候
  • 计算机就业哀鸿遍野,为何高考生还疯狂涌入计算机专业?

    计算机行业不缺梦想 但缺愿意为了梦想不断进步的人 雷军可以说是认真实现自己梦想的代表人物 8月14日晚 雷军在三小时的2023 雷军年度演讲 和年度新品发布中 以 所有人生难题 都将在成长中找到答案 为主题 分享了过去30多年经历的几次关键
  • 机器学习 KNN算法

    参考B站简博士 一 KNN基本概念 最近邻 k Nearest Neighbors KNN 算法是一种分类算法 该算法的思想是 一个样本与数据集中的k个样本最相似 如果这k个样本中的大多数属于某一个类别 则该样本也属于这个类别 二 距离度量
  • 怎么给虚拟服务器安装系统,虚拟机安装系统图文详解

    虚拟机安装系统 虚拟机是一个非常实用的应用程序 因为我们可以在虚拟机里面测试一些软件的稳定性 并且虚拟机可以安装好几种系统 操作也非常的简便 下面 小编就给大家介绍一下虚拟机安装系统的操作步骤 虚拟机安装系统图文详解 准备工具 VMware
  • Unity2019_动画系统

    动画的播放控制 选中怪物 点击Avtar中的资源 在Asset资源目录下的模型 动画类型为泛型 工程目录下鼠标右键创建动画控制器 找到下面的动画拖到Entry中 添加动画参数类型Int Id 选中到Ready的箭头 右侧添加条件Id 1 为
  • [C语言]数据是如何存储的(整型篇)?(一)

    新手小白写的第一篇博客 记录自己的学习过程 希望我写的文章能给你们帮助 如果有不足的地方欢迎在评论区留言交流 首先我要介绍数据分为哪些类型 其次介绍整型在数据中是怎样存储的 最后介绍浮点型在内存中的存储 一 数据类型 基本的内置类型 cha
  • Docker映像存储在哪里? Docker容器路径介绍

    Docker has been widely adopted and is used to run and scale applications in production Additionally it can be used to st

随机推荐

  • Fundamental concepts about Lithography

    https dunham ece uw edu ee528 notes Chapter5 pdf Text Silicon VLSI technology fundamentals practice and modeling Aerial
  • 在Power Designer生成的类图中同时显示name和code

    在PowerDesigner生成的类图中同时显示name和code 问题 由显示name改为显示code 同时显示name和Code 问题 Power Designer是一款非常强大的设计工具 缺省的类图只显示name 一般地我们在name
  • 牛顿法(Newton’s method)

    牛顿法通常都是用来寻找一个根 同时也可以理解为最大化目标函数的局部二次近似 设我们的目标函数为f x 那么一个关于x0的二次近似就有 我们用f进行匹配 可以得到 如果b lt 0 g的最大值为a 得到更新规则 这是牛顿法在最优化方面的表述
  • 使用wps转换文本中001、002章节名为第001章、第002章

    1 首先ctrl f打开查找和替换 2 点击弹窗中高级搜索 选中使用通配符 3 可先输入 lt 0 9 3 尝试是否可以查找出文本内章节名 可以找到的话进行下一步 4 切换到替换tab 替换为输入框内输入第 1章 之后点击底部全部替换 即可
  • 万向区块链肖风:元宇宙的十大经济规则

    本文为万向区块链董事长兼总经理肖风为华泰证券研究所科技及电子行业首席分析师黄乐平 万向区块链首席经济学家邹传伟联合撰写的 元宇宙经济学 所作序言 元宇宙是什么 按照我的理解 元宇宙是一个由分布式网络技术 分布式账本和分布式社会 商业构成的三
  • 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇

    上篇笔记主要介绍了与TIME WAIT相关的基础知识 本文则从实践出发 说明如何解决文章标题提出的问题 1 查看系统网络配置和当前TCP状态 在定位并处理应用程序出现的网络问题时 了解系统默认网络配置是非常必要的 以x86 64平台Linu
  • Python raise用法(超级详细,看了无师自通)

    当程序出现错误时 系统会自动引发异常 除此之外 Python 也允许程序自行引发异常 自行引发异常使用 raise 语句来完成 异常是一种很 主观 的说法 以下雨为例 假设大家约好明天去爬山郊游 如果第二天下雨了 这种情况会打破既定计划 就
  • 软件测试测试环境搭建很难?一天学会这份测试环境搭建教程

    如何搭建测试环境 这既是一道高频面试题 又是困扰很多小伙伴的难题 因为你在网上找到的大多数教程 乃至在一些培训机构的课程 都不会有详细的说明 你能找到的大多数项目 是在本机电脑环境搭建环境 或是别人已经搭建好的环境 你很难上手体验在服务器上
  • IntersectionObserver实现滚动加载

    加载模板及样式 template div class lazy more div
  • WebSocket :用WebSocket实现推送你必须考虑的几个问题

    目录 目录 WebSocket简介 项目背景硬件环境及客户端支持 本文研究内容 基于javaxwebsocket服务端代码源码后续补充git连接 客户端代码 问题探索 8月3日补充 中间线路断网情况 如何做到支持几千个client同时在线人
  • WebSocket集群解决方案,不用MQ

    首先不了解WebSocket的可以先看看这篇文章 以及传统的WebSocket方案是怎么做的 https www cnblogs com jeremylai7 p 16875115 html 这是用MQ解决的版本 那么这种方案存在什么问题呢
  • 使用nginx配置二级域名

    最近想把三个项目配在一个服务器上 于是想使用nginx配置二级域名实现 1 域名添加解析 我的是阿里云的域名 所以首先给自己的域名添加解析 打算使用 www codeliu com test1 codeliu com test2 codel
  • elementUI表格行的点击事件,点击表格,拿到当前行的数据

    1 绑定事件 2 定义事件 3 点击表格某行的时候 拿到数据 转载于 https www cnblogs com wuhefeng p 11316215 html
  • STM32 PID调节输出电压

    一 简介 关于PID调节的这里不做详解 就简单说下 其实就是先设定好一个期望 通过反馈系统返回输出值 然后判断这个输出实际输出的值 和我们的期望值的误差 然后PID算法根据这个误差 去调整我们的输出值 直到输出达到我们的期望值 那么我们为啥
  • 为什么程序员做外包会被瞧不起?

    二哥 有个事想询问下您的意见 您觉得应届生值得去外包吗 公司虽然挺大的 中xx 但待遇感觉挺低 马上要报到 挺纠结的 以上是读者小 K 给我发的私信 除此之外 还有个读者 down 也问我关于外包的事情 担心外包学不到技术 但很不幸的是年前
  • 11种概率分布,你了解几个?

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文转自 视学算法 了解常见的概率分布十分必要 它是概率统计的基石 这是昨天推送的 从概率统计到深度学习 四大技术路线图谱 都在这里 文章中的第一大技术路线图谱如下所示
  • 【mega-nerf】调包失败&pip install失败解决方案

    Problem 1 调包失败 在这样的层级架构里调包 输出无法找到 mega nerf 直接用 sys path append 没有作用 import sys print sys path sys path append home pape
  • Java实现Excel文件生成和下载功能

    7 行代码优雅地实现 Excel 文件生成 下载功能 欢迎关注博主公众号 小哈学Java 专注于分享Java领域干货文章 关注回复 资源 免费领取全网最热的Java架构师学习PDF 转载请注明出处 https www exception s
  • stm32F103C8T6控制DHT11

    stm32F103C8T6控制DHT11串口打印 stm32F103C8T6控制DHT11串口打印学习经验总结 本人借鉴了许多大佬们的资料 这是个人学习的见解 如发现错误之处 麻烦指导指导 借鉴链接 https blog csdn net
  • 移动端-表头固定的表格组件

    UI原型 HTML代码 div class scroll table box div class scroll table head table class tb1 thead tr th style width 3em 序号 th th