一:大家先下载metahandler.js

二:准备一个用px实现的移动页面(宽度固定死的页面),引入metahandler.js框架

1、视口设置
width=640,是根据psd图来设置,有多宽设置多宽(设计图是640的设置640)
<meta content="target-densitydpi=device-dpi,width=640" name="viewport">

2.  引入MetaHandler.js

<script type="text/javascript" src="js/MetaHandler.js"></script>

3、body设置宽度

body{ width:640px; }
三:修改MetaHandler.js文件的最后配置代码。在执行fixViewportWidth函数时,传入相应的像素值作为参数即可。
opt.fixViewportWidth(640);   //   调用自适应屏幕的功能函数,640是根据psd图来设置,有多宽设置多宽

四.  然后按照电脑端的制作就可以了  全程用PX就可以的

五:横屏存在的兼容问题(测试地址http://c.3g.163.com/CreditMarket/default.html)

在使用谷歌浏览器进行浏览时,如果横屏后点击刷新,则页面会再缩小,成为居中显示状态,此时再竖屏之后,左右也会留白(此时再刷新是能重新恢复正常)。具体效果如下。

横屏后再刷新的效果:

从横屏恢复到纵屏的状态:

我们的看法:很少有人在旋转到横屏之后再刷新页面。而且目前移动端使用谷歌浏览器的人也很少,所以个人感觉这个bug是可以忽略的。另外,对于横屏转回到纵屏的时候,实际上我们是可以进行设备方向检测,然后再触发一次页面刷新,就不会出现纵屏上的问题了~

最后的话:我们使用了这个框架进行页面的开发,但是最近在使用时,感觉到在一些浏览器当中有些卡顿,用同样的设备和浏览器去测试了网易的手机页面,倒是没有什么卡顿现象,关于卡顿的问题,目前还在思考当中~~~

六:metahandler.js应用成功案例
1、http://c.3g.163.com/CreditMarket/default.html
2、http://m.deja.me/topics/#/special/9
3、http://impicture.lofter.com/

最终:  JS代码

!function () {
var opt = function() {
var ua = navigator.userAgent,
android = ua.match(/(Android);?[\s\/]+([\d.]+)?/),
ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/),
iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/),
os = {}; if (android){ os.android = true, os.version = android[2];}
if (iphone && !ipod) {os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.');}
if (ipad) {os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.');}
if (ipod) {os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null;} var MetaHandler = function(){
//MONOSTATE
if(MetaHandler.prototype.instance){
return MetaHandler.prototype.instance;
}
var me = this;
var meta = {},_els; /**
* _els
* meta = {name:{content:String,seriation:Array,store:{property:String},...},...}
* @method init
*/
function init(){
_els = document.getElementsByTagName('meta');
for(var i=0;i<_els.length;i++){
var name = _els[i].name;
if(name){
meta[name] = {};
meta[name].el = _els[i];
meta[name].content = _els[i].content;
meta[name].seriation = meta[name].content.split(',');
meta[name].store = getContentStore(name);
}
}
return me;
}
function getContentStore(name){
var content = meta[name].seriation,store = {};
for(var i=0;i<content.length;i++){
if(content[i].length<1){
content[i] = null;
delete content[i];
content.length--;
}else{
var ct = content[i].split('='),
pp = ct[0];
if(pp){
store[pp] = ct[1];
}
}
}
return store;
}
this.hasMeta = function(name){
return meta[name]?1:0;
}
this.createMeta = function(name){
if(!this.hasMeta(name)){
var el = document.createElement('meta');
el.name = name;
document.head.appendChild(el);
meta[name] = {};
meta[name].el = el;
meta[name].content = '';
meta[name].seriation = [];
meta[name].store = {};
}
return me;
}
this.setContent = function(name,value){
meta[name].content = value;
meta[name].el.content = value;
return me;
}
this.getContent = function(name){
return meta[name] && meta[name].content;
}
function updateContent(name){
meta[name].content = meta[name].seriation.join(',');
me.setContent(name,meta[name].content);
return me;
}
this.removeContentProperty = function(name,property){
var _property = property;
if(meta[name]){
if(meta[name].store[_property]!=null){
for(var i = 0;i<meta[name].seriation.length;i++){
if(meta[name].seriation[i].indexOf(property+'=')!=-1){
meta[name].seriation[i] = null;
delete meta[name].seriation[i];
break;
}
}
}
updateContent(name);
}
return me;
}
this.getContentProperty = function(name,property){
return meta[name] && meta[name].store[property];
}
this.setContentProperty = function(name,property,value){
var _property = property,
pv = property+'='+value;
if(meta[name]){
if(meta[name].store[_property]!=null){
meta[name].store[_property] = value;
for(var i = 0;i<meta[name].seriation.length;i++){
if(meta[name].seriation[i].indexOf(property+'=')!=-1){
meta[name].seriation[i] = pv;
break;
}
}
}else{
meta[name].store[_property] = value;
meta[name].seriation.push(pv);
}
updateContent(name);
}
return me;
} this.fixViewportWidth = function(width,fixBody){
width = width || me.getContentProperty('viewport','width');
if(width != 'device-width'){
var iw = window.innerWidth || width,
ow = window.outerWidth || iw,
sw = window.screen.width || iw,
saw = window.screen.availWidth || iw,
ih = window.innerHeight || width,
oh = window.outerHeight || ih,
sh = window.screen.height || ih,
sah = window.screen.availHeight || ih,
w = Math.min(iw,ow,sw,saw,ih,oh,sh,sah),
ratio = w/width,
dpr = window.devicePixelRatio;
ratio = Math.min(ratio,dpr); //fixBody may trigger a reflow,you should not use it if you could do it in your css
if(fixBody){
document.body.style.width = width+'px';
} if(os.android){
me.removeContentProperty('viewport','user-scalable')
.setContentProperty('viewport','target-densitydpi','device-dpi')
.setContentProperty('viewport','initial-scale',ratio)
.setContentProperty('viewport','maximum-scale',ratio);
}else if(os.ios && !os.android){
me.setContentProperty('viewport','user-scalable','no');
if(os.ios && parseInt(os.version)<7){
me.setContentProperty('viewport','initial-scale',ratio);
}
}
}
}
init();
//MONOSTATE
MetaHandler.prototype.instance = this;
};
return new MetaHandler;
}(); // HTML5友情提示 —— 调用自适应屏幕的功能函数
opt.fixViewportWidth(1080);
}();

移动端--用PX为单位+JS框架 实现页面布局的更多相关文章

  1. 【App FrameWork】框架的页面布局

    之前主要用JqueryMobile+PhoneGap的模式开发移动应用,但JQueryMobile自身存在的硬伤太多,如加载速度缓慢,页面转场白屏.闪烁,头尾部导航浮动问题,页面滚动等等,用户体验效果 ...

  2. CSS3移动端vw+rem不依赖JS实现响应式布局

    1.前言 (1)vw/vh介绍 在使用之前,我们先简单了解一下什么是vw和rem以及它们的作用,vw是css3出现的一个新单位,它是"view width"缩写,定义为把当前屏幕分 ...

  3. 轻松使用px为单位开发移动端页面

    研究移动端页面已经有许久了,一直执着于rem来开发,不谈性能怎么样,单从工作效率上看影响了不少,首先要固定设计稿的宽度,一般都是固定在640px,然后在根据根目录的字体大小来计算出每个元素的rem的值 ...

  4. 移动端适配rem为单位的rem.js及个别设备设置了大字体模式,导致页面变形的处理方式

    这段时间内,涉及到的都是移动端开发,说到移动端开发,我们就会思考到,目前分辨率的问题,如果用px为单位的话,在不同移动设备和不同分辨率下,页面的效果可能会有所不同,甚至导致页面变形.所以在次我们就用到 ...

  5. 深度解析使用CSS单位px、em、rem、vh、vw、vmin、vmax实现页面布局

     1.px:绝对单位,页面按精确像素展示 2.em:相对单位,基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体是16px),整个页面内1em不是一个固定的值. e ...

  6. 手淘flexible.js框架使用和源代码讲解

    手淘框架是一个用来适配移动端的js框架,下面我们来讲解一下如何使用手淘的这套框架. 其实手淘框架的核心原理就是根据不同的width给网页中html跟节点设置不同的font-size,然后所有的距离大小 ...

  7. 从零构建以太坊(Ethereum)智能合约到项目实战——第22章 玩转truffle framework 、Web3.js 框架

    P84 .1-玩转truffle framework.Web3.js 框架 内容介绍 truffle官方网站:https://truffleframework.com/ P85 .2-truffle ...

  8. 前端Js框架汇总

    概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net co ...

  9. Node.js 框架

    Node.js的是一个JavaScript平台,它允许你建立大型的Web应用程序.  Node.js的框架平台使用JavaScript作为它的脚本语言来构建可伸缩的应用. 当涉及到Web应用程序的开发 ...

