网页中的滚动穿透

news2024/10/26 0:22:17

滚动穿透的现象

在开发中我们可以观察到这么一种现象,当用户在屏幕上某个可滚动区域滚动时,如果滚动到当前区域滚动边界时会带动其他区域进行滚动,直观表现是在进行博客评论时,滑动textarea会带动博客一起滑动,另一种是屏幕有一个浮窗,滑动浮窗会导致浮窗之下的元素进行滚动

场景1
其中一种情况,为浮窗时
场景2
第二种情况,滚动区域本身未脱离文档流

scroll chain

这种子元素会带动其包含块元素进行滚动的形象被称为滚动链,W3C中明确:滚动容器的滚动位置达到滚动边界即可滚动区域的末端时会导致其他内容或整个页面滚动,这种持续滚动的体验被称为滚动链

When commenting on a blog, you might notice that if your comment exceeds the length of the provided textarea, scrolling beyond the end of the text area causes the entire blog to scroll.This is because reaching the end of a scrollable area, known as the scroll boundary, can lead to scrolling other content or the entire page.This continuous scrolling experience is called scroll chaining.

在博客上评论时,你可能会注意到,如果你的评论超出了提供的textarea的长度,向文本区域末尾滚动会导致整个博客滚动。这是因为达到可滚动区域的末端(称为滚动边界)会导致其他内容或整个页面滚动。这种持续滚动的体验被称为滚动链

解决方法

知道了为什么会触发包含块元素的滚动之后我们就可以通过中断滚动链的形式来解决这个问题,
我们以场景1为例,以下是初始代码:

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>内滚动触发外滚动示例</title>
    <style>
      * {
        padding: 0;
        margin: 0;
        box-sizing: border-box;
      }
      .modal {
        width: 100%;
        background: rgba(0, 0, 0, 0.1);
        overflow: hidden;
        overflow-y: scroll;
      }
      .content {
        position: absolute;
        top: 0;
        left: 0;
        background: white;
        width: 80%;
        height: 50vh;
        overflow: hidden;
        overflow-y: scroll;
      }
      .show {
        display: block;
      }
    </style>
  </head>
  <body>
    <div class="modal">
      <p>这里是外部内容...1</p>
      <p>这里是外部内容...2</p>
      <p>这里是外部内容...3</p>
      <p>这里是外部内容...4</p>
      <p>这里是外部内容...5</p>
      <p>这里是外部内容...6</p>
      <p>这里是外部内容...7</p>
      <p>这里是外部内容...8</p>
      <p>这里是外部内容...9</p>
      <p>这里是外部内容...10</p>
      <p>这里是外部内容...11</p>
      <p>这里是外部内容...12</p>
      <p>这里是外部内容...13</p>
      <p>这里是外部内容...14</p>
      <p>这里是外部内容...15</p>
      <p>这里是外部内容...1</p>
      <p>这里是外部内容...2</p>
      <p>这里是外部内容...3</p>
      <p>这里是外部内容...4</p>
      <p>这里是外部内容...5</p>
      <p>这里是外部内容...6</p>
      <p>这里是外部内容...7</p>
      <p>这里是外部内容...8</p>
      <p>这里是外部内容...9</p>
      <p>这里是外部内容...10</p>
      <p>这里是外部内容...11</p>
      <p>这里是外部内容...12</p>
      <p>这里是外部内容...13</p>
      <p>这里是外部内容...14</p>
      <p>这里是外部内容...15</p>
      <p>这里是外部内容...1</p>
      <p>这里是外部内容...2</p>
      <p>这里是外部内容...3</p>
      <p>这里是外部内容...4</p>
      <p>这里是外部内容...5</p>
      <p>这里是外部内容...6</p>
      <p>这里是外部内容...7</p>
      <p>这里是外部内容...8</p>
      <p>这里是外部内容...9</p>
      <p>这里是外部内容...10</p>
      <p>这里是外部内容...11</p>
      <p>这里是外部内容...12</p>
      <p>这里是外部内容...13</p>
      <p>这里是外部内容...14</p>
      <p>这里是外部内容...15</p>
    </div>
    <div class="content">
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
      <p>这里是弹层内容...</p>
    </div>
  </body>
</html>

使包含块本身不可滚动

我们可以尝试使包含块本身变得不可被滚动,使滚动链失效,通过overflow:hidden实现
当前浮窗的包含块元素为body,所以我们给body添加css

