【JS】公共鼠标滚动事件(从下进入,从上进入),可vue做指令使用

unilateralScroll 方法是动画主事件
enterFromBelow 方法是鼠标从上向下滚动事件
enterFromAbove 方法是鼠标从下向上滚动事件
Action[“事件名”] 是使用自定事件

// index.js 文件/** 从下进入事件 -- FromLeftToRight 默认动画 */
const enterFromBelow = (el, event) => Action[event && event.length ? event[0] : 'FromLeftToRight'](el);/** 从上进入事件 -- FromRightToLeft 默认动画 */
const enterFromAbove = (el, event) => Action[event && event.length ? event[1] : 'FromRightToLeft'](el);/** 鼠标滚动事件 */
export const unilateralScroll = (el, event) => {if (event.value && event.value.length != 0 && event.value.length != 2) throw new Error('Event value must be an array with two elements or without any value');if (event.value && event.value.length == 2) {if (Action[event.value[0]] == undefined) throw new Error(event.value[0] + ' Action must be a valid method action name');if (Action[event.value[1]] == undefined) throw new Error(event.value[1] + ' Action must be a valid method action name');}/** 进入方式 0:未进入 1:进入 2:离开 */let way = 0;/** 定义滚动条滚动方向 */let scrollType = true;/** 获取初始滚动位置 */let scrollPos = window.scrollY || document.documentElement.scrollTop;/** 监听滚动条事件 */window.addEventListener("scroll", function () {/** 确定新的滚动位置 */const newScrollPos = window.scrollY || document.documentElement.scrollTop;newScrollPos > scrollPos ? scrollType = true : scrollType = false;/** 更新滚动位置 */scrollPos = newScrollPos;/** 不同方向进入可视区域 */if (scrollType && way != 0) way == 1 ? enterFromBelow(el, event.value) : '离开事件';else if (!scrollType && way != 0) way == 1 ? enterFromAbove(el, event.value) : '离开事件';});/** 观察元素 */const callback = (entries) => entries.forEach((entry) => entry.isIntersecting ? way = 1 : way = 2);/** 创建一个观察者 */new IntersectionObserver(callback, { threshold: 0 }).observe(el);
}

这里是默认事件处理,可自定义内容事件

// action.js 文件export default class Action {/** 从下方进入可视窗口后,左边先滚动,右边固定,* 左边滚动结束,固定左边,右边开始滚动,* 到达盒子底边,左右固定在盒子底边 */static FromLeftToRight = (el) => {if (el.children.length < 2) throw new Error('Element must have at least two children');let dom1 = el.children[0];let dom2 = el.children[1];el.style.height = dom1.offsetHeight + dom2.offsetHeight - window.innerHeight + 20 + "px";/** 判断父元素距离顶部可视窗口的距离是否小于等于0 */if (el.getBoundingClientRect().top <= 0 && el.getBoundingClientRect().top >= -500) {dom1.style.top = 0;dom2.style.top = 0;dom2.style.position = "fixed";}let bottom = window.innerHeight - dom1.getBoundingClientRect().bottom;/** 判断左侧元素距离底部可视窗口的距离是否大于等于0 */if (bottom >= 0 && bottom < 500) {dom1.style.top = '';dom1.style.bottom = 0;dom1.style.position = "fixed";dom2.style.position = "absolute";dom2.style.top = dom1.offsetHeight - window.innerHeight + 20 + "px";}let pb = window.innerHeight - el.getBoundingClientRect().bottom;/** 判断父元素距离底部可视区域的距离 */if (pb >= 0 && pb < 500) {dom1.style.position = "absolute";}};/** 从上方进入可视窗口后,右边先滚动,左边固定,* 右边滚动结束,固定右边,、左边开始滚动,* 到达盒子顶边,左右固定在盒子顶边 */static FromRightToLeft = (el) => {if (el.children.length < 2) throw new Error('Element must have at least two children');let dom1 = el.children[0];let dom2 = el.children[1];/** 判断父元素距离顶部可视窗口的距离是否大于等于0 */if (el.getBoundingClientRect().bottom >= 0 && el.getBoundingClientRect().bottom < 500) {dom1.style.top = '';dom1.style.bottom = 0;dom1.style.position = "absolute";dom2.style.top = '';dom2.style.bottom = 0;dom2.style.position = "absolute";}let pb = window.innerHeight - el.getBoundingClientRect().bottom;/** 判断父元素距离底部可视区域的距离 */if (pb <= 0 && pb > -500) {dom1.style.top = "";dom1.style.bottom = 0;dom1.style.position = "fixed";}let top = dom2.getBoundingClientRect().top;/** 判断右侧元素距离顶部可视窗口的距离是否大于等于0 */if (top >= 0 && top < 500) {dom1.style.top = 0;dom1.style.bottom = '';dom1.style.position = "absolute";dom2.style.top = 0;dom2.style.position = "fixed";}/** 判断父元素距离顶部可视窗口的距离是否小于等于0 */let ct = el.getBoundingClientRect().top;if (ct >= 0 && ct < 500) {dom2.style.top = 0;dom2.style.position = "absolute";}};// 自定义事件static “事件名” = () => {};
}