随机推荐

  1. 基础算法简单实现-python

    目录 Python(版本3.6+)-Anna-Lena Popkes

  2. select 选择列表传值问题

    <select> <option value ="volvo">Volvo</option> <option value ="s ...

  3. nginx屏蔽ip配置

    屏蔽单个IP的命令是 deny 192.168.201.1 封ip段192 deny 192.0.0.0/8 封ip段192.168 deny 192.168.0.0/16 封ip段192.168.2 ...

  4. Hackergame 2018的一道题目confused_flxg失败心得体会

    分析了这道题,发现自己有如下缺陷需要: 1.要提升:C/C++代码的分析能力2.熟悉IDA的动态调试功能3.能练习使用python编程基本的逻辑功能代码

  5. Jmeter Distributed (Remote) Testing: Master Slave Configuration

    What is Distributed Testing? DistributedTestingis a kind of testing which use multiple systems to pe ...

  6. ThinkPHP3.2 --- 中文乱码问题

    在thinkphp中初次运行时 会出现中文乱码问题,解决方法也很简单 只需要在入口文件index.php加上这段代码即可: <?php header("Content-Type: te ...

  7. 牛客小白月赛13 小A的最短路(lca+RMQ)

    链接:https://ac.nowcoder.com/acm/contest/549/F来源:牛客网 题目描述 小A这次来到一个景区去旅游,景区里面有N个景点,景点之间有N-1条路径.小A从当前的一个 ...

  8. ajax执行成功不进入success方法

    当dataType的值为json时,传入的值和返回的值符合json格式的时候,执行成功才会进入success方法,否则进入error方法.

  9. Redis分布式缓存

    Redis 主 slave 数据库优化-- 加inex, 分区 JVM调优--参数设置,比如偏向于计算的如何设置? 线程池:queue放满了之后,有什么方式能让他不拒绝掉?blockqueue就等在那 ...

  10. slot-scope

    插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示.以及怎样显示由父组件来决定. 实际上,一个slot最核心的两个问题在这里就点出来了,是显示不显示和怎样显示. 由于插槽是一块模板,所 ...