back to top & back to bottom
back to top & back to bottom
infinite auto load more & infinite scroll & load more
https://codepen.io/xgqfrms/pen/NZVvGM
"use strict";
/**
 *
 * @author xgqfrms
 * @license MIT
 * @copyright xgqfrms
 *
 * @description scrollBottomAutoLoadMore
 * @augments
 * @example
 * @link
 *
 */
// utils
let log = console.log;
let error = console.error;
let box = document.querySelector(`[data-dom="outbox"]`);
// bottom: 556.59375
// height: 525.59375
// left: 135
// right: 405
// top: 31
// width: 270
// x: 135
// y: 31
// height: 525.59375 ~= 526
// ch = 526
// 1562 - 1036 = 526
// sh = 1562
// st = 1036
// ch = 526
// cw = 253
// oh = 526
// ow = 270
// sh = 1562
// sw = 253
// st = 1036
let isTriggerOnce = true;
const scrollBottomAutoLoadMore = (debug = false) => {
    for (let i = 0; i < 20; i++) {
        let template = `<div class="innerbox" data-dom="innerbox">${i + 1}</div>`;
        box.insertAdjacentHTML(`beforeend`, template);
    }
    let BoundingClientRect = box.getBoundingClientRect();
    let ClientRects = box.getClientRects();
    // log(`BoundingClientRect =`, BoundingClientRect);
    // log(`ClientRects`, ClientRects);
    // Event
    box.addEventListener(`scroll`, (e) => {
        // log(`e =`, e);
        // log(`e.target =`, e.target);
        // clientHeight, offsetHeight, scrollHeight
        let ch = e.target.clientHeight;
        let cw = e.target.clientWidth;
        // log(`ch =`, ch);
        // log(`cw =`, cw);
        let oh = e.target.offsetHeight;
        let ow = e.target.offsetWidth;
        // log(`oh =`, oh);
        // log(`ow =`, ow);
        let sh = e.target.scrollHeight;
        let sw = e.target.scrollWidth;
        // log(`sh =`, sh);
        // log(`sw =`, sw);
        let st = e.target.scrollTop;
        // log(`st =`, st);
        let trigger = (sh - st) < (ch + 50) ? true : false;
        let triggerValue = (sh - st) < (ch + 50);
        if (trigger && isTriggerOnce) {
            alert(`trigger loadMore function!`);
            isTriggerOnce = false;
            for (let i = 0; i < 10; i++) {
                let template = `<div class="innerbox" data-dom="innerbox">${i + 1}</div>`;
                box.insertAdjacentHTML(`beforeend`, template);
            }
            setTimeout(() => {
                alert(`Ajax & fetch data success!`);
                isTriggerOnce = true;
            }, 1000);
        } else {
            // do nothing
            // log(`sh =`, sh);
            // log(`st =`, st);
            // log(`ch =`, ch);
            log(`(sh - st) =`, (sh - st));
            log(`(ch - 50) =`, (ch + 50));
            log(`triggerValue =`, triggerValue);
        }
        // clientHeight: 526
        // clientWidth: 346
        // offsetHeight: 526
        // offsetLeft: 182
        // offsetTop: 31
        // offsetWidth: 363
        // scrollHeight: 1562
        // scrollLeft: 0
        // scrollTop: 1036
        // scrollWidth: 346
    });
    // MouseEvent
    box.addEventListener(`click`, (e) => {
        // log(`e =`, e);
        // log(`e.target =`, e.target);
        // pageX, pageY, screenX, screenY, clientX, and clientY
        let px = e.pageX;
        let py = e.pageY;
        // let sx = e.screenX;
        // let sy = e.screenY;
        // let cx = e.clientX;
        // let cy = e.clientY;
        log(`px =`, px);
        log(`py =`, py);
        let lx = e.layerX;
        let ly = e.layerY;
        let mx = e.movementX;
        let my = e.movementY;
        let ox = e.offsetX;
        let oy = e.offsetY;
    });
};
window.addEventListener("DOMContentLoaded", (event) => {
    console.log("DOM fully loaded and parsed");
    scrollBottomAutoLoadMore();
});
// export default scrollBottomAutoLoadMore;
// export {
//     scrollBottomAutoLoadMore,
// };
https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll
https://zzk.cnblogs.com/my/s/blogpost-p?Keywords=scroll
refs
xgqfrms 2012-2020
www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有️xgqfrms, 禁止转载 ️,侵权必究️!
back to top & back to bottom的更多相关文章
- Altium Designer16 如何分别导出TOP层和BOTTOM层
		
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 作者:struct_mooc 博客地址:https://www.cnblogs.com/stru ...
 - menu({postion:{my:"left top"},at:"right bottom"})里的my与at会冲突吗
		
