这次终于搞清楚移动端开发了(三)

简介: 这次终于搞清楚移动端开发了(三)

我们知道,当把我们开发的pc端页面放在移动端展示,会出现布局错误。所以我们要做移动端适配,来让页面更合适。


接着第一期的文章


接着第二期的文章


接下来我们就来学习一下viewport标签并且学习如何做适配。


viewport


meta-viewport 标签是苹果公司在 2007 年引进的,用于移动端布局视口的控制。


使用示例:


<meta name="viewport" content="width=device-width,initial-scale=1.0">


viewport 相关选项


  • width 布局视口的宽度


  • initial-scale 【系统】初始缩放比例


  • maximum-scale 允许【用户】缩放的最大比例


  • minimum-scale 允许【用户】缩放的最小比例


  • user-scalable 是否允许用户缩放


  • viewport-fit 设置为cover值可以解决刘海屏的留白问题


1. width


width值可以是设备宽度标识 device-width,也可以是具体值,但有些安卓手机是不支持具体值,IOS全系列都支持。


2. initial-scale


  • initial-scale 为页面初始化时的显示比例。


  • initial-scale = 屏幕宽度(设备独立像素) / 布局视口宽度。


  • 只写initial-scale = 1.0 也可以实现完美视口,但为了良好的兼容性,width=device-width, initial-scale=1.0一般一起写。


3. maximum-scale


  • 设置允许用户最大缩放比例,苹果浏览器 safari 不认识该属性


  • maximum-scale = 屏幕宽度(设备独立像素) / 视觉视口宽度值


4. minimum-scale


  • 设置允许用户最小缩放比例。


  • minimum-scale = 屏幕宽度(设备独立像素) / 视觉视口宽度值


5. user-scalable


是否允许用户通过手指缩放页面。苹果浏览器 safari 不认识该属性


6.viewport-fit


设置为 cover 可以解决『刘海屏』的留白问题


所以在我们做移动端开发的时候,做好这样写<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">


了解了上面介绍的只是,那么我们来看看日和做适配,来使每个手机合理的展示内容。


适配


为什么要做适配?


由于移动端设备的屏幕尺寸大小不一,会出现:同一个元素,在两个不同的手机上显示效果不一样(比例不同)。


要想让同一个元素在不同设备上,显示效果一样,就需要适配无论采用何种适配方式,中心原则永远是:等比


主流的适配方式有三种:


  • viewport 适配


  • rem 适配(主流方式,几乎完美适配)


  • vw适配


viewport 适配


  • 方法:拿到设计稿之后,设置布局视口宽度为设计稿宽度,然后直接按照设计稿给宽高进行布局即可。


  • 优点:不用复杂的计算,直接使用图稿上标注的px值


  • 缺点:


  • 不能使用完整的meta标签,会导致在某些安卓手机上有兼容性问题。


  • 不希望适配的东西,例如边框,也强制参与了适配


  • 图片会失真


rem适配


首先来介绍一下em,rem


em 和 rem 都是 css 中的长度单位。而且两个都是相对长度单位,不过两个有点区别


  • em 相对的是父级元素的字体大小


  • rem 相对的是根元素的字体大小


rem适配的原理:编写样式时统一使用rem为单位,在不同设备上动态调整根字体大小。


方案一


淘宝、百度的移动端页面用的此方案


  • 设置完美视口


  • 通过js设置根字体大小 =  ( 当前设备横向独立像素值 * 100) / 设计稿宽度,设计稿对应的机型根字体设置为100px了。


  • 编写样式时,直接以rem为单位,值为:设计值 / 100


  • 增加 JS 代码进行实时适配


function adapter() {
        //获取布局视口宽度,因为开启了理想视口,布局视口=设备横向独立像素值 
        const dpWidth = document.documentElement.clientWidth        
        //计算根字体大小                                                      
        const rootFonstSize = (dpWidth * 100)/375                      
        //设置根字体大小                                                      
        document.documentElement.style.fontSize = rootFonstSize + 'px'
     }
     adapter() 
     // 注意:onresize事件检测的是布局视口的变化。
     window.onresize = adapter


优势:编写样式时直接挪动小数点即可。


方案二


搜狐、唯品会的移动端页面用的此方案


  • 设置完美视口


  • 通过js设置根字体大小 = 当前设备横向独立像素值 / 10


  • 编写样式时,直接以rem为单位,值为:设计值 / (设计稿宽度 / 10)


  • 增加 JS 代码进行实时适配


function adapter() {
        //获取布局视口宽度,因为开启了理想视口,布局视口=设备横向独立像素值 
        const dpWidth = document.documentElement.clientWidth        
        //计算根字体大小                                                      
        const rootFonstSize = dpWidth / 10                     
        //设置根字体大小                                                      
        document.documentElement.style.fontSize = rootFonstSize + 'px'
     }
     adapter() 
     // 注意:onresize事件检测的是布局视口的变化。
     window.onresize = adapter


通过rem适配时,动态设置完根字体大小后,只需要进行设计稿的px和rem的转换即可,不需要考虑其他的。


vw适配(百分比)


