如何实现div 页面居中下滑div内内容跟着滑动

502 Bad Gateway
502 Bad Gateway怎样阻止一个 DIV 滚动时整个页面滚动? - 知乎6被浏览4271分享邀请回答function smartTouchScroll() {
var startY, allow, body = document.body;
function isAllow(target, r, adjust) {
adjust = adjust || 0;
r.down = r.down || (target.scrollTop & 0);
var scrollHeight = target !== body ? target.scrollHeight + adjust: target.clientHeight;
var $target = $(target);
if ($target.css('overflow-y') !== 'hidden') {
= r.up || (target.scrollTop & scrollHeight - target.clientHeight);
if (!r.down || !r.up) {
adjust = $target.cssv('margin-top');
target = target.offsetParent;
if (!!target) {
return isAllow(target, r, adjust);
document.addEventListener('touchstart', function(event) {
allow = body.clientHeight & window.innerHeight
? {up: true, down: true}
: isAllow(event.target, {});
startY = event.pageY;
document.addEventListener('touchmove', function(event) {
var up = (event.pageY & startY), down = (event.pageY & startY);
startY = event.pageY;
if ((up && allow.up) || (down && allow.down)) {
event.stopPropagation();
event.preventDefault();
01 条评论分享收藏感谢收起实现div内滚动到底部进行加载 - 简书
实现div内滚动到底部进行加载
上节讲到如何判断是否滚动到页面的底部,然后进行一系列的操作,这节讲下如何在一个div中一直滚动加载,先来看下下面一段代码:
&!DOCTYPE html&&html lang="en"&
&meta charset="UTF-8"&
&title&div滚动到底部加载&/title&
.scrollDiv{
width: 500
height: 400
margin: 10
background-color: #ff0000;
overflow-y:
padding: 10
&div class="scrollDiv" id="testDiv"&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
&br/&&br/&&br/&&br/&&br/&
var divscroll = document.getElementById('testDiv');
function divScroll() {
var wholeHeight = divscroll.scrollH
var scrollTop = divscroll.scrollT
var divHeight = divscroll.clientH
if(scrollTop + divHeight &= wholeHeight){
alert('滚动到底部了!');
//这里写动态加载的逻辑,比如Ajax请求后端返回下一个页面的内容
if(scrollTop == 0){
alert('滚动到头部了!');
divscroll.onscroll = divS
仔细看的话,其实和判断网页是否滚动到底部是一个道理。
Paste_Image.png
爱编程,爱开发,爱写写小情绪。(持续更新项目中碰到的各种比较实用的经验!还会写一些比较实用的学习资料,喜欢请关注。)手机网站表层div滑动,导致底层body滑动(touchmove的阻止)
22870次浏览
body很长,可以滑动,body头部有一个模拟下拉的选择框。下拉选择有滚动轴,如下图。
我给body一个overflow:hidden和高度是没有用的。手机网站上背景还是可以滑动,然后我给body一个touchmove的preventdefault()阻止事件,body滑动阻止了,PC上面是可以了,但是手机上面滑动div还是会导致底部body的滑动,我给div 一个阻止冒泡的事件stopPropagation(),手机网站上面还是不可以。
关于preventdefault和stopPropagation,后面有时间会讲解其区别。
我经过反复测试,发现滚动轴滚到底部的时候,会触发body的滑动,那么我就在事件滚到底部的时候对表层的div做一个touchmove的阻止。到达滚动轴底部,向下滑动,阻止事件,向上滑动,开启事件。为此就要判断touchmove的方向了。
var startX ,startY;
$(&body&).on(&touchstart&, function(e) {
e.preventDefault();
startX = e.originalEvent.changedTouches[0].pageX,
startY = e.originalEvent.changedTouches[0].pageY;
$(&body&).on(&touchmove&, function(e) {
e.preventDefault();
var moveEndX = e.originalEvent.changedTouches[0].pageX,
moveEndY = e.originalEvent.changedTouches[0].pageY,
X = moveEndX - startX,
Y = moveEndY - startY;
if ( Math.abs(X) & Math.abs(Y) && X & 0 ) {
alert(&left 2 right&);
else if ( Math.abs(X) & Math.abs(Y) && X & 0 ) {
alert(&right 2 left&);
else if ( Math.abs(Y) & Math.abs(X) && Y & 0) {
alert(&top 2 bottom&);
else if ( Math.abs(Y) & Math.abs(X) && Y & 0 ) {
alert(&bottom 2 top&);
alert(&just touch&);
上面的方法是判断touchmove的滑动方向。
除了上面方法判断手机端手机滑动方向,我这里再介绍一个方案,就是封装一个角度函数,通过角度函数来判断也还不错!我这里仅仅把这种方式实现上滑下滑左滑右滑列举一下!
var startx,
//获得角度
function getAngle(angx, angy) {
return Math.atan2(angy, angx) * 180 / Math.PI;
//根据起点终点返回方向 1向上 2向下 3向左 4向右 0未滑动
function getDirection(startx, starty, endx, endy) {
var angx = endx -
var angy = endy -
var result = 0;
//如果滑动距离太短
if (Math.abs(angx) & 2 && Math.abs(angy) & 2) {
var angle = getAngle(angx, angy);
if (angle &= -135 && angle &= -45) {
result = 1;
} else if (angle & 45 && angle & 135) {
result = 2;
} else if ((angle &= 135 && angle &= 180) || (angle &= -180 && angle & -135)) {
result = 3;
} else if (angle &= -45 && angle &= 45) {
result = 4;
//手指接触屏幕
document.addEventListener(&touchstart&, function(e) {
startx = e.touches[0].pageX;
starty = e.touches[0].pageY;
}, false);
//手指离开屏幕
document.addEventListener(&touchend&, function(e) {
endx = e.changedTouches[0].pageX;
endy = e.changedTouches[0].pageY;
var direction = getDirection(startx, starty, endx, endy);
switch (direction) {
alert(&未滑动!&);
alert(&向上!&)
alert(&向下!&)
alert(&向左!&)
alert(&向右!&)
}, false);
知道滑动方向如何判断,那么解决这个问题我们可以判断是否滑动到底部或者顶部,假如滑动到底部,再往下滑动,就阻止滑动,往上滑动,就开启滑动!滑动到顶部一个道理!总结代码如下:
$('#haorooms底层背景').bind(&touchmove&, function (e) {
e.preventDefault();
$(&.滚动的父亲&).bind(&touchstart&, function (events) {
startY = events.originalEvent.changedTouches[0].pageY;
$(&.滚动的父亲 ul&).bind(&touchmove&, function (e) {
var ulheight = $(this).height();
var scrollTop = $(this).scrollTop();
var scrollheight = $(this)[0].scrollH
if (ulheight + scrollTop + 20 &= scrollheight) { //滚到底部20px左右
$(&.滚动的父亲&).bind(&touchmove&, function (event) {
moveEndY = event.originalEvent.changedTouches[0].pageY,
theY = moveEndY - startY;
if (Math.abs(theY) & Math.abs(theX) && theY & 0) { //用上面的abs()更加准确!这里是判断上滑还是下滑!可以用角度函数也可以用上面绝对值方式!
$(&.滚动的父亲&).unbind(&touchmove&);//滑动到底部再往上滑动,解除阻止!
if (Math.abs(theY) & Math.abs(theX) && theY & 0) {
event.preventDefault();//滑动到底部,再往下滑动,阻止滑动!
if (scrollTop & 20) {//滚到顶部20px左右
$(&.滚动的父亲&).bind(&touchmove&, function (event) {
moveEndY = event.originalEvent.changedTouches[0].pageY,
theY = moveEndY - startY;
if (Math.abs(theY) & Math.abs(theX) && theY & 0) {
event.preventDefault();
if (Math.abs(theY) & Math.abs(theX) && theY & 0) {
$(&.滚动的父亲&).unbind(&touchmove&);
以上方法基本上能够阻止body的滚动,但是,有时候还是会有问题,期待更好的解决方案!
张鑫旭的一种解决办法
下面是张鑫旭的一个解决办法,这里我简单的借用一下!
.noscroll,
.noscroll body {
.noscroll body {
$.smartScroll = function(container, selectorScrollable) {
// 如果没有滚动容器选择器,或者已经绑定了滚动时间,忽略
if (!selectorScrollable || container.data('isBindScroll')) {
// 是否是搓浏览器
// 自己在这里添加判断和筛选
var data = {
maxscroll: 0
// 事件处理
container.on({
touchstart: function (event) {
var events = event.touches[0] ||
// 先求得是不是滚动元素或者滚动元素的子元素
var elTarget = $(event.target);
if (!elTarget.length) {
// 获取标记的滚动元素,自身或子元素皆可
if (elTarget.is(selectorScrollable)) {
elScroll = elT
} else if ((elScroll = elTarget.parents(selectorScrollable)).length == 0) {
elScroll =
if (!elScroll) {
// 当前滚动元素标记
data.elScroll = elS
// 垂直位置标记
data.posY = events.pageY;
data.scrollY = elScroll.scrollTop();
// 是否可以滚动
data.maxscroll = elScroll[0].scrollHeight - elScroll[0].clientH
touchmove: function () {
// 如果不足于滚动,则禁止触发整个窗体元素的滚动
if (data.maxscroll &= 0 || isSBBrowser) {
// 禁止滚动
event.preventDefault();
// 滚动元素
var elScroll = data.elS
// 当前的滚动高度
var scrollTop = elScroll.scrollTop();
// 现在移动的垂直位置,用来判断是往上移动还是往下
var events = event.touches[0] ||
// 移动距离
var distanceY = events.pageY - data.posY;
if (isSBBrowser) {
elScroll.scrollTop(data.scrollY - distanceY);
elScroll.trigger('scroll');
// 上下边缘检测
if (distanceY & 0 && scrollTop == 0) {
// 往上滑,并且到头
// 禁止滚动的默认行为
event.preventDefault();
// 下边缘检测
if (distanceY & 0 && (scrollTop + 1 &= data.maxscroll)) {
// 往下滑,并且到头
// 禁止滚动的默认行为
event.preventDefault();
touchend: function () {
data.maxscroll = 0;
// 防止多次重复绑定
container.data('isBindScroll', true);
html如下:
&aside id=&aside& class=&aside&&
&i class=&aside-overlay hideAside&&&/i&
&div class=&aside-content&&
&div class=&module module-filter-list&&
&div class=&module-main scrollable&&
&ul id=&filters& class=&sort-ul&&
$('#aside').addClass('active');
$.smartScroll($('#aside'), '.scrollable');
$('html').addClass('noscroll');
大家可以测试一下!
相关文章:
关键词搜索

我要回帖

更多关于 div 加载页面 的文章

 

随机推荐