如何检测滚动条在浏览器的哪一侧 - 向右还是向左(在 RTL 的情况下)?

2024-01-11

For <html dir="rtl">某些浏览器(Safari、Edge、IE)会自动将滚动条移动到左侧,这是正确的行为:

不幸的是,主要浏览器(Chrome 和 Firefox)的行为方式有所不同,滚动条仍然位于浏览器的右侧。

是否可以以编程方式(最好使用 vanilla JS)检测滚动条在哪一侧?


UPD(2018年9月28日):到目前为止,答案中没有有效的解决方案,人们试图通过使用来检测滚动条位置getBoundingClientRect().left or .offsetLeft然后will not工作,因为它永远是0至少在 Edge 中独立于滚动条位置。


UPD (15.10.2018): TLDR: 没办法。

浏览器似乎没有提供用于检测滚动条侧的API。在下面的答案中,有一些插入虚拟的技巧div并计算该 div 中滚动条的位置。我不能将这些技巧视为答案,因为文档滚动条可以通过多种方式定位(<html dir="rtl">、操作系统的 RTL 版本、浏览器设置等)


如图所示here https://w3c.github.io/i18n-tests/results/native-user-interfaces, 滚动条不会改变方向 with dir="rtl" on html or bodyFirefox、Chrome、Opera 和 Safari 中的 HTML 标签。它适用于 IE 和 Edge。我尝试过(在 Edge 17、IE 11、Firefox 62、Chrome 69、Opera 56、Safari 5.1 上),它在 2018 年 10 月仍然相关(Safari > 9.1 在左侧显示滚动条,如果dir="rtl").

我没有找到跨浏览器本机解决方案到现在为止找到滚动条的位置正如你所问的。我认为你没有。我们只能尝试寻找“hack”来修复它......

根据您的问题/评论以及您的实际问题here https://github.com/sweetalert2/sweetalert2/issues/1221,我认为最好关注的是兼容性dir="rtl"。您试图找出滚动条的位置,因为它一开始就没有按预期工作。为了使其按预期工作,一个快速解决方法是将滚动条放在body元素 :

<!DOCTYPE html>
<html dir="rtl">
  <head>
    <meta charset="utf-8">
    <title></title>
    <style>
      html, body {
        height: 100%;
        overflow: hidden;
      }

      body {
        padding: 0;
        margin: 0;
        overflow-y: auto; /* or overflow: auto; */
      }

      p {
        margin: 0;
        font-size: 8em;
      }
    </style>
  </head>

  <body>

    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
      dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

  </body>
</html>

这段CSS代码将使body要滚动的元素而不是html元素。奇怪的是,把卷轴放上body将在正确的位置显示滚动条。它适用于最新版本的浏览器。

确切的兼容性是(测试的最旧的工作版本):

  • IE => v6 - 2001
  • 边缘 => 全部
  • 火狐 => v4 - 2011
  • Opera => v10 - 2009
  • Chrome => v19 - 2012
  • Safari => v10.1 - 2016

使用兼容的浏览器,您可以根据以下内容“信任”滚动条位置dir属性。这意味着对于上面列出的浏览器,滚动条将位于左侧dir="rtl"并在右侧dir="ltr"。我测试过并且有效。

对于较旧的浏览器版本,我暂时没有修复。这意味着你不会完全兼容,但正如你所见,这主要是 sa​​fari 的问题。

EDIT : 研究找到滚动条的位置

正如我上面提到的,我认为我们可以尝试找到一个“黑客”来找到滚动条的位置。我不是 CSS 专家,所以我的解决方案不是很漂亮。具有 CSS 技能的人可能会找到一个很好的解决方案。

如果滚动条位于主体上(上面的解决方案),我们可以使用 css 定位元素检测滚动条位置。例如这段代码:

<!DOCTYPE html>
<html dir="rtl">
<head>
  <meta charset="utf-8">
  <title></title>
  <style>
    html, body {
      height: 100%;
      overflow: hidden;
    }

    body {
      padding: 0;
      margin: 0;
      overflow-y: auto;
    }

    p {
      margin: 0;
      font-size: 8em;
    }

    #sc { position: relative; float: left; }
    #sc_2 { position: relative; float: right; }
    #sc_3 { position: absolute; width: 100%; }
  </style>