这里通过 vue 指令,在 vue 中使用。

// main.js 文件import Vue from 'vue'
import App from './App.vue'
import router from './router'import { unilateralScroll } from "./utils/index";
Vue.config.productionTip = false;// 设置指令, binding, vnode
Vue.directive('unilateralScroll', { inserted(el, binding) { unilateralScroll(el, binding) }});new Vue({router,store,render: h => h(App)
}).$mount('#app');
// app.vue 文件<template><div id="app"><div class="box"></div><!-- v-unilateralScroll="['从上向下滚动事件', '从下向上滚动事件']" --><div class="container" v-unilateralScroll><div class="c1"><div>···内容1</div></div><div class="c2"><div>···内容2</div></div></div><div class="flooter"></div></div>
</template><style lang="scss">
* {margin: 0;padding: 0;
}html,
body {width: 100%;height: 100%;box-sizing: border-box;
}
body {overflow-y: auto;
}
.box {width: 100%;height: 120vh;background-color: #b1ffb1;
}
.container {width: 100%;overflow: hidden;position: relative;background-color: #4787e7b9;
}.c1 {left: 0;width: 50%;position: absolute;background-color: #cf7bcf;
}
.c2 {right: 0;width: 50%;position: absolute;background-color: #cfad7b;
}.flooter {width: 100%;height: 130vh;overflow: hidden;background-color: black;
}
</style>

这里展示vue实现视频

左右分屏滚动

> html 版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISP——3A算法

目录 前沿一. 自动曝光AE1.1. 自动曝光1.2. 18%灰1.3. 测光区域1.4. 摄影曝光加法系统1.5. AE算法1.5.1. 考虑事项1.5.2. AE实现过程 1.6. AE算法 二. 自动对焦AF2.1. 什么是自动对焦2.2. 图像清晰度评价方法2.2.1. Brenner 梯度函数2.2.2. Tenengrad 梯度函数2.2.3. Laplacian…

1.12 进程注入ShellCode套接字

在笔者前几篇文章中我们一直在探讨如何利用Metasploit这个渗透工具生成ShellCode以及如何将ShellCode注入到特定进程内&#xff0c;本章我们将自己实现一个正向ShellCodeShell&#xff0c;当进程被注入后&#xff0c;则我们可以通过利用NC等工具连接到被注入进程内&#xff0c;…

【go】异步任务解决方案Asynq实战

文章目录 一.Asynq介绍二.所需工具三.代码示例四.Reference 一.Asynq介绍 Asynq 是一个 Go 库&#xff0c;一个高效的分布式任务队列。 Asynq 工作原理&#xff1a; 客户端&#xff08;生产者&#xff09;将任务放入队列服务器&#xff08;消费者&#xff09;从队列中拉出任…

【vue】this.$nextTick解决this.$refs undefined的问题

说明 1、发邮件页面分成两个部分&#xff1a;模态框页面&#xff08;头部和底部&#xff09;和form页面&#xff08;操作按钮&#xff09; 2、点击回复按钮&#xff0c;要将发件人信息带到模态框页面&#xff0c;给定默认值且禁止收件人下拉选择&#xff08;多个邮箱&#xff…

Go用两个协程交替打印100以内的奇偶数

方式1&#xff08;使用无缓冲的channel&#xff09; package mainimport ( "fmt" "time")var flagChan make(chan int)func wokr1() { for i : 1; i < 100; i { flagChan <- 666 // 塞入 if i%2 1 { fmt.Println("协程1打印:", i) …

Windows Update Blocker,windows系统关闭自动更新工具

今天打开电脑发现系统又自动更新了 这一天天更新真的太烦了 然后我从网上找到一个工具 可以自由开启和关闭系统自动更新 这里分享一下网址&#xff1a;https://www.filehorse.com/download-windows-update-blocker/ 若网址失效&#xff0c;蓝奏云盘链接 https://wwgw.lanzouc.c…

leecode 数据库:1164. 指定日期的产品价格

导入数据&#xff1a; Create table If Not Exists Products (product_id int, new_price int, change_date date); Truncate table Products; insert into Products (product_id, new_price, change_date) values (1, 20, 2019-08-14); insert into Products (product_id, new…

