可视区域兼容性问题的思考及方法封装

news2024/12/24 19:02:12

 今日在复习可视化尺寸获取时突发奇想,为什么要在怪异模式下使用document.body.clientWidth,在标准模式下使用document.documentElement.clientWidth?以及是否在IE8及以下的版本中其中一个获取方式将返回undefined0
 出于该问题的思考,有了以下代码的测试,在这里我尝试还原IE8以下的IE浏览器版本(通过Edge浏览器的仿真IE),结果是三个方法都有返回值,好似不存在兼容性的问题。 但当我给他们设置边界条件时发现不同模式下总会有一个方法返回值会出现问题。
 怪异模式下的document.documentElement.clientWidth、标准模式下的document.body.clientWidth无法获取到可视窗口的真实尺寸。

一、为什么怪异模式下使用body.clientWidth

 经过测试,在怪异模式下使用document.documentElement.clientWidth无法正确的获取到可视窗口的真实宽度,得到的结果为当前窗口中HTML元素的真实宽度,假设当前的可视窗口宽度为1350px,HTML元素的真实宽度为500px,那么在怪异模式(BackCompat)下使用document.documentElement.clientWidth方法所得到的值将为500px,而不是1350px。因此在怪异模式下使用的是document.body.clientWidth方法获取可视化区域宽度。
 至此问题解决,但在使用document.body.clientWidth的前提下我们需要注意一点:document.body.clientWidth方法获取的宽度不包含滚动条的宽度。

二、为什么标准模式下使用documentElement.clientWidth

 相同的道理,在标准模式下使用document.body.clientWidth无法正确获取到可视化窗口的真实宽度。值得提的一点是不管在标准模式、怪异模式下,使用window.innerWidth方法都能正确的获取到正确的且包含滚动条宽度的可视化区域宽度,因此当浏览器兼容该方法时应当优先使用。

三、测试代码

 前提条件:在CSS中将html、body两个元素的宽高设置为5000px、清除margin、padding

1. 标准模式测试

 默认的HTML就是处于标准渲染模式(CSS1Compat),根据下列的代码我们可以在页面上看到window.innerWidthdocument.documentElement.clientWidth方法可以正确的得到可视宽度,且可以看出document.documentElement.clientWidth方法并没有将滚动条宽度纳入计算。而document.body.clientWidth则是获取到了body元素的真实宽度。

/**
 * IE8/IE9以下无法直接使用window.innerWidth、window.innerHeight获取可视区域尺寸
 * 此时与滚动条滚动距离获取类似,我们将从body、html元素上获取页面的宽度、高度
 *  此时将出现一个渲染概念(标准模式、怪异模式)
 *  我们可以通过document.compatMode来获取到当前的渲染模式
 *    1. backCompat:怪异模式
 *    2. CSS1Compat:标准模式或准标准模式(如今的模式已经标准化,准标准模式失去意义)
 * 在怪异模式下
 */
document.writeln(
  `${
    document.compatMode === "CSS1Compat" ? "标准模式" : "怪异模式"
  }下通过body获取的可视窗口宽度为: ${document.body.clientWidth}<br/>`
);
document.writeln(
  `${
    document.compatMode === "CSS1Compat" ? "标准模式" : "怪异模式"
  }下通过body获取的可视窗口高度为: ${document.body.clientHeight}<br/>`
);

document.writeln(
  `${
    document.compatMode === "CSS1Compat" ? "标准模式" : "怪异模式"
  }下通过documentElement获取的可视窗口宽度为: ${
    document.documentElement.clientWidth
  }<br/>`
);
document.writeln(
  `${
    document.compatMode === "CSS1Compat" ? "标准模式" : "怪异模式"
  }下通过documentElement获取的可视窗口高度为: ${
    document.documentElement.clientHeight
  }<br/>`
);

效果如下:

2. 怪异模式测试

 想要将浏览器的渲染模式修改为怪异模式,我们可以修改HTML文件的文档类型,如下代码所示,将<!DOCTYPE html>修改为<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<!-- <!DOCTYPE html> -->