my(默认值:"center")类型:String描述:定义被定位元素上对准目标元素的位置:"horizontal vertical" 对齐方式.一个单一的值, ...
 - 每天CSS学习之top/left/right/bottom
		
top:值域是数值或百分比,正负都可以.该值表示 距离顶部有多少像素.例如top:10px:即距离顶部10个像素. left/right/bottom与top如出一辙,只是方向不一样而已. 这些属性一 ...
 - (四)学习CSS之position、bottom、left、right和top属性
		
参考:http://www.w3school.com.cn/cssref/pr_class_position.asp position 属性规定元素的定位类型. 这个属性定义建立元素布局所用的定位机制 ...
 - css top,right,bottom,left设置为0有什么用?它和width:100%和height:100%有什么区别?
		
壹 ❀ 引 当我们使用position属性时,总免不了与top,left,right,bottom四个属性打交道,那么这四个属性都设置为0时有什么用,与宽高设置100%又有什么区别?本文对此展开讨论 ...
 - vertical-align:top属性
		
vertical-align这个是设置元素的垂直排列的. 用来定义行内元素的基线相对于该元素所在行的基线的垂直对齐. 它的值比较多:baseline | sub | super | top | tex ...
 - Top值
		
业务开发中经常会用到元素或者浏览器窗口的各种top值,最近开发组件的过程中也遇到各种问题,因此决定好好总结一下. 常见的top值 scrollTop Element.scrollTop 属性可以获取或 ...
 - css 样式中 margin padding和top类定位的区别
		
1 margin margin 是外边距的意思,是边框到外部另一元素之间的距离,允许使用负值 语法结构: margin:5px auto; 意思上下为5,左右平均居中 ...
 - Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件
		
Jquery Mobiscroll是一个用于触摸设备(Android phones, iPhone, iPad, Galaxy Tab)的日期和时间选择器jQuery插件.以及各种滑动插件 可以让用户 ...
 
随机推荐
- gitignore 不起作用的解决办法  不再跟踪 让.gitignore生效,跟踪希望被跟踪的文件
			
实践 # https://git-scm.com/docs/gitignore https://git-scm.com/docs/gitignore 不跟踪log目录下的所有文件,但需要保留这个文件夹 ...
 - 这些年来,一直不知道Code Fisrt的真实意义。
			
目录 Code First 是一个糟糕的名字 放弃 EDMX,但继续实行数据库优先 Code First 是一个糟糕的名字 很多人依据它的名字认为,它是在代码定义模型,然后从模型生成数据库. Code ...
 - MySQL 高性能优化规范建议
			
数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名 ...
 - LibreOJ #10047
			
应同机房某大佬的要求来写这篇题解 Description 给定一个字符串 \(S\) 和一个数 \(K\),要求求出 \(S\) 的所有形似 \(A+B+A\) 的子串数量,其中 \(\mid A\m ...
 - loj10003加工生产调度
			
题目描述 某工厂收到了 n个产品的订单,这 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i 在 A,B 两车间加工的时间分别为 A_i,B_i ...
 - Spring Cloud系列之Commons - 1. 背景与基础知识准备
			
本文基于 Spring Cloud 2020.0 发布版的依赖 本系列会深入分析 Spring Cloud 的每一个组件,从Spring Cloud Commons这个 Spring Cloud 所有 ...
 - K8s (常用命令)
			
查看集群信息: [root@kubernetes-master pods]# kubectl cluster-infoKubernetes master is running at http://lo ...
 - 02、scrapy安装
			
1.安装scrapy 采用pip的安装方式,从豆瓣源获取 pip install -i https://pypi.douban.com/simple/ scrapy 安装过程中会报出错误: build ...
 - LVS+Keepalived深度理解,阐述你不知道的坑点
			
1. LVS简介 1. 什么是LVS? LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内 ...
 - C# LINQ (2)
			
Limiting Data -- Take() and Skip() 前面讲了 筛选 和 排序,现在讲 选取皇帝选妃,层层选拔,最后留几个,让他过目,他选一个或者几个作为妃子,大概是这么个意思Take ...