移动端适配之viewport

目录

 盒模型:width=content(+padding + border)

class="content-box"内容盒模型(W3C盒)

class="border-box"边框盒模型(IE 盒)

scroll滚动

window浏览器视窗:包括滚动条


此Hook利用了visualViewportresize事件,

处理移动设备上因地址栏显隐、屏幕旋转、虚拟键盘弹出等导致视口变化

window.visualViewport API 提供了有关视觉视口(visual viewport)的信息,即用户实际看到的部分,这部分可能会因为UI元素(如地址栏和键盘)的显隐而改变。

  • 布局视口(Layout Viewport): 通常是网页的初始容器大小,用于CSS布局,对应于 getViewport 返回的尺寸。
  • 视觉视口(Visual Viewport): 用户实际看到的部分,可以随着用户操作(如缩放和滚动)而改变大小。getVisualViewport 提供这些信息。
// 导入React的useEffect和useState钩子
import { useEffect, useState } from "react";

// 定义getViewport函数,获取当前浏览器的视口大小
const getViewport = () => ({
    width: Math.max(
        document.documentElement.clientWidth || 0,
        window.innerWidth || 0
    ),
    height: Math.max(
        document.documentElement.clientHeight || 0,
        window.innerHeight || 0
    ),
})

// 定义getVisualViewport函数,获取当前的视觉视口大小(可能因为地址栏、键盘等元素的出现而比浏览器视口小)
const getVisualViewport = () => ({
    width: window.visualViewport?.width || 0,
    height: window.visualViewport?.height || 0,
})

// 定义useVisualViewport自定义钩子
export default function useVisualViewport() {
    // 使用useState创建viewport状态,用于存储当前浏览器视口的宽高
    const [viewport, setViewport] = useState({ width: 0, height: 0 })
    // 使用useState创建visualViewport状态,用于存储当前视觉视口的宽高
    const [visualViewport, setVisualViewport] = useState({ width: 0, height: 0 })

    // 使用useEffect处理组件挂载和更新逻辑
    useEffect(() => {
        // 定义handleResize函数,用于在视口大小变化时更新状态
        const handleResize = () => {
            setVisualViewport(getVisualViewport())
            setViewport(getViewport())
        }
        // 为visualViewport对象添加resize事件监听器
        window.visualViewport?.addEventListener("resize", handleResize)
        // 组件卸载时移除事件监听器
        return () =>
            window.visualViewport?.removeEventListener("resize", handleResize)
    }, [])

    // 返回当前的viewport和visualViewport状态
    return { viewport, visualViewport }
}

 盒模型:width=content(+padding + border)

class="content-box"内容盒模型(W3C盒)

height  = content

client=inner =content + padding

class="border-box"边框盒模型(IE 盒)

offset=outer=IE 盒 height = content + padding + border

只读(计算):offset、client

可改:scroll(Left、Top)、width、padding、border等

scroll滚动

1、scrollHeight:元素内容的总高度。

2、scrollWidth:总宽度。

3、scrollLeft:被隐藏在内容区域左侧的像素数。通过设置这个属性可以改变滚动位置。

4、scrollTop:被隐藏在内容区域上方的像素数。可以设置。

window浏览器视窗:包括滚动条

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL高级(索引-性能分析-explain执行计划)

explain 或者 desc 命令获取 MySQL 如何执行 select 语句的信息,包括在 select 语句执行过程中表如何连接和连接的顺序。 -- 直接在 select 语句之前加上关键字 explain / desc explain select 字段列表 from 表名 where 条件 ; explain select * …

自养号测评:如何提高国际站,敦煌网的店铺销量?

随着互联网技术的迅猛进步,电子商务已经成为现代商业领域中不可或缺的一环。敦煌网,作为专注于中国文化艺术产品的电商平台,成功吸引了大量消费者的目光。然而,对于商家而言,如何进一步提升敦煌网的销售业绩&#xff0…

用这些工具搭建企业内部知识库,原来这么轻松

在快速发展和信息爆炸的时代,为企业构建一个内部知识库变得十分重要。它不仅有助于保存关键信息,促进知识传承,还能提高企业的整体效率和响应能力。今天,我们将探讨三款非常适合搭建企业内部知识库的工具,它们各具特色…

Python教学入门:流程控制

条件语句(if 语句): 条件语句用于根据条件的真假执行不同的代码块。 x 10if x > 0: # 如果 x 大于 0print("x 是正数") # 输出:x 是正数 elif x 0: # 如果 x 等于 0print("x 是零") else: # 如果以…

第07-1章 计算机网络相关概念

7.1 本章目标 了解网络协议的概念了解网络体系结构熟悉ISO/OSI参考模型以及每一层的功能掌握TCP/IP模型各层的主要协议及其功能熟练掌握IP地址、子网规划等相关内容 7.2 网络协议的概念 7.2.1 概念介绍 (1)网络协议:计算机网络和分布系统中…

