问题描述

不同浏览器的滚动条宽度不相同,需要动态获取浏览器滚动条宽度。

问题分析

screen.width屏幕分辨率宽度

document.body.scrollWidth 页面完整宽度

document.body.scrollHeight 页面完整宽度

document.body.clientWidth width+左右padding

document.body.clientHeight height + 上下padding

document.body.offsetWidth 网页可见区域宽度

document.body.offsetHeight 网页可见区域高度

body中插入一个div,div中再嵌套一个div,设置外部的div的overflower为scroll,

可以出现滚动条轨道,然后使用外部div宽度值减去内部div的宽度值即可 。

得到滚动条宽度之后,把添加的元素删掉。

解决方案

方法一:简单方法

var cWidth = document.body.clientWidth || document.documentElement.clientWidth;//页面可视区域宽度
var iWidth = window.innerWidth;//浏览器窗口大小
console.log(iWidth - cWidth);//打印滚动条宽度

方法二:iView的解决方案

https://github.com/iview/iview/blob/2.0/src/utils/assist.js

// For Modal scrollBar hidden
let cached;
export function getScrollBarSize (fresh) {if (isServer) return 0;if (fresh || cached === undefined) {const inner = document.createElement('div');inner.style.width = '100%';inner.style.height = '200px';const outer = document.createElement('div');const outerStyle = outer.style;outerStyle.position = 'absolute';outerStyle.top = 0;outerStyle.left = 0;outerStyle.pointerEvents = 'none';outerStyle.visibility = 'hidden';outerStyle.width = '200px';outerStyle.height = '150px';outerStyle.overflow = 'hidden';outer.appendChild(inner);document.body.appendChild(outer);const widthContained = inner.offsetWidth;outer.style.overflow = 'scroll';let widthScroll = inner.offsetWidth;if (widthContained === widthScroll) {widthScroll = outer.clientWidth;}document.body.removeChild(outer);cached = widthContained - widthScroll;}return cached;
}

方法三:Element UI的解决方案

https://github.com/ElemeFE/element/blob/dev/src/utils/scrollbar-width.js

import Vue from 'vue';let scrollBarWidth;export default function() {if (Vue.prototype.$isServer) return 0;if (scrollBarWidth !== undefined) return scrollBarWidth;const outer = document.createElement('div');outer.className = 'el-scrollbar__wrap';outer.style.visibility = 'hidden';outer.style.width = '100px';outer.style.position = 'absolute';outer.style.top = '-9999px';document.body.appendChild(outer);const widthNoScroll = outer.offsetWidth;outer.style.overflow = 'scroll';const inner = document.createElement('div');inner.style.width = '100%';outer.appendChild(inner);const widthWithScroll = inner.offsetWidth;outer.parentNode.removeChild(outer);scrollBarWidth = widthNoScroll - widthWithScroll;return scrollBarWidth;
};

参考文章

http://www.caotama.com/53793.html

https://segmentfault.com/q/1010000004817695

https://my.oschina.net/wangch5453/blog/2967396

https://blog.csdn.net/qq_42089654/article/details/80515916

https://www.cnblogs.com/MakethingsEasy/archive/2011/12/08/2280661.html

