【面试题】前端 移动端自适应?_前端移动端适配面试题

设备像素比

设备像素比 (DevicePixelRatio) 指的是设备物理像素和逻辑像素的比例 。比如 iPhone6 的 DPR 是2。

设备像素比 = 物理像素 / 逻辑像素。可通过 window.devicePixelRatio 获取,CSS 媒体查询代码如下

@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
   ...
}
复制代码
布局视口、视觉视口、理想视口

布局视窗(Layout Viewport)

一般移动设备的浏览器都默认设置了一个布局视口,并且该视口最常见的分辨率为 980px。

由于 980px 的宽度大于大部分手机屏幕的宽度,为了将页面显示完全,只能对原来的页面进行缩放,如果不进行缩放,那么就需要左右拖动来浏览。(大部分浏览器默认采用缩放方式)

视觉视窗(Visual Viewport)

它指的是浏览器的可视区域,也就是我们在移动端设备上能够看到的区域。默认与当前浏览器窗口大小相等,当用户对浏览器进行缩放时,不会改变布局视口的大小,但会改变视觉窗口的大小。

理想视口(Ideal Viewport) 理想中的视口。这个概念最早由苹果提出,其他浏览器厂商陆续跟进,目的是解决在布局视窗下页面元素过小的问题,显示在理想视口中的页面具有最理想的宽度,用户无需进行缩放。所以理想视窗就相当于把布局视窗修改成一个理想的大小,这个大小和物理视窗基本相等。

Viewport Meta

我们可以使用 viewport meta 标签来进行布局视窗的设置,常见的配置如下:

<metaname="viewport"content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />复制代码

viewport meta 各个属性介绍:

  • width:设置 layout viewport 的宽度

  • initial-scale:设置页面与 layout viewport 之间的初始放大系数

  • minimum-scale:设置最小放大系数(用户可以虽小的最小程度)

  • maxmum-sacle:最大放大系数(用户可以放大的最大程度,比如 300%)

  • height:设置 layout viewport 的高度。应该设置布局视图的高度。它在任何地方都不受支持。(一般不会规定高度)

  • user-scalable:设置为 no,意味着阻止用户进行缩放操作。最好不要使用。

自适应方案


响应式布局

使用媒体查询,百分比布局,flex 布局等方式来让页面自适应,Bootstrap 就是使用响应式布局完成适配移动端的。

如上图可以看到,Bootstrap 使用了 @media 来控制不同视窗下的展示。

@mediaonly screen and (min-width: 375px) {
  .logo { width : 62.5px; }
}

@mediaonly screen and (min-width: 360px) {
  .logo { width : 60px; }
}

@mediaonly screen and (min-width: 320px) {
  .logo { width : 53.3333px; }
}
复制代码
rem 方案

rem(font size of the root element)是 CSS3 新增的一个相对单位,是指相对于根元素的字体大小的单位。这个方案阿里有个对应的库 lib-flexible,我们将介绍个他的原理和最终效果。

因为 rem 是相对于根元素字大小的单位,我们在编写标准尺寸的 h5 页面时可以使用 rem 作为单位,最后根据设备大小动态设置根元素大小,这样即可实现自适应。

举个例子:

  1. 比如设计稿是 750 * 1334 尺寸的,根元素设定一个基础大小 100px,页面完成后如果是展示在 828 * 1562 机型上,计算出对应的根元素大小为 110.4 px。此时页面内使用 rem 单元的元素对应的 px 也会按比例增大,就实现了自适应。

  2. 接下来我们要按照设计稿写各个布局宽高大小,只需要把 px 转换成 rem,比如 50px 就对应 0.5rem(根元素为100px)。这边可以使用 postcss-pxtorem 插件或者 less 定义函数都可以。

来看下 lib-flexible 经典版本核心部分:

