移动端实现滑屏和添加自定义滚动条(也可以不加)的封装函数

把昨天的实例用到的函数封装了一下,方便以后用在其他的地方(功能会不断完善,持续更新中……)

更新于:2018/6/6  更新的内容为:添加了几个可选函数(start、move、end、over),其中start是手指按下时,执行的函数,move是手指移动时,执行的函数,end是手指抬起时执行的函数,over是滚动结束后执行的函数

使用方法如下小实例所示:

window.onload = function(){
	createList();
	var wrap = document.querySelector('#wrap');
	
mScroll({
                el:box,
                start:function(e){
                    console.log("手指按下要执行的函数");
                },
                move:function(e){
                    console.log("发生滚动的时候,执行的函数")
                },
                end:function(e){
                    console.log("手指抬起要执行的函数");
                },
                over:function(){
                    console.log("滚动结束");
                }
            });
};
mScroll(init);

参数说明:init:对象,里面可以有两个属性。

el:是必须的,就是想要实现滑屏时,移动的主体部分

offBar:是是否添加滚动条,如果不添加的话就加这个属性,属性值为true,如果不写这个属性或者这个属性的值为false时,就表示加滚动条

start、move、end、over,作用上面已经说过了,记得都是函数类型

看下面的封装代码:

function mScroll(init){
	if(!init.el){
		return;
	}
	var wrap = init.el;
	var inner = init.el.children[0];
	var scrollBar = document.createElement("div");	
	var startPoint = 0;
	var startEl = 0;
	var lastY = 0;
	var lastDis = 0;
	var lastTime = 0;
	var lastTimeDis = 0;
	var back = document.documentElement.clientWidth/8;
	var maxTranslate = wrap.clientHeight - inner.offsetHeight;
	scrollBar.id = "scrollBar";
	if(!init.offBar){
		var scale = wrap.clientHeight/inner.offsetHeight;
		inner.style.minHeight = "100%";
		scrollBar.style.cssText = "width:4px;background:rgba(0,0,0,.5);position:absolute;right:0;top:0;border-radius:2px;opacity:0;transition:.3s opacity;";
		wrap.appendChild(scrollBar);
	}
	css(inner,"translateZ",0.01);
	inner.addEventListener('touchstart', function(e) {
		maxTranslate = wrap.clientHeight - inner.offsetHeight;
		if(!init.offBar){
			if(maxTranslate >= 0) {
				scrollBar.style.display = "none";
			} else {
				scrollBar.style.display = "block";
			}
			scale = wrap.clientHeight/inner.offsetHeight;
			scrollBar.style.height = wrap.clientHeight * scale + "px";
		}
		clearInterval(inner.timer);
		startPoint = e.changedTouches[0].pageY;
		startEl = css(inner,"translateY");
		lastY = startEl;
		lastTime = new Date().getTime();
		lastTimeDis = lastDis = 0;
		(init.offBar)||(scrollBar.style.opacity = 1);
		init.start&&init.start.call(box,e);
	});
	inner.addEventListener('touchmove', function(e) {
		var nowTime = new Date().getTime();
		var nowPoint = e.changedTouches[0].pageY;
		var dis = nowPoint - startPoint;
		var translateY = startEl + dis;
		if(translateY > back){
			translateY = back
		} else if(translateY < maxTranslate -back){
			translateY = maxTranslate - back;
		}
		css(inner,"translateY",translateY);
		(init.offBar)||css(scrollBar,"translateY",-translateY*scale);
		lastDis = translateY - lastY;
		lastY = translateY;
		lastTimeDis = nowTime - lastTime;
		lastTime = nowTime;
		init.move&&init.move.call(box,e);
	});
	inner.addEventListener('touchend', function(e) {
		var type = "easeOut";
		var speed = Math.round(lastDis / lastTimeDis*10);
		speed = lastTimeDis <= 0?0 :speed;
		var target = Math.round(speed*30 + css(inner,"translateY"));
		if(target > 0){
			target = 0;
			type = "backOut";
		} else if(target < maxTranslate){
			target = maxTranslate;
			type = "backOut";
		}
		MTween({
			el:inner,
			target: {translateY:target},
			time: Math.round(Math.abs(target - css(inner,"translateY"))*1.8),
			type: type,
			callBack: function(){
				(init.offBar) || (scrollBar.style.opacity = 0);
				init.over&&init.over.call(box,e);
			},
			callIn: function(){
				var translateY = css(inner,"translateY");
				init.offBar||css(scrollBar,"translateY",-translateY*scale);
				init.move&&init.move.call(box,e);
			}
		});
		init.end&&init.end.call(box,e);
	});
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现自定义滚动条和QTreeWidget的滚动条同步,可以借助QScrollBar的valueChanged()信号和QTreeWidget的scrollTo()函数。 具体步骤如下: 1. 继承QScrollBar并重写paintEvent()函数,以实现自定义滚动条的绘制效果。 2. 在QScrollBar的valueChanged()信号中获取当前滚动条的值,并将其转化为QTreeWidget中需要滚动到的位置。 3. 调用QTreeWidget的scrollTo()函数,将滚动条的值所对应的位置滚动到可见区域。 4. 将QScrollBar和QTreeWidget的valueChanged()信号相互连接,以实现二者滚动条的同步。 下面是一个简单的示例代码: ```cpp class CustomScrollBar : public QScrollBar { public: CustomScrollBar(QWidget *parent = nullptr) : QScrollBar(parent) { setStyleSheet("QScrollBar:vertical { background-color: #F5F5F5; width: 20px; margin: 0px 0px 0px 0px; }" "QScrollBar::handle:vertical { background-color: #D3D3D3; min-height: 20px; }" "QScrollBar::add-line:vertical { height: 0px; }" "QScrollBar::sub-line:vertical { height: 0px; }"); } protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); QPainter painter(this); painter.fillRect(rect(), Qt::white); painter.setPen(Qt::black); painter.drawRoundedRect(rect().x(), rect().y(), rect().width() - 1, rect().height() - 1, 5, 5); } }; class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { QTreeWidget *treeWidget = new QTreeWidget(this); treeWidget->setColumnCount(1); treeWidget->setHeaderHidden(true); for (int i = 0; i < 20; i++) { QTreeWidgetItem *item = new QTreeWidgetItem(); item->setText(0, QString("Item %1").arg(i)); treeWidget->addTopLevelItem(item); } CustomScrollBar *scrollBar = new CustomScrollBar(this); scrollBar->setOrientation(Qt::Vertical); scrollBar->setRange(0, treeWidget->verticalScrollBar()->maximum()); scrollBar->setValue(treeWidget->verticalScrollBar()->value()); connect(scrollBar, &QScrollBar::valueChanged, [=](int value) { treeWidget->verticalScrollBar()->setValue(value); }); connect(treeWidget->verticalScrollBar(), &QScrollBar::valueChanged, [=](int value) { scrollBar->setValue(value); }); QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(treeWidget); layout->addWidget(scrollBar); QWidget *centralWidget = new QWidget(this); centralWidget->setLayout(layout); setCentralWidget(centralWidget); } }; ``` 在上面的代码中,我们首先定义了一个CustomScrollBar类,继承自QScrollBar,并重写了paintEvent()函数,以实现自定义滚动条的绘制效果。 然后,在MainWindow类的构造函数中创建了一个QTreeWidget和一个CustomScrollBar,并将它们添加到水平布局中。 接着,我们将CustomScrollBar和QTreeWidget的valueChanged()信号相互连接,以实现二者滚动条的同步。具体来说,当CustomScrollBar的值发生变化时,我们调用QTreeWidget的scrollTo()函数,将滚动条的值所对应的位置滚动到可见区域;当QTreeWidget的值发生变化时,我们将CustomScrollBar的值设置为相应的值,以保持二者的滚动条同步。 最后,我们将水平布局设置为MainWindow的中央部件,以显示QTreeWidget和CustomScrollBar。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值