博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移动前端适配方法总结
阅读量:7210 次
发布时间:2019-06-29

本文共 2906 字,大约阅读时间需要 9 分钟。

hot3.png

原文链接:

所谓前端适配,就是为了让移动设计稿在大部分的移动设备上看起来有一致的展示效果,目前比较流行的方法有两种。各有利弊,使用第一种在某些浏览器的webview里面会出现兼容问题,而且对于1像素会无法渲染。而用的方案在背景和字体上也会有某些问题。

方案一:强制meta viewport的宽度为设计稿的宽度

把下面的代码放在头部,然后制作稿跟PC上一样的制作就行

// 根据设计稿的宽度来传参 比如640 750 1125!function(designWidth){	if (/Android(?:\s+|\/)(\d+\.\d+)?/.test(navigator.userAgent)) {		var version = parseFloat(RegExp.$1);		if (version > 2.3) {			var phoneScale = parseInt(window.screen.width) / designWidth;			document.write('
'); } else { document.write('
'); } } else { document.write('
'); }}(640);

demo

//code from http://caibaojian.com/mobile-responsive.html
model

方案2:使用淘宝的精简版

计算尺寸时,只需要将对应的尺寸除以100。

源码:

(function(designWidth, maxWidth) {	var doc = document,		win = window;	var docEl = doc.documentElement;	var metaEl,		metaElCon;	var styleText,		remStyle = document.createElement("style");	var tid;	function refreshRem() {		// var width = parseInt(window.screen.width); // uc有bug		var width = docEl.getBoundingClientRect().width;		if (!maxWidth) {			maxWidth = 540;		};		if (width > maxWidth) { // 淘宝做法:限制在540的屏幕下,这样100%就跟10rem不一样了			width = maxWidth;		}		var rem = width * 100 / designWidth;		// var rem = width / 10; // 如果要兼容vw的话分成10份 淘宝做法		//docEl.style.fontSize = rem + "px"; //旧的做法,在uc浏览器下面会有切换横竖屏时定义了font-size的标签不起作用的bug		remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';	}	// 设置 viewport ,有的话修改 没有的话设置	metaEl = doc.querySelector('meta[name="viewport"]');	// 20171219修改:增加 viewport-fit=cover ,用于适配iphoneX	metaElCon = "width=device-width,initial-scale=1,maximum-scale=1.0,user-scalable=no,viewport-fit=cover";	if(metaEl) {		metaEl.setAttribute("content", metaElCon);	}else{		metaEl = doc.createElement("meta");		metaEl.setAttribute("name", "viewport");		metaEl.setAttribute("content", metaElCon);		if (docEl.firstElementChild) {			docEl.firstElementChild.appendChild(metaEl);		}else{			var wrap = doc.createElement("div");			wrap.appendChild(metaEl);			doc.write(wrap.innerHTML);			wrap = null;		}	}	//要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;	refreshRem();	if (docEl.firstElementChild) {		docEl.firstElementChild.appendChild(remStyle);	} else {		var wrap = doc.createElement("div");		wrap.appendChild(remStyle);		doc.write(wrap.innerHTML);		wrap = null;	}	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);	if (doc.readyState === "complete") {		doc.body.style.fontSize = "16px";	} else {		doc.addEventListener("DOMContentLoaded", function(e) {			doc.body.style.fontSize = "16px";		}, false);	}})(750, 750);

demo

lib.flexible 简化版

 

亲,如果您感觉本文有用,请点个赞再走吧✌(>‿◠)!!

转载于:https://my.oschina.net/ZhenyuanLiu/blog/1837434

你可能感兴趣的文章
在Oracle中查询存储过程和函数
查看>>
关于对象序列化json 说说
查看>>
设置div滚动条
查看>>
git常用命令
查看>>
React全家桶写一个CNode社区,奉上心得与源码
查看>>
全局替换字体,开源库更方便!!!
查看>>
Spring Cloud构建微服务架构:消息驱动的微服务(消费分区)【Dalston版】
查看>>
数据库路由中间件MyCat - 使用篇(4)
查看>>
JavaScript 异步队列实现及拓展
查看>>
三个白帽之从pwn me调试到Linux攻防学习
查看>>
JIT引擎触发RowHammer可行性研究
查看>>
朴素贝叶斯算法文本分类原理
查看>>
笔记-GPUImage(二)图片滤镜
查看>>
Spark综合使用及用户行为案例页面转化率统计分析实战-Spark商业应用实战
查看>>
Android Studio 3.2.0 正式版新特性
查看>>
JavaScript_JS里的函数:值和闭包
查看>>
Swift中遇到的警告--解决方法
查看>>
微信小程序学习笔记 路由传参
查看>>
Java 枚举查找并不抛异常的实现
查看>>
我与前端 | 视野的重要性
查看>>