var doc = window.document;
var docEl = doc.documentElement;
functionrefreshRem(){
    var width = docEl.getBoundingClientRect().width; // 获取html宽度// ...var rem = width / 10; // 这边 10 的计算:750 ÷ 75 = 10,也就是基础大小是 75px,上边例子中是 100px
    docEl.style.fontSize = rem + 'px';
    flexible.rem = win.rem = rem;
}

// 页面出现或者大小变化时重新设置
win.addEventListener('resize', function() {
    clearTimeout(tid);
    tid = setTimeout(refreshRem, 300);
}, false);
win.addEventListener('pageshow', function(e) {
    if (e.persisted) {
        clearTimeout(tid);
        tid = setTimeout(refreshRem, 300);
    }
}, false);
复制代码

还有一部分是根据 window.devicePixelRatio 设置 meta 的 scale(注意2.0版本不会设置),比如在 iphone6 下 scale 会设置成 0.5,此时 1px 的效果如下:

iphone6 下 scale 为 1 时,1px 的效果如下:

可以看到 scale 为 0.5 的情况下,线更细。

如果设置 scale 保持都为 1,根据上边自适应方案,编写的 1px 代码最终在 iphone6 中渲染的是 0.5px,但是部分设备版本不支持 0.5px,可能会解释成 0,这时就要单独处理 1px 问题。

小结:目前个人项目中使用较多的是只动态设置根元素大小,meta 设置为 ,1px 的问题看情况单独处理。

vw、vh 方案

lib-flexible 官方已经不推荐使用 rem 方案了,推荐使用 vw、vh 方案。

由于viewport单位得到众多浏览器的兼容,lib-flexible这个过渡方案已经可以放弃使用,不管是现在的版本还是以前的版本,都存有一定的问题。建议大家开始使用viewport来替代此方。

vw、vh、vmin、vmax 是一种视窗单位,也是相对单位。它相对的不是父节点或者页面的根节点。而是由视窗(Viewport)大小来决定的,单位 1,代表类似于 1%。

  • vw:视窗宽度的百分比(1vw 代表视窗的宽度为 1%)

  • vh:视窗高度的百分比

  • vmin:当前 vw 和 vh 中较小的一个值

  • vmax:当前 vw 和 vh 中较大的一个值

举个例子,看下 vw、vh 方案是怎么实现自适应的:

1、设计稿是 750 * 1334 尺寸的,页面布局宽高大小都按设计稿写,到时类似使用 less 或者 postcss-px-to-viewport 插件转换成 vw。比如一个元素宽度为 75px, 到时会自动转换成 10vw,在页面尺寸为 828 * 1562 下,这个元素对应的宽度为 82.8px,实现了自适应。

可以看到对比 rem 方案,这边省去了设置根元素大小,更加简洁。

postcss-px-to-viewport 插件的一些配置:

module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
         unitToConvert: "px", // 要转化的单位       viewportWidth: 750, // UI设计稿的宽度       unitPrecision: 6, // 转换后的精度,即小数点位数       propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换     viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vw       fontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vw      selectorBlackList: ["wrap"], // 指定不转换为视窗单位的类名,       minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换       mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false      replace: true, // 是否转换后直接更换属性值       exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配       
    }
  }
}
复制代码

vw、vh 的兼容性好,基本所有的现代浏览器都支持。

专业技能

一般来说,面试官会根据你的简历内容去提问,但是技术基础还有需要自己去准备分类,形成自己的知识体系的。简单列一下我自己遇到的一些题

  • HTML+CSS

  • JavaScript

  • 前端框架

  • 前端性能优化

  • 前端监控

  • 模块化+项目构建

  • 代码管理

  • 信息安全

  • 网络协议

  • 浏览器

  • 算法与数据结构

  • 团队管理

最近得空把之前遇到的面试题做了一个整理,包括我本人自己去面试遇到的,还有其他人员去面试遇到的,还有网上刷到的,我都统一的整理了一下,希望对大家有用。