测试效果如下:

 从验证的结果中我们能够明确的发现两个方法在不同模式下可能遇到的问题,因此在封装可视化尺寸获取方法考虑兼容性问题时,应该注意到这一点。

四、可视尺寸兼容性方法封装

 我们可以对可视化尺寸进行简单的兼容性封装:

function getClientSize(){
  if (window.innerWidth) {
    return {
      width: window.innerWidth,
      height: window.innerHeight
    }
  } 
    /**
   * 具体见MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/compatMode
   * backCompat 怪异模式
   * CSS1Compat 标准模式
   *  */ 
  else if (document.compatMode === 'backCompat') {
    return {
      width: document.body.clientWidth,
      height: document.body.clientHeight
    }
  } else {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight
    }
  }
}

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

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

相关文章

C++的cin详解

2023年5月20日&#xff0c;周六早上&#xff1a; 我发现我找不到非常详细的cin类的成员函数&#xff0c;只好自己写了。 不定期更新。 cin的继承关系 cin类继承自istream类&#xff0c;ostream类继承自ios类&#xff0c;ios类继承自ios_base类 cin类拥有的所有成员函数 1. …

【算法题】2352. 相等行列对

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个下标从 0 开始、大小为 n …

ChatGPT 推出 iOS 应用,支持语音输入,使用体验如何?

最近&#xff0c;OpenAI 宣布推出官方 iOS 应用&#xff0c;允许用户随时随地访问其高人气 AI 聊天机器人&#xff0c;此举也打破了近几个月内苹果 App Store 上充斥似是而非的山寨服务的窘境。 该应用程序是 ChatGPT 的首个官方移动应用程序。ChatGPT 软件程序在去年推出后迅速…

Inertial Explorer处理pospac数据总结

Inertial Explorer处理pospac数据的过程包括&#xff1a;1&#xff09;从pospac提取出gps数据和imu数据&#xff1b;2&#xff09;gps数据转成rinex格式&#xff1b;3)imu数据转成imr格式&#xff1b;4&#xff09;IE对gps数据进行PPP解算&#xff1b;5&#xff09;紧耦合融合解…

帆软FineReport之版本升级

最近有个需求是将帆软报表版本从9升级到10&#xff0c;记录升级过程&#xff0c;方便备查。 前置条件&#xff1a;服务器上帆软10部署成功 版本区别 fineReport 9.0 http://IP:Port/WebReport/ReportServer?reportletabc.cpt fineReport 10.0 http://IP:Port/webroot/decision…

biopython: runningtime:generator didnot stop after throw

在运行某个蛋白【3NPS】的时候出现报错: 代码: parse=PDBParse(QUIET=True) structure=parser.get_structure(X,pdb) 报错: runningtime:generator didnot stop after throw 解决: (1)检查是否biopython版本和python 版本不一致: Biopython 支持多个 Python 版本…

第一章:VMware 虚拟机安装

Linux 的开发需要在 Linux 系统下进行&#xff0c;这就要求我们的 PC 主机安装 Linux 系统&#xff0c;本篇我 们选择 Ubuntu 这个 Linux 发行版系统。本篇讲解如何安装虚拟机&#xff0c;以及如何在虚拟机中安装 Ubuntu 系统&#xff0c;安装完成以后如何做简单的设置。如…

Android大作业(三)——修改应用图标

Android大作业&#xff08;三&#xff09;——修改应用图标 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在Android studio开发安卓应用时&#xff0c;工程中带有默认应用图标。安卓的图标有圆角、方形、高低像素的不同版本&#x…

这就是冒泡排序,像可乐中的气泡滋滋向上冒一样(44)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 什么是冒泡排序&#xff1f; 用Python写段代码&#xff0c;实现冒泡排序。 冒泡排序 冒泡排序(Bubble Sort)是一种…

springboot+jsp高校社交校友交流平台的设计与实现