body {
	overflow: hidden;
}

不可滚动
可以看到此时滚动浮窗时其下方的元素没有跟随浮窗一起滚动
之后我们可以通过控制浮窗是否出现来动态的实现给包含块元素添加css样式
1

关于滚动链的传播范围

我们可能会有一个疑问,如果在多个滚动区域进行嵌套,只对当前需要进行限制的滚动区域的包含块元素进行限制能否阻断其更上层的滚动链
三层滚动链传递
这是一个简单的三层滚动区域,我们现在对中间部分尝试阻断滚动链
阻止中间部分滚动链
可以发现滚动链越过了中间的滚动区域,直接达到了最外层
那我们就可以合理认为滚动链会从目标元素一直链接到根元素,如果我们仅仅只在当前滚动区域的包含块中阻止滚动链的话是远远不够,而且这也并不是真正意义上的阻止滚动链,那我们该如何真正阻止滚动链呢

overscroll-behavior

overscroll-behavior是一个新的css属性,它专门用来规定当前元素在滚动到滚动边界时的表现状态,具体有三个属性值

  1. auto
    默认值
  2. contain
    设置了这个值之后默认的下拉,上拉的浏览器效果并不会消失,但其包含块以及更上级的滚动链将会被阻止
  3. none
    即阻止滚动链也阻止下拉上拉的浏览器效果

兼容性

兼容性如下:

兼容性

最终效果

最终效果如下:
效果

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

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

相关文章

智能汽车制造:海康NVR管理平台/工具EasyNVR多品牌NVR管理工具/设备实现无插件视频监控直播方案

一、背景介绍 近年来&#xff0c;随着网络在我国的普及和深化发展&#xff0c;企业的信息化建设不断深入&#xff0c;各行各业都加快了信息网络平台的建设&#xff0c;大多数单位已经或者正在铺设企业内部的计算机局域网。与此同时&#xff0c;网络也成为先进的新兴应用提供了…

【C++】一文带你深入理解C++异常机制

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、C语言处理错误的方式二、C异常三、异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 四、自定义异…

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备的多维拓展与灵活应用

在数字化安防时代&#xff0c;NVR批量管理软件/平台EasyNVR作为一种先进的视频监控系统设备&#xff0c;正逐步成为各个领域监控解决方案的首选。NVR批量管理软件/平台EasyNVR作为一款基于端-边-云一体化架构的国标视频融合云平台&#xff0c;凭借其部署简单轻量、功能多样、兼…

使用 pydub 的 AudioSegment 获取音频时长 - python 实现

通过使用 pydub 的 AudioSegment 获取音频时长&#xff0c;音频常用格式如 m4a,wav等。 安装 python 库&#xff1a; pip install pydub 获取 m4a 格式的音频时长代码如下&#xff0c;代码如下&#xff1a; #-*-coding:utf-8-*- # date:2024-10 # Author: DataBall - XIAN #…

sqli-labs靶场安装以及刷题记录-docker

sqli-labs靶场安装以及刷题记录-docker sqli-labs靶场安装-dockersqli-labs靶场刷题less-1 单引号less-2 数字型less-3 单引号括号less-4 双引号括号less-5 单引号布尔盲注less-6 双引号布尔盲注less-7 单引号加括号、输出到文件less-8 单引号布尔盲注less-9 单引号时间盲注les…

【移动应用开发】界面设计(二)实现水果列表页面

续上一篇博客 【移动应用开发】界面设计&#xff08;一&#xff09;实现登录页面-CSDN博客 目录 一、采用ViewBinding实现一个RecyclerView 1.1 在app/build.gradle中添加recyclerview依赖&#xff0c;并打开viewBinding &#xff08;1&#xff09;在app/build.gradle中添加…

基于Python+SQL Server2008实现(GUI)快递管理系统

快递业务管理系统的设计与实现 摘要: 着网络新零售的到来&#xff0c;传统物流在网购的洗礼下迅速蜕变&#xff0c;在这场以互联网为基础的时代变革中&#xff0c;哪家企业能率先转变其工作模式就能最先分得一杯羹&#xff0c;物流管理也不例外。传统的物流管理模式效率低下&a…

Git_GitLab