京东的移动端页面是通过vw和rem结合的方案 vw和vh是两个相对单位


  • 1vw = 等于布局视口宽度的1%


  • 1vh = 等于布局视口高度的1%


这里不需要通过js代码,直接通过元素的像素和设计稿的布局视口比值,然后vw作为单位即可完成适配。只需要考虑设计稿即可。


下面来通过less来完成在iphone6的设计稿下的345 * 150px的元素渲染适配。


@basic:375/100vw;
*{
  margin: 0;
  padding: 0;
}
#demo{
  width: 345/@basic;
  height: 150/@basic;
  background-color: skyblue;
  margin: 0 auto;
  margin-top: 15/@basic;
  border: 1px solid black;
}


网络异常,图片无法展示
|


下面来介绍一下京东的适配方案。


网络异常,图片无法展示
|


网络异常,图片无法展示
|


不过vw和vh有一定的兼容性问题:详见:这里


物理像素边框


高清屏幕下 1px 对应更多的物理像素,所以 1 像素边框看起来比较粗,使用媒查询来设置不同dpr下的边框:


@media screen and (-webkit-min-device-pixel-ratio:2){
    #demo{
        border: 0.5px solid black;
    }
}


移动端事件


事件类型


移动端事件列表


  • touchstart 元素上触摸开始时触发


  • touchmove 元素上触摸移动时触发


  • touchend 手指从元素上离开时触发


  • touchcancel 触摸被打断时触发


这几个事件最早出现于IOS safari中,为了向开发人员转达一些特殊的信息。


应用场景


  • touchstart 事件可用于元素触摸的交互,比如页面跳转,标签页切换


  • touchmove 事件可用于页面的滑动特效,网页游戏,画板


  • touchend 事件主要跟 touchmove 事件结合使用


  • touchcancel 使用率不高


注意:


  • touchmove 事件触发后,即使手指离开了元素,touchmove 事件也会持续触发


  • 触发 touchmove 与 touchend 事件,一定要先触发 touchstart


  • 事件的作用在于实现移动端的界面交互


点击穿透


touch 事件结束后会默认触发元素的 click 事件,如没有设置完美视口,则事件触发的时间间隔为 300ms 左右,如设置完美视口则时间间隔为 30ms 左右(备注:具体的时间也看设备的特性)。


如果 touch 事件隐藏了元素,则 click 动作将作用到新的元素上,触发新元素的 click 事件或页面跳转,此现象称为点击穿透


解决方法一


阻止默认行为


//阻止默认行为
node.addEventListener('touchstart', function(e){
  e.preventDefault(); 
})


解决方法二


使背后元素不具备click特性,用touchXxxx代替click


banner_img.addEventListener('touchstart',()=>{
    location.href = 'http://www.baidu.com'
})


解决方案三


让背后的元素暂时失去click事件,300毫秒左右再复原。因为touch系列事件和click事件极限间隔大约300ms。


#anode{
  pointer-events: none;
}


btn.addEventListener('touchstart',(event)=>{
    shade.style.display = 'none'
    setTimeout(()=>{
        anode.style.pointerEvents = 'auto'
    },300)
})


解决方案四


让隐藏的元素延迟300毫秒左右再隐藏


btn.addEventListener('touchstart',(event)=>{
    setTimeout(()=>{
      shade.style.display =  'none'
    },300)
})


相关文章
|
2月前
|
JavaScript 前端开发 算法
react只停留在表层?五大知识点带你梳理进阶知识
该文章深入探讨了React进阶主题,包括PropTypes与默认属性的使用、虚拟DOM的工作机制、Refs的高级用法、生命周期方法的详解以及CSS动画在React中的集成技巧。
|
3月前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
115 0
|
3月前
|
自然语言处理 前端开发 JavaScript
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
40 0
|
6月前
|
存储 Web App开发 运维
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
部署和发布是软件工程中经常互换使用的两个术语,甚至感觉是等价的。然而,它们是不同的! • 部署是将软件从一个受控环境转移到另一个受控环境,它的目的是将软件从开发状态转化为生产状态,使得软件可以为用户提供服务。 • 发布是将软件推向用户的过程,应用程序需要多次更新、安全补丁和代码更改,跨平台和环境部署需要对版本进行适当的管理,有一定的计划性和管控因素。
1490 1
|
5月前
|
前端开发 JavaScript 小程序
技术经验解读:你所不知的十二个前端组件库
技术经验解读:你所不知的十二个前端组件库
|
6月前
|
安全 网络安全 网络架构
网络开发过程详细知识点
网络开发过程详细知识点
59 0
|
移动开发 JavaScript 前端开发
探究Uniapp在移动端开发中的应用
探究Uniapp在移动端开发中的应用
200 0
|
编解码 前端开发 UED
这次终于搞清楚移动端开发了(二)
这次终于搞清楚移动端开发了(二)
|
编解码 前端开发 JavaScript
这次终于搞清楚移动端开发了(一)
这次终于搞清楚移动端开发了(一)
|
存储 编解码 前端开发
聊一聊前端开发中既熟悉又陌生的图片
聊一聊前端开发中既熟悉又陌生的图片
370 0
聊一聊前端开发中既熟悉又陌生的图片