在学校里我们结识了很多朋友。当我们毕业离校走上各自的人生道路&#xff0c;这份友谊将成为宝贵的人生精神财富。但世事变迁&#xff0c;或许我们原本留下的联系方式已经不能再用&#xff0c;使得朋友之间失去联系&#xff0c;更别提相聚&#xff0c;这份精神财富也将丢失。这…

一文会用断码屏

断码屏的使用 1、断码屏显示文字原理 我理解应该是偏压原理达到显示效果的。 LCD驱动分为A型、B型&#xff0c;如果LCD偏压类型为C型&#xff0c;固定为 1/3 偏压。 由数据手册得知&#xff0c;以下&#xff1a; LCD 驱动器提供的 COM 和 SEG 输出数目&#xff0c;以及偏压…

【运维知识进阶篇】集群架构-Nginx四层负载均衡详解

四层负载均衡含义及应用场景 四层负载均衡是基于传输层协议包来封装的&#xff08;如&#xff1a;TCP/IP&#xff09;&#xff0c;那我们介绍的的七层是指的应用层&#xff0c;他的组装在四层的基础之上&#xff0c;无论四层还是七层都是指的OSI网络模型。我们之前介绍了七层负…

LabVIEWCompactRIO 开发指南24 第5章通过LabVIEW FPGA定制硬件

LabVIEWCompactRIO 开发指南24 第5章通过LabVIEW FPGA定制硬件 本章将介绍了一些练习&#xff0c;以及使用LabVIEW FPGA模块和CompactRIO开发高性能控制和监测系统的高级技巧和技巧。它介绍了推荐的编程实践、避免常见错误方法以及创建快速、高效且可靠的LabVIEW FPGA应用程序…

什么是跨链交易?

每个区块链都是一个完整的数字环境&#xff0c;其中所有应用程序都通过底层网络连接。但随着区块链网络的不断增加&#xff0c;以及区块链之间缺乏连接&#xff0c;人们对跨链基础设施的需求越来越高&#xff0c;以提供用户在多个区块链网络之间的互操作性。 没有跨链基础设施&…

23种设计模式之享元模式(Flyweight Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的享元模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

【SAM系列】SAM Enhanced Pseudo Labels for Weakly Supervised Semantic Segmentation

论文链接&#xff1a;https://arxiv.org/abs/2305.05803 论文代码&#xff1a;https://github.com/cskyl/sam_wsss 目的 探索如何结合SAM在image-level supervision下改善WSSS的性能 结论 可以在 seed maks&#xff0c;pseudo label&#xff0c;prediction三处结合SAM来改善…

opencv图像分割

图像分割是指把一个图像分成不同的部分&#xff0c;用来处理图像的技术。在计算机视觉中&#xff0c;图像分割是指将图像从背景中分离出来的技术&#xff0c;或称目标检测或目标识别。分割后的结果是将不同区域划分为不同的像素。 在很多情况下&#xff0c;需要对一幅图像进行分…

深度相机如何标定?(代码开源)

文章&#xff1a;Robust Intrinsic and Extrinsic Calibration of RGB-D Cameras 作者&#xff1a;Filippo Basso, Emanuele Menegatti, and Alberto Pretto. 编译&#xff1a;点云PCL 代码&#xff1a; https://github.com/iaslab-unipd/rgbd_calibration 欢迎各位加入知识星球…

Servlet API 获取请求数据

目录 一. 构造HTTP请求的方式1.1 使用 Postman 来构造请求1.2 使用ajax 来构造请求 二 . HttpServletRequest API使用api实现前后端交互1 . 通过 GET 请求 query string 进行传参2 . POST请求 form 表单传参 &#xff08;body&#xff09;3 . Post 请求的 json 格式的数据传参&…

多激光雷达手眼标定

手眼标定方法已经有很多博客进行解析&#xff0c;但是都是针对机器人的手&#xff08;夹爪&#xff09;眼睛&#xff08;相机&#xff09;进行标定。例如&#xff1a; 标定学习笔记&#xff08;四&#xff09;-- 手眼标定详解 手眼标定_全面细致的推导过程 本文主要描述多激光…