安全计算环境技术测评要求项

1.身份鉴别-在应用系统及各类型设备中确认操作者身份的过程&#xff08;身份鉴别和数据保密&#xff09; 1-2/2-3/3-4/4-4 a&#xff09;应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换 b&#xff09;应具有…

归并排序的详解!

本文旨在讲解归并排序的实现&#xff08;递归及非递归&#xff09;搬好小板凳&#xff0c;干货来了&#xff01; 前序&#xff1a; 在介绍归并排序之前&#xff0c;需要给大家介绍的是什么是归并&#xff0c;归并操作&#xff0c;也叫归并算法&#xff0c;指的是将两个顺序序列…

lv3 嵌入式开发-3 linux shell命令(文件搜索、文件处理、压缩)

目录 1 查看文件相关命令 1.1 常用命令 1.2 硬链接和软链接 2 文件搜索相关命令 2.1 查找文件命令 2.2 查找文件内容命令 2.3 其他相关命令 3 文件处理相关命令 3.1 cut 3.2 sed 过滤 3.3 awk 匹配 4 解压缩相关命令 4.1 解压缩文件的意义 4.2 解压缩相关命令 1 …

【个人笔记js的原型理解】

在 JavaScript 中&#xff0c;最常见的新建一个对象的方式就是使用花括号的方式。然后使用’ . 的方式往里面添加属性和方法。可见以下代码&#xff1a; let animal {}; animal.name Leo; animal.energe 10;animal.eat function (amount) {console.log(${this.name} is ea…

大学物理 之 安培环路定理

文章目录 前言什么是安培环路定理安培环路定理有什么作用 深入了解深入学习 前言 什么是安培环路定理 安培环路定理的物理意义在于描述了电流和磁场之间的相互作用&#xff0c;以及如何在一个封闭的回路中分析这种相互作用。 简单的来说 , 用环路定理来解决在磁场中B对任意封…

[管理与领导-65]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 乌卡时代(VUCA )

前言&#xff1a; 大多数IT人&#xff0c;很勤奋&#xff0c;但都没有职业规划&#xff0c;被工作驱动着前行&#xff0c;然而&#xff0c;作为管理者&#xff0c;你就不能没有职业规划思维&#xff0c;因为你代表一个团队&#xff0c;你的思维决定了一个团队的思维。本文探讨…

redis实战-实现优惠券秒杀解决超卖问题

全局唯一ID 唯一ID的必要性 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显&#xff0c;容易被用户根据id的间隔来猜测…

c++ 学习之 构造函数的使用

上代码 class person { public:person(){cout << " person 的无参默认构造函数 " << endl;}person(int age){cout << " person 的有参默认构造函数 " << endl;m_age age;}person(const person& other){cout << "…

如何实现的手机实景自动直播,都有哪些功能呢?

手机实景自动直播最近真的太火了&#xff0c;全程只需要一部手机&#xff0c;就能完成24小时直播带货&#xff0c;不需要真人出镜&#xff0c;不需要场地&#xff0c;不需要搭建直播间&#xff0c;只需要一部手机就可以了。真人语音讲解&#xff0c;真人智能回复&#xff0c;实…

MySQL用户管理及用户权限

目录 数据库用户管理 新建用户 查看用户 重命名用户rename 删除用户drop 修改用户密码 找回root密码 数据库用户授权 授予权限 查看用户权限 撤销用户权限 数据库用户管理 新建用户 CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码];用户名&#xff1a…

C#-单例模式

文章目录 单例模式的概述为什么会有单例模式如何创建单例模式1、首先要保证&#xff0c;该对象 有且仅有一个2、其次&#xff0c;需要让外部能够获取到这个对象 示例通过 属性 获取单例 单例模式的概述 总结来说&#xff1a; 单例 就是只有 一个实例对象。 模式 说的是设计模式…

《Go 语言第一课》课程学习笔记(十二)

函数 Go 函数与函数声明 在 Go 语言中&#xff0c;函数是唯一一种基于特定输入&#xff0c;实现特定任务并可返回任务执行结果的代码块&#xff08;Go 语言中的方法本质上也是函数&#xff09;。在 Go 中&#xff0c;我们定义一个函数的最常用方式就是使用函数声明。 第一部…

Mybatis学习|注解开发、lombok

1.使用注解开发 无需再编写相应的Mapper.xml文件&#xff0c;直接将sql用注解的形式写在Mapper接口的对应方法上即可。 然后因为没有xml文件,所以要在mybatis-config.xml核心配置文件中注册这个Mapper接口&#xff0c;而不用去注册之前的Mapper.xml&#xff0c;这里其实如果用…