其中包含HTML、CSS、JavaScript、服务端与网络、Vue、浏览器等等

由于文章篇幅有限,仅展示部分内容

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

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

相关文章

计算机图形学入门16:阴影映射

1.前言 前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照&#xff0c;但是着色并不会进行阴影的计算&#xff0c;阴影需要单独进行处理&#xff0c;目前最常用的阴影计算技术之一就是Shadow Mapping技术&#xff0c;也就是俗称的阴影映射技术。 2.阴影映射 Shadow Map…

【网络协议】精讲ARP协议工作原理!图解超赞超详细!!!

亲爱的用户&#xff0c;打开微信&#xff0c;搜索公众号&#xff1a;“风云说通信”&#xff0c;即可免费阅读该文章~~ 目录 前言 1. ARP协议介绍 1.1 ARP协议功能 1.2 ARP请求报文 1.3 ARP工作原理 2. ARP 缓存超时 2.1 RARP 3. ARP 攻击 3.1 ARP 攻击分类 前言 首先…

C++(part2、3-Linux系统编程+数据库项目):Linux网络云盘

文章目录 一、项目需求分析1.一期&#xff1a;命令行解析(1)cd(用栈管理)、ls、pwd(2)puts、gets(3)mkdir、touch、rmdir、rm 2.二期&#xff1a;密码验证、日志、断点续传、大文件传输(1)密码验证(2)日志(3)断点续传(4)大文件传输 3.三期&#xff1a;用户注册、用户登录、虚拟…

生命在于学习——Python人工智能原理(4.2)

三、Python的数据类型 3.1 python的基本数据类型 特点&#xff1a; 表示单一的、原子性的数据。 不可再分&#xff0c;是语言内建的最基本的数据类型。 存储的是简单的数值、字符、布尔值等。 在内存中通常占据固定大小的空间。 Python提供了整数、浮点数和复数三种数字类型和…

JavaScript的学习之事件的简介

目录 一、事件是什么 二、如何处理事件 一、事件是什么 定义&#xff1a;事件就是浏览器和用户之间的交互行为。 例如&#xff1a;点击按钮、鼠标移动、关闭窗口等。 二、如何处理事件 我们可以在对应的事件属性中设置一些JS行为&#xff0c;当事件触发的时候会将这些代码执行…

QT拖放事件之三:自定义拖放操作-利用QDrag来拖动完成数据的传输

1、运行效果 1)Qt::MoveAction 2)Qt::CopyAction 2、源码 #include "Widget.h" #include "ui_Widget.h" #include "common.h"

pyhon模块以及常用的第三方模块

import my_info as info print(info.name) info.show()from my_info import * print(name) show() pyhon中包的导入 import admin.my_admin as ad # 包名.模块名 admin是包名&#xff0c;my_admin是模块名print(ad.name) print(ad.info())from admin import my_admin as ad # …

[RPI4] 树莓派4b安装istoreos及使用 -- 1. 系统安装

最近在研究家庭智能化的一些东西,其中包括网络,智能家居等一系列内容,然后看过的资料有的想再回来看的时候就找不到了,然后就想着开这么一个系列,做一些记录,先从智能家居开始吧。 1 安装istoreos系统 iStoreOS 目标是提供一个人人会用的路由兼轻 NAS 系统,不管是作为路…

【本地知识库】本地知识库+语言大模型=知域问答

本地知识库语言大模型知域问答 本项目实质为本地知识库构建及应用&#xff0c;内容包含&#xff1a; 本地知识库构建及应用相关知识的介绍离线式本地知识库构建及应用在线式本地知识库构建及应用 本地知识库构建及应用相关知识的介绍 本地知识库 本地知识库通常是指存储在…

主播美颜工具背后的技术:视频直播美颜SDK详解

