移动端网页兼容适配方案小结

文章目录

  • 前言
  • 一、使用viewport配置,确保完美视口
  • 二、使用rem实现弹性布局
  • 三、CSS媒体查询处理不同尺寸
  • 四、1px边框问题解决方案
  • 五、安全区域适配
  • 六、图片适配方案
  • 七、横屏适配处理
  • 八、软键盘弹出处理
  • 总结


前言

移动端适配一直是前端开发中的重点难题,分享下常见的移动端兼容处理方案。

在这里插入图片描述


一、使用viewport配置,确保完美视口

移动端开发首先要设置正确的viewport,这是适配的基础。

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">

关键属性解析:

  • width=device-width:将视口宽度设置为设备宽度
  • initial-scale=1.0:初始缩放比例为1
  • user-scalable=no:禁用用户缩放
  • viewport-fit=cover:适配刘海屏

二、使用rem实现弹性布局

rem 是相对于 根元素(html)的 字体大小 的单位,可以实现整体布局的 弹性缩放

// 设置 rem 基准值
(function flexible() {const docEl = document.documentElement;function setRemUnit() {const rem = docEl.clientWidth / 10;docEl.style.fontSize = rem + 'px';}setRemUnit();window.addEventListener('resize', setRemUnit);window.addEventListener('orientationchange', setRemUnit);
})();

配套的 CSS 使用:

.container {width: 7.5rem;  /* 750px / 100 */height: 1rem;   /* 100px / 100 */font-size: 0.28rem; /* 28px / 100 */
}

三、CSS媒体查询处理不同尺寸

使用媒体查询针对 不同屏幕 尺寸定制样式。

/* iPhone SE */
@media screen and (max-width: 374px) {.container {font-size: 14px;}
}/* iPhone 6/7/8/X */
@media screen and (min-width: 375px) and (max-width: 413px) {.container {font-size: 16px;}
}/* iPhone 6/7/8 Plus */
@media screen and (min-width: 414px) {.container {font-size: 18px;}
}

四、1px边框问题解决方案

在高清屏幕下 1px 边框显示过粗的解决方案。

.border-1px {position: relative;&::after {content: '';position: absolute;left: 0;bottom: 0;width: 100%;height: 1px;background-color: #000;transform: scaleY(0.5);transform-origin: bottom;}
}// 2x屏
@media (-webkit-min-device-pixel-ratio: 2) {.border-1px::after {transform: scaleY(0.5);}
}// 3x屏
@media (-webkit-min-device-pixel-ratio: 3) {.border-1px::after {transform: scaleY(0.33);}
}

五、安全区域适配

适配 iPhone X 等带有刘海的机型。

/* 适配刘海屏 */
.safe-area-inset {padding-top: constant(safe-area-inset-top);padding-top: env(safe-area-inset-top);padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);
}/* 底部固定导航适配 */
.fixed-bottom {position: fixed;bottom: 0;bottom: constant(safe-area-inset-bottom);bottom: env(safe-area-inset-bottom);
}

六、图片适配方案

针对 不同分辨率 设备的 图片 适配策略。

<!-- 使用srcset适配不同分辨率 -->
<img srcset="image-320w.jpg 320w,image-480w.jpg 480w,image-800w.jpg 800w"sizes="(max-width: 320px) 280px,(max-width: 480px) 440px,800px"src="image-800w.jpg" alt="Responsive image">

配合 CSS 的处理:

.responsive-image {max-width: 100%;height: auto;display: block;
}

七、横屏适配处理

处理 横屏模式 下的布局适配。

/* 检测横屏 */
@media screen and (orientation: landscape) {.landscape-container {display: flex;flex-direction: row;}
}/* 检测竖屏 */
@media screen and (orientation: portrait) {.portrait-container {display: flex;flex-direction: column;}
}

JavaScript 监听屏幕旋转:

window.addEventListener('orientationchange', function() {if (window.orientation === 180 || window.orientation === 0) {// 竖屏console.log('竖屏');}if (window.orientation === 90 || window.orientation === -90) {// 横屏console.log('横屏');}
});

八、软键盘弹出处理

处理 软键盘弹出 时的页面适配问题。

// 监听软键盘
const originalHeight = document.documentElement.clientHeight;window.addEventListener('resize', () => {const currentHeight = document.documentElement.clientHeight;const input = document.activeElement;if (originalHeight > currentHeight) {// 软键盘弹出if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {input.scrollIntoView({ block: 'center' });}} else {// 软键盘收起window.scrollTo(0, 0);}
});

CSS处理:

/* 防止键盘顶起页面 */
.container {position: fixed;top: 0;right: 0;bottom: 0;left: 0;overflow: auto;-webkit-overflow-scrolling: touch;
}

总结

移动端适配是一个系统工程,需要在项目开始时就建立完整的适配方案,而不是在遇到问题时临时处理。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教培行业数字化未来:一站​式开发在线教育系统源码与网校APP详解

时下&#xff0c;如何有效地搭建一个全面、稳定、易于管理的在线教育系统&#xff0c;已成为越来越多教育机构关注的焦点。本篇文章&#xff0c;小编将深入探讨如何一站式开发在线教育系统源码与网校APP&#xff0c;为教培行业的数字化未来提供技术支持。 一、开发在线教育系统…

【C++基础】09、结构体

一、结构体(struct) C/C 数组允许定义可存储相同类型数据项的变量&#xff0c;但是结构体是 C 中另一种用户自定义的可用的数据类型&#xff0c;它允许存储不同类型的数据项。 结构体用于表示一条记录&#xff0c;假设现在想要跟踪图书馆中书本的动态&#xff0c;可能需要跟踪每…

android sqlite 数据库简单封装示例(java)

sqlite 数据库简单封装示例&#xff0c;使用记事本数据库表进行示例。 首先继承SQLiteOpenHelper 使用sql语句进行创建一张表。 public class noteDBHelper extends SQLiteOpenHelper {public noteDBHelper(Context context, String name, SQLiteDatabase.CursorFactory fact…

在vscode的ESP-IDF中使用自定义组件

以hello-world为例&#xff0c;演示步骤和注意事项 1、新建ESP-IDF项目 选择模板 从hello-world模板创建 2、打开项目 3、编译结果没错 正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…

golangci-lint安装与Goland集成

golangci-lint安装与Goland集成 1.golangci-lint概述2.golangci-lint安装3.Goland 中集成 golangci-lint4.golangci-lint 的使用5.排除代码检查 1.golangci-lint概述 golangci-lint是用于go语言的代码静态检查工具集 官网地址&#xff1a;golangci-lint 特性&#xff1a; 快…

一次成功流水账-RBDL库的安装与验证

1.安装 2.编写CMakeLists.txt文件并验证例子 1.安装 从git源码下载&#xff0c;安装依赖&#xff0c;cmake编译并安装 安装依赖库 sudo apt update sudo apt upgrade ​ sudo apt install cmake ​ sudo apt install libeigen3-dev ​ sudo apt-get install build-essentia…

【JavaEE】Spring Boot 项目创建

目录 一、idea创建Spring Boot项目1.1 创建过程1.2 依赖下载问题 二、网页创建Spring Boot项目三、目录介绍四、运⾏项⽬&#xff0c;看是否创建成功4.1 请求响应流程分析 五、常见报错5.1 Whitelabel Error Page4.1.1 注解写错&#xff1a;5.1.2 500 ⽆法访问此⽹站 六、状态码…

瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…

TCP/IP 模型中,网络层对 IP 地址的分配与路由选择

TCP/IP 模型中&#xff0c;网络层对 IP 地址的分配与路由选择 一. IP 地址的分配1.1 IP 地址的结构与分类1.2 IP 地址的分配方式 二. 路由选择2.3 路由协议2.4 路由表的结构2.5 路由选择的算法2.6 默认路由与静态路由 三. 网络层的 IP 地址分配与路由选择总结 前言 这是我在这个…

WebRTC搭建与应用(五)-Coturn踩坑记

WebRTC搭建与应用(五)-Coturn踩坑记 近期由于项目需要在研究前端WebGL渲染转为云渲染&#xff0c;借此机会对WebRTC等有了初步了解&#xff0c;在此记录一下&#xff0c;以防遗忘。 第五章 WebRTC搭建与应用(五)-Coturn踩坑记 文章目录 WebRTC搭建与应用(五)-Coturn踩坑记前…

亚信安全举办“判大势 悟思想 强实践”主题党日活动

为深入学习和贯彻党的二十届三中全会精神&#xff0c;近日&#xff0c;亚信安全举办了 “学习贯彻党的二十届三中全会精神——‘判大势 悟思想 强实践’党日活动”&#xff0c;并取得圆满成功。 本次活动特邀南京市委宣讲团成员、南京市委党校市情研究中心主任王辉龙教授出席。…

EsChatPro 接入国内 DeepSeek 大模型

EsChatPro 接入国内 DeepSeek 大模型 前言 上一篇文章 我们讲了 EsChatPro 如何在本地安装运行&#xff0c;接下来给大家带来接入 deepseek 大模型的教程&#xff0c;实现 AI对话 功能 详见&#xff1a;EsChatPro本地开发运行指南 前置准备 首先我们打开 deepseek 的官网&…

Linux挖矿程序排查

一、背景 我们收到一个阿里云安全告警&#xff0c;内容是服务器可能存在挖矿程序。 二、杀死挖矿程序 2.1 找到可疑服务器进程 #1.输入top命令&#xff0c;输入shift P会按照cpu的使用率大小从大到小进行排序&#xff0c;cpu使用率高的就是可疑进程。 top #2.查看运行该进程…

flask基础

from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时&#xff0c;Flask 会调用对应的视图函数来处理请求 def index():return …

OpenCV学习——图像融合

import cv2 as cv import cv2 as cvbg cv.imread("test_images/background.jpg", cv.IMREAD_COLOR) fg cv.imread("test_images/forground.png", cv.IMREAD_COLOR)# 打印图片尺寸 print(bg.shape) print(fg.shape)resize_size (1200, 800)bg cv.resize…

Spring Boot 项目创建

创建一个新项目&#xff1a; 打开 Spring Initializr 网址&#xff1a;https://start.spring.io/ &#xff0c;然后创建一个新项目&#xff1a; springboot3.3.5_jdk17&#xff1a; Project&#xff08;Maven&#xff09;编程语言&#xff08;Java 17&#xff09;Spring Boo…

GTID下复制问题和解决

环境介绍 数据库1主2从&#xff0c;mysql版本是v5.19 表结构 一、主库新增记录&#xff0c;从库提示主键冲突 模拟故障 1&#xff0c; master上关闭 sql_log_bin,删除id 103 后打开 2&#xff0c; 确认此时从库有id103,主库没有 3&#xff0c; master insert id103 主从异常…

C语言初阶【13】——打印一个数的每一位(递归和非递归实现)

1. 题目 打印一个数的每一位 2.分析 首先先实现非递归方式&#xff0c; 以123为例。我们要获取它的每一位&#xff0c; 获取个位数&#xff1a;123 %10 3 获取十位数&#xff1a;123/10 12 之后在 12%10 2&#xff1b; 获取百位数&#xff1a;12/10 1 之后再1%10 1&#x…

webrtc学习----前端推流拉流,局域网socket版,一对多

提示&#xff1a;局域网socket版&#xff0c;一对多 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种实时通讯技术&#xff0c;允许网…

深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223

深入探讨 Go 中的高级表单验证与翻译&#xff1a;Gin 与 Validator 的实践之道 在现代后端开发中&#xff0c;表单验证是保证数据完整性和服务稳定性的核心环节。如何优雅、高效地实现表单验证&#xff0c;同时提供人性化的错误提示&#xff0c;是每位开发者的必修课。在本文中…