JavaScript——获取浏览器滚动条(ScrollBar)宽度相关推荐

  1. html中获取浏览器窗口宽度,JavaScript 获取浏览器窗口的大小

    简明现代魔法 -> JavaScript -> JavaScript 获取浏览器窗口的大小 JavaScript 获取浏览器窗口的大小 2010-04-16 程序演示: 获取浏览器当前窗口 ...

  2. Javascript 获取浏览器窗口中文档(视口)可用尺寸的方法

    摘要: 由于浏览器的差异,许多信息的获取都要考虑兼容性,窗口中文档可用尺寸是一个经常需要用到的信息,由于浏览器不同甚至版本不同,获取的方法也不一样,本文介绍的函数能够兼容各种浏览器,获取这一信息.同时 ...

  3. js获取浏览器滚动条距离顶端的距离

    js获取浏览器滚动条距离顶端的距离 一.jQuery获取的相关方法   jquery 获取滚动条高度 获取浏览器显示区域的高度 : $(window).height(); 获取浏览器显示区域的宽度 : ...

  4. JavaScript获取浏览器可视区域的宽高

    JavaScript获取浏览器可视区域的宽高 在做项目的时候,我们常常需要对项目做一些优化,来提升页面响应的速度,比如进入可视区域后再发送请求获取数据或者是填充模板,这个时候就需要能够获取到浏览器的可 ...

  5. js获取浏览器窗口页面宽度、高度的方法 kaki 的博客

    js获取浏览器窗口页面宽度.高度的方法 不多说,直接上代码 alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()) ...

  6. 编辑器js获取浏览器高度和宽度值(转)

    js获取浏览器高度和宽度值 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: docume ...

  7. java中如何设置浏览器宽度_[Java教程]关于JS中获取浏览器高度和宽度值的多种方法(多浏览器)_星空网...

    关于JS中获取浏览器高度和宽度值的多种方法(多浏览器) 2017-08-07 0 三种浏览器获取值方法 IE中: document.body.clientWidth ==> BODY对象宽度 d ...

  8. html浏览器宽度,JavaScript获取浏览器、元素、屏幕的宽高尺寸

    版权声明 转载请告知并注明来源作者 作者:唐金健 网络昵称:御焱 掘金知乎思否专栏:优雅的前端 前言 有时候在获取浏览器.元素.屏幕的尺寸,傻傻分不清.为了让自己清晰认识,能够快速确定自己需要哪个属性 ...

  9. JavaScript获取浏览器、元素、屏幕的宽高尺寸

    版权声明 转载请告知并注明来源作者 作者:唐金健 网络昵称:御焱 掘金知乎思否专栏:优雅的前端 前言 有时候在获取浏览器.元素.屏幕的尺寸,傻傻分不清.为了让自己清晰认识,能够快速确定自己需要哪个属性 ...

最新文章

  1. asp.net弹出div层,并把弹出层上的值赋值给界面
  2. 对应chd5.14的spark_GitHub - shixiaopengql/BigData-News: 基于Spark2.2新闻网大数据实时系统项目...
  3. python抓取中文网页乱码
  4. linux远程传文件太慢,解决linux scp、ssh 登陆远程服务器连接速度慢
  5. 癌中之王:基质微环境塑造胰腺癌瘤内结构|Cell
  6. 关于JavaScript中cookie的用法例子
  7. 内心的秘密写在脸上,科学家用面部识别预测性取向和犯罪倾向
  8. 你是你产品的头号用户
  9. [转] 先验概率与后验概率贝叶斯与似然函数
  10. rust如何加好友steam_《Rust》加入女性建模 角色性别将由STEAM账号决定
  11. 【文本分类】几个可作为Baseline的模型
  12. 关于 单窗口服务模型模拟 进行的小测试
  13. 【ML小结9】聚类分析--k均值聚类
  14. smartprinter 这个绝对程序猿的福音啊
  15. 用C语言写羊了个羊(一)
  16. 物料分拣系统matlab仿真,自动物料分拣机器人控制系统设计+Matlab源程序+图纸
  17. C#学习(10)-----事件
  18. java制作玩游戏并支付游戏币_Java7循环结构综合练习
  19. 怎样才能掘金知识付费项目?
  20. CSS3综合练习,导航菜单的制作

热门文章

  1. 北京师范大学网络教育期末考试计算机,北京师范大学网络教育———《计算机应用基础》第二章同步练习题(4)...
  2. amaze 绝对位置 html,Amaze UI 兼容性列表
  3. http请求过程 Android,android HTTP网络请求回顾
  4. 翻转棋游戏c语言讲解,有没有人懂黑白棋(翻转棋)的核心算法
  5. linux性能测试命令h,Linux性能测试 pmap命令详解
  6. git 撤销全部的commit_Git 撤销 Commit
  7. 学计算机对显卡要求大吗,【5人回答】学AE的电脑配置要求高吗?需要什么样的电脑配置-3D溜溜网...
  8. python模块批量安装方法_python离线批量安装依赖包
  9. QM法化简C语言程序,QM基础教程
  10. 三十、开始前端Vue.js的学习之路