美颜效果是如何实现的呢&#xff1f;其中的关键技术就是视频直播美颜SDK。本篇文章&#xff0c;笔者将详细为您解答美颜SDK的核心技术和实现原理&#xff0c;探讨其背后的秘密。 一、美颜SDK的基本原理 美颜SDK的这些功能依赖于图像处理和计算机视觉技术&#xff0c;通过对视…

Java 8 Date and Time API

Java 8引入了新的日期和时间API&#xff0c;位于java.time包下&#xff0c;旨在替代旧的java.util.Date和java.util.Calendar类。新API更为简洁&#xff0c;易于使用&#xff0c;并且与Joda-Time库的一些理念相吻合。以下是Java 8 Date and Time API中几个核心类的简要概述&…

【服务器05】之【登录/注册账号成功转至游戏场景】

Unity登录注册数据库 打开【服务器01】的文章项目 导入新UI系统 点击2D 双击输入栏位置 修改输入框尺寸及位置 放大字体 修改默认输入文字 发现中文字变成了口口口口 原因是新UI系统不支持中文&#xff0c;解决这个问题需要更换字体 并且修改输入时字体大小 我们取电脑中找Fon…

劳易测合作伙伴Pizzato P-KUBE Lite安全把手新品来袭!

劳易测合作伙伴Pizzato全新 P-KUBE 系列再添新成员&#xff01;——P-KUBE Lite安全把手&#xff0c;进一步拓展了应用范围。新产品采用高聚酯材质制成&#xff0c;具备卓越的抗冲击性能&#xff0c;确保在严苛环境下把手的耐用性。把手的设计既符合人体工程学又兼具功能性&…

linux中的调试工具gdb

目录 1.背景知识补充 2.使用 知识补充 1.背景知识补充 1.gcc下编译默认是release方式发布的&#xff0c;无法直接进行调试 如果要以debug方式发布&#xff0c;需要携带-g 可以使用grep查询 因为携带debug信息&#xff0c;其文件体积要大一些 2.使用 1.gdb 可执行程序 …

elementplus el-table(行列互换)转置

Element Plus v2.4.0, repl v3.4.0 <template> <div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label"名字" width"180" /><el-table-column prop"wei…

【ajax基础03】常用ajax请求方法和数据提交以及axios错误处理

目录 一&#xff1a;请求方法 什么是请求方法&#xff1a; 常见请求方法如下 二&#xff1a;axios中应用 语法格式&#xff1a; 案例&#xff1a; axios错误处理 三&#xff1a;如何赚钱 一&#xff1a;请求方法 什么是请求方法&#xff1a; 浏览器对服务器资源&…

Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点&#xff0c;一是组件的状态切换与buffer的流转过程&#xff0c;这部分内容我们已经在IL Spec中学习过了&#xff1b;二是OMX组件使用的buffer类型与buffer分配过程&#xff0c;这一节我们来重点剖析OMX组件使用的buffer类型。 1、引言 在实际应用…

提取图像主色调

依赖 Pillow 库。 提取图像主色调&#xff0c;直接上代码&#xff1a; from PIL import Imagedef extract_main_color(img_path: str, delta_h: float 0.3) -> str:"""获取图像主色调Args:img_path: 输入图像的路径delta_h: 像素色相和平均色相做减法的绝…

17.RedHat认证-Ansible自动化运维(下)

17.RedHat认证-Ansible自动化运维(下) 这个章节讲ansible的变量&#xff0c;包括变量的定义、变量的规则、变量范围、变量优先级、变量练习等。 以及对于tasks的控制&#xff0c;主要有loop循环作业、条件判断等 变量 介绍 Ansible支持变量功能&#xff0c;能将value存储到…

记录react实现选择框一二级联动出现的问题

需求&#xff1a;用户在选择第一个选择框的选项后&#xff0c;第二个选择框的选项会根据第一个选择框的选择动态更新。如图所示 出现的问题 一级分类选择之后二级分类没有数据&#xff0c;第二次重新选择一级分类的时候&#xff0c;二级分类就会有值。 第一次点击截图&#x…