</head>
<body>
  <div id="sc"></div>
  <div id="sc_2"></div>
  <div id="sc_3"></div>
  
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
  consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
  cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
  proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

  <script>
    var html = document.getElementsByTagName('html')[0];
    var sc = document.getElementById('sc');
    var sc_2 = document.getElementById('sc_2');
    var sc_3 = document.getElementById('sc_3');

    if (sc_2.offsetLeft < html.clientWidth && !(sc_3.offsetLeft < 0)) {
      console.log('bar on the right');
    } else if (sc.offsetLeft > 0 || sc_3.offsetLeft < 0) {
      console.log('bar on the left');
    } else {
      console.log('no bar');
    }
  </script>
</body>
</html>

兼容性是(测试过的最旧的工作版本):

  • IE => v6 - 2001
  • 边缘 => 全部
  • 火狐 => v4 - 2011
  • Opera => v10 - 2009
  • Chrome => v15 - 2011
  • 野生动物园 =>不工作

如果滚动条位于body标签,因为如上所述,在这种情况下我们可以“信任”dir属性。我把它放在这里是因为它可以probably适应滚动html tag.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测滚动条在浏览器的哪一侧 - 向右还是向左(在 RTL 的情况下)? 的相关文章

  • Chrome 扩展:browserAction.onClicked.addListener() 未被调用

    我正在尝试编写一个非常简单的 Chrome 扩展 此时 它只是一个弹出 html 文件 当单击浏览器操作图标时 该文件会尝试显示警报 我显然做错了什么 因为警报没有触发 清单 json name Simple description Sim
  • 为什么“true && () => {}”会产生“Uncaught SyntaxError:格式错误的箭头函数参数列表”? [复制]

    这个问题在这里已经有答案了 下面的代码 执行时 true gt yields Uncaught SyntaxError Malformed arrow function parameter list Why 编辑 我知道将函数包装在括号中是
  • PHP 中的 JS charCodeAt 等效项(具有完整的 unicode 和 emoji 兼容性)

    我在 JS 中有一个简单的代码 如果涉及特殊字符 我无法在 PHP 中复制它 这是 JS 代码 参见JSFiddle https jsfiddle net h8oca3qg 5 用于输出 var str t char t and speci
  • 链接 getElementById

    我一直在寻找这个问题的答案 但找不到答案 所以我想尝试一下 StackOverflow 在 javascript 中 这是否有效 x document getElementById myId y x getElementById mySec
  • d3 树 - 有相同孩子的父母

    我一直在将代码从 JIT 转换为 D3 并使用树布局 我已经复制了代码http mbostock github com d3 talk 20111018 tree html http mbostock github com d3 talk
  • 在 JavaScript 中解析日期时间字符串

    有谁知道如何解析所需格式的日期字符串dd mm yyyy See Mozilla Core JavaScript 参考 日期对象 https developer mozilla org en Core JavaScript 1 5 Refe
  • 在生产中使用 css / javascript 源映射对性能有何影响?

    生产环境中应该使用源映射吗 除了调试之外 它们还有什么好处吗 由于额外的服务器往返 它们是否会影响应用程序加载时间 浏览器是否足够智能来加载 map应用程序加载和渲染后的资产 如果浏览器找不到 map asset 404错误 会对性能产生影
  • 如何在D3节点中放置图像?

    到目前为止 我已经创建了这些 D3 节点 用于创建可折叠的层次树 到目前为止 这些节点的颜色为 AA1C1C 深红色 以表明如果您单击它们 它们将扩展到更多节点 我想要做的是在节点中使用图像中的位置 这对于所有用户来说都是一个加号 以知道它
  • javascript中.match和.test有什么区别[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在浏览 JavaScript 时 我刚刚遇到了 match test 和 exec有什么不同 这是最快的 首先 exec and test
  • 在 ASP.NET MVC 中使用 bootstrap 创建模式

    我在 ASP NET MVC 项目上使用 NET Framework 4 5 Bootstrap v3 3 6 我想做的是创建一个模态表单 我尝试了以下方法 在主布局中创建了一个模态容器 div class modal fade style
  • 在 Cytoscape.js 中为家谱设置边缘样式

    我有一个使用 Django 的家谱应用程序 我正在尝试使用http js cytoscape org http js cytoscape org对于用户界面 我想设置之间的边缘样式浪漫的伴侣像这样 http www eprintableca
  • YouTube - 右键单击​​时不显示上下文菜单

    想法 通过使用右键拖放到视频播放器上来查找 YouTube 视频 例如 每 2 屏幕宽度 1 秒 因此 在 1920x1080 的屏幕上 如果我按下鼠标右键 将其向左拖动 384 像素 20 然后松开 视频应该快退 10 秒 我有一个 Gr
  • 添加数组的总和。显示1个输出

    更新 这个问题的答案如下 感谢在不同线程上进行的 dougtesting 将数组相加 显示总和 https stackoverflow com questions 45724641 add array together display su
  • 如何在 jQgrid 中隐藏列但在添加/编辑面板中显示此列

    我想要一种我使用的控制形式 但字段数量太高了 如何显示网格 但只有表单添加 编辑弹出面板中的某些字段显示所有字段 以下是您可以执行此操作的方法 colModel name email label E mail editable true h
  • Antd datepicker (date.clone/date.load 不是函数)

    我有一个反应应用程序 有一个复选框可以禁用日期选择器 但当我使用复选框禁用它时 我无法选择任何日期 如果我删除复选框及其功能 则不会出现错误 目前 我得到 date clone 不是函数 error const dateFormat YYY
  • 如何查明在 Chrome 控制台中按下按钮时会调用哪些函数?

    我正在尝试自学 Google Closure javascript 库 我正在检查 TreeControl UI 小部件 如何使用Chrome控制台分析当我点击下面演示中的 剪切 按钮时运行了哪些功能 例如 我可以为此设置一个断点吗 我尝试
  • 将 JSON 字符串传递给 Django 模板

    我一直在用头撞墙 试图找出为什么我无法将从 Django 模型生成的 JSON 字符串传递到模板的 javascript 静态文件中 事实证明 问题不在模型级别 使用serializers serialize 在脚本本身中放入相同的字符串将
  • AngularJS 与(Angular JS + jQuery)

    我有一个关于仅使用 AngularJS 和纯 JavaScript 以及使用 AngularJS 和 jQuery 时的性能问题 ex app directive fitHeight function window return restr
  • ExtJS:简单表单忽略 formBind

    我有一个小问题让我发疯了好几天 我有一个表单面板 Ext define EC view PasswordPanel extend Ext form Panel alias widget pwdpanel bodyPadding 15 ini
  • 获取css规则、chrome扩展

    我正在开发 Chrome 扩展程序 它需要访问document styleSheets cssRules 它在某些网站上运行良好 例如w3school 但其他人则不然 比如堆栈溢出 我收到错误 Failed to read the cssR

随机推荐

  • 循环遍历多个列并在 R 中为每个列绘制一个图?

    我有一个数据集 其中第一列是 年份 接下来的五十列是美国每个州的数据 我想在一个 pdf 中生成多个图 将每个 州 列与 年 列相匹配 即 1 和 2 1 和 3 1 和 50 我认为循环第 2 50 列将是一个很好的解决方案 但我无法让它
  • RESTful API 错误的最佳实践

    在 RESTful API 中返回 HTTP 状态代码的最佳实践是什么 我的 PHP 框架使用 Laravel 4 如果出现错误 我应该使用 return Response json User Exists 401 or 包括标志succe
  • 通过 mc.cores 与 makePSOCKcluster 设置核心?

    我想知道通过设置 R 使用的核心数有什么区别makePSOCKcluster并明确地在 foreach 循环中 我应该在这两种情况下单独设置它 还是在制作时这样做makePSOCKcluster enough cl lt makePSOCK
  • 了解 _.js 中下划线的声明吗?

    这是从一开始带注释的 js 来源 http documentcloud github io underscore docs underscore html 尽管我可以尝试 但我的 JavaScript 能力还不够高 无法理解这里发生的事情
  • Google Pubsub:不可用:该服务无法满足您的请求

    我正在使用 java 库从我的代码中订阅订阅 使用sbt com google cloud google cloud pubsub 0 24 0 beta 我按照本指南编写订阅者 https cloud google com pubsub
  • 是否可以集成 django-taggit 和 django-mptt / django-treebeard?

    我正在开发一个需要标记不同类型内容的网站 这有利于使用 django taggit 但是 如果标签以其自然层次结构在数据库中表示 这将非常有益 有利于使用 django mptt 或 django treebeard 将 taggit 的通
  • 将 UIToolbar 添加到某些文本字段的输入附件视图

    在我寻找我的第一个 iPhone 应用程序时 我发布了有关处理 iOS 键盘上的返回键的正确方法 现在我需要找出键盘上方的工具栏 其中包含上一个 下一个和完成按钮 我一直在使用以下网站的示例 输入配件视图 http gabriel tips
  • Flutter 从 Firebase 存储加载图像

    我看到有很多关于如何使用 flutter 将图像上传到 firebase 存储的示例 但没有实际下载 读取 显示已上传的图像 在Android中 我只是使用Glide要显示图像 我该如何在 Flutter 中执行此操作 我是否使用Netwo
  • 使用 Pandas 将 csv 转换为 Json

    我想使用 pandas 将 CSV 转换为 JSON 格式 我是一名测试人员 想要将一些事件发送到事件中心 因为我想要维护 CSV 文件并使用 CSV 文件更新我的记录 数据 我通过使用 pandas 读取 JSON 创建了一个 CSV 文
  • 将 Dropzone 中的文件添加到表单

    我想使用 Dropzone js 以便用户可以选择他想要上传的图像 但我不希望它们即时上传 而只是添加到表单中 然后以表单数组中的正常方式提交 我怎样才能做到这一点 我见过这样的问题如何让 Dropzone js 仅在单击提交按钮时上传文件
  • 在 SQLite 数据库中保存 ArrayList

    所以我想保存一组有序的双精度值 并且我希望能够轻松地插入 检索或删除其中的任何值 因此 我使用 ArrayList 在其中定义一个名为 Doubles 的类来存储双精度值 如何将此数组列表存储在 SQLite 数据库的记录中 我的意思是 列
  • 如何确定 Windows Java 安装位置

    我正在尝试从 C 程序集动态运行 jar 使用Process Start info 现在 我可以从控制台应用程序运行 ProcessStartInfo info new ProcessStartInfo java jar somerando
  • Debian Jessie 中的 Apache - 仍然收到消息您没有权限访问此服务器上的 /

    相同的虚拟配置我 apache wheezy 工作正常 例如 服务器名称 lgbs 服务器别名 www lgbs DocumentRoot home vdomain app web SetEnv APPLICATION ENV develo
  • Requests.get 显示的 HTML 与 Chrome 开发者工具不同

    我正在使用Python 特别是jupyter笔记本 开发一个网络抓取工具 它可以抓取一些房地产页面并保存价格 地址等数据 它对于我挑选的其中一个页面工作得很好 但是当我尝试抓取此页面时 sreality cz https www sreal
  • 按数字和字母顺序对带有字母的数字进行排序

    我的网站上有一个数据库 其中有一长串 产品 全部包含字母 例如 TC 345 TC 234 或 HC 236W 123 234 PWD 我们可以按数字和字母顺序对网站上的 进行排序吗 目前我们按字母顺序存储 因此顺序为 10 PDW 100
  • 正则表达式删除句子中包含数字的所有单词

    我尽力删除了句子中所有带有数字的单词 但仍然不成功 我什至尝试了以下正则表达式 regex s w 1 2 W s a zA Z0 9 d x preg replace regex x 我正在努力完成以下任务 包含数字和任何特殊字符 例如
  • Android、Windows Phone 7 和 Blackberry 的等效配置文件 (iOS)

    在 iOS 中 可以使用配置文件通过无线方式推送电子邮件 wifi 和 VPN 等的配置 有适用于 Android Windows Phone 7 和 Blackberry 的同等产品吗 链接到 iOS 的配置文件http develope
  • PhoneGap 与 jQuery Mobile 性能问题的常见来源有哪些?

    我有一个使用 PhoneGap 1 0 和 jQuery Mobile 1 0b2 编写的应用程序 在 iPhone 和 iPad 上运行 自从我开始使用该框架以来 我一直受到应用程序中 页面 之间切换的性能问题的困扰 按下按钮后 在转换发
  • 如何处理一个类中的多个线程?

    线程通常以两种方式设计 请参阅java教程 http java sun com docs books tutorial essential concurrency runthread html 通过扩展 Thread 类或通过实现 Runn
  • 如何检测滚动条在浏览器的哪一侧 - 向右还是向左(在 RTL 的情况下)?

    For 某些浏览器 Safari Edge IE 会自动将滚动条移动到左侧 这是正确的行为 不幸的是 主要浏览器 Chrome 和 Firefox 的行为方式有所不同 滚动条仍然位于浏览器的右侧 是否可以以编程方式 最好使用 vanilla