Java 笔试强训篇- Day1

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 点击消除 1.1 解题思路一 1.2 解题思路二 2.0 在两个数组中找出相同的数 2.1 解题思路 笔试强训说明:有一些题目提供不了原题。 1.0 点击消除 该题链…

初学python记录:力扣1883. 准时抵达会议现场的最小跳过休息次数

题目: 给你一个整数 hoursBefore ,表示你要前往会议所剩下的可用小时数。要想成功抵达会议现场,你必须途经 n 条道路。道路的长度用一个长度为 n 的整数数组 dist 表示,其中 dist[i] 表示第 i 条道路的长度(单位&…

Redis之路系列(2)纸上得来终觉浅(上)

02 纸上得来终觉浅(上) 文章内容基于redis6,本章节介绍了redis的实际应用,主要包含:大量键值对保存的案例场景,海量key时的聚合计算、排序计算、状态统计、基础统计的应用 大量键值对保存 场景案例 有这么一个需求场景&#xff…

OpenSearch的几种认证

在Amazon OpenSearch Service中,主用户的配置可以通过三种方式进行:用户名和密码组合、IAM角色,以及通过第三方联合登录。这样的配置授权主用户在OpenSearch仪表板上进行内部用户、角色和角色映射的创建。需要注意的是,OpenSearch…

【nginx代理和tengine的启动-重启等命令】

在nginx成功启动后[任务管理器有nginx.exe进程],运行vue项目,在浏览器访问http://localhost:10001/,提示:访问拒绝(调试中network某些地址403); 解决方案: localhost改为ip&#xff…

【论文笔记 | 异步联邦】Asynchronous Federated Optimization

论文信息 Asynchronous Federated Optimization,OPT2020: 12th Annual Workshop on Optimization for Machine Learning,不属于ccfa introduction 背景:联邦学习有三个关键性质 任务激活不频繁(比较难以达成条件)&…

怎么配置python

右键点击“计算机”,选择“属性”。 在左侧栏找到“高级系统设置”。 点击“环境变量”。 在系统变量中,双击“Path”。 在字符串的末尾,加一个分号; 然后再输入你安装python的路径,如图所示: 点击“确定”&#xff0…

Python中的迭代器:深入理解与实用指南

文章目录 1. 迭代器的基本概念2. Python中的迭代器实例3. 自定义迭代器3.1 例子3.2 详细过程 4. 迭代器的高级应用5. 常见问题与解答 迭代器是Python中非常核心的概念之一,在面试中也会被问到。下面我会详细介绍什么是迭代器,使用方法,以及使…

JVM之初识垃圾收集器

JDK 8:Parallel Scavenge(新生代) Parallel Old(老年代)JDK8以后:G1收集器 什么是串行回收和并行回收? Serial收集器:串行收集器 新生代使用标记复制算法,老年代使用标记…

JSON驱动的动态SQL查询:实现灵活条件筛选的查询

当我们构建动态 SQL 查询功能时,需要考虑到安全性和灵活性的平衡。本文将讨论如何通过 JSON 数据和 FreeMarker 模板构造动态 SQL 查询,以及如何减少 SQL 注入的风险。 JSON 数据与动态 SQL JSON 是一种常用的数据交换格式,它的灵活性和易读…

【读点论文】YOLOX: Exceeding YOLO Series in 2021,无锚框单阶段目标检测方案,解耦检测头的分类和回归分支,优化标签分配策略

YOLOX: Exceeding YOLO Series in 2021 Abstract 在本报告中,我们介绍了YOLO系列的一些经验改进,形成了一种新的高性能探测器—YOLOX。我们将YOLO检测器切换到无锚方式,并进行其他先进的检测技术,即去耦头和领先的标签分配策略S…

信号处理相关知识

一: 1.序列——三种典型序列通过matlab绘图即可 2.数字信号的自变量一定是整数,幅度上取值是有限的状态(不一定是整数)。 3.抽取和插值 4.模拟正弦信号sin(wt):w是角频率,单位rad/s,f是频率w/2Π。 5.假设用采样周…

浏览器工作原理与实践--浏览上下文组:如何计算Chrome中渲染进程的个数

经常有朋友问到如何计算Chrome中渲染进程个数的问题,那么今天就来完整地解答这个问题。 在前面“04 | 导航流程”这一讲中我们介绍过了,在默认情况下,如果打开一个标签页,那么浏览器会默认为其创建一个渲染进程。不过我们在“04 |…

Qt | 远程仓库

git | 基本操作 01 远程仓库 在了解之前,先注册github(gitee或者gitcode等等)账号,由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要一点设置: 第一步:创建SSH Key。在用户主目录下,看看…

姿态估计-人脸识别mesh-3d手势识别-3d目标检测-背景分割-人脸关键点

往期热门博客项目回顾:点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…