Git_GitLab 安装 服务器准备 安装包准备 编写安装脚本 初始化 GitLab 服务 启动 GitLab 服务 浏览器访问 GitLab GitLab 创建远程库 IDEA 集成 GitLab 安装 GitLab 插件 设置 GitLab 插件 安装 服务器准备 准备一个系统为 CentOS7 以上版本的服务器&#xff0c;使…

日常记录,使用springboot,vue2,easyexcel使实现字段的匹配导入

目前的需求是数据库字段固定&#xff0c;而excel的字段不固定&#xff0c;需要实现excel导入到一个数据库内。 首先是前端的字段匹配&#xff0c;显示数据库字段和表头字段 读取表头字段&#xff1a; 我这里实现的是监听器导入&#xff0c;需要新建一个listen类。 读Excel …

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

大数据治理平台建设规划方案(71页WORD)

随着信息化时代的到来&#xff0c;大数据已成为企业管理和决策的重要基础。然而&#xff0c;大数据的快速增长和复杂性给数据的管理和治理带来了巨大挑战。为了有效应对这些挑战&#xff0c;构建一个高效、稳定的大数据治理平台显得尤为重要。 文档介绍&#xff1a; 该平台旨在…

JS无限执行隔行变色

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

【算法优化】混合策略改进的蝴蝶优化算法

摘要 蝴蝶优化算法 (Butterfly Optimization Algorithm, BOA) 是一种新兴的智能优化算法&#xff0c;其灵感来自蝴蝶的觅食行为。本文基于经典BOA&#xff0c;通过引入混合策略进行改进&#xff0c;从而提高其在全局寻优和局部搜索中的性能。实验结果表明&#xff0c;改进的蝴…

混个1024勋章

一眨眼毕业工作已经一年了&#xff0c;偶然进了游戏公司成了一名初级游戏服务器开发。前两天总结的时候&#xff0c;本来以为自己这一年没学到多少东西&#xff0c;但是看看自己的博客其实也有在进步&#xff0c;虽然比不上博客里的众多大佬&#xff0c;但是回头看也算是自己的…

鸿蒙到底是不是纯血?到底能不能走向世界?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 2016年5月鸿蒙系统开始立项。 2018年美国开始经济战争&#xff0c;其中一项就是制裁华为&#xff0c;不让华为用安卓。 2019年8月9日华为正式发布鸿蒙系统。问题就出在这里&#xff0c;大家可以仔细看。 安卓一…

Python | Leetcode Python题解之第500题键盘行

题目&#xff1a; 题解&#xff1a; class Solution:def findWords(self, words: List[str]) -> List[str]:ans []rowIdx "12210111011122000010020202"for word in words:idx rowIdx[ord(word[0].lower()) - ord(a)]if all(rowIdx[ord(ch.lower()) - ord(a)]…

运维变更管理流程

概述 变更管理的原则和目的 在最短的中断时间内完成基础架构或服务的任一方面的变更而对其进行控制的服务管理流程。变更管理的目标是确保在变更实施过程中使用标准的方法和步骤&#xff0c;尽快地实施变更&#xff0c;以将由变更所导致的对业务的影响和风险减小到最低。 适用…

使用Python来下一场深夜雪

效果图&#xff1a;&#xff08;真实情况是动态的&#xff09; 完整代码&#xff1a; import turtle import random# 初始化画布 turtle.bgcolor("#001f3f") # 偏深蓝色的背景 turtle.title("下雪的画面") turtle.speed(0) turtle.hideturtle() turtle.t…

深入拆解TomcatJetty——Tomcat生命周期与多层容器

深入拆解Tomcat&Jetty&#xff08;三&#xff09; 专栏地址&#xff1a;https://time.geekbang.org/column/intro/100027701 1 Tomcat组件生命周期 Tomcat如何如何实现一键式启停 Tomcat 架构图和请求处理流程如图所示&#xff1a; 对组件之间的关系进行分析&#xff0c;…

微信小程序canvas 生成二维码图片,画图片,生成图片,将两个canvas结合并保存图片

**需求实现步骤如下 先定义两个canvas一个canvas myQrcode画二维码的图片另一个canvas mycanvas画一个背景图&#xff0c;并把二维码画到这个canvas上&#xff0c;mycanvas这个canvas生成一张图片&#xff0c;返回图片的临时路径最后保存图片到手机** 首先wxml,新版微信小程序…