解决flexible.js 在安卓中1px问题

1.Flexible原理

  • 1.1设置viewport
    通过设置scale将viewport宽度设置为实际的设备物理宽度, css里的1px就等于实际物理设备1px。
    例如iphone6 设备像素比devicePixelRatio=2,flexible设置的meta信息如下:
<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

iphone6没有设置scale之前(375px) x (667px),1个css像素由2 x 2个物理像素构成,设置scale之后viewport大小为(750px) x (1334px),iphone6是二倍屏,从而实现css1px等于实际1px。1px就是设备展示的最小单位了。通常ui给的1px就是物理设备的最小单位(下图中红色部分标注的部分),flexible很好的实现了在iphone上的1px线条,直接设置height: 1px即可。


image.png
  • 1.2 设置rem
    Flexible将屏幕宽度等分10份,html元素上的font-size设置为1rem, 1rem = 屏幕宽度 / 10, 例如iphone6中1rem = 750px / 10 = 75px, css需要将px转化为rem, 从而实现不同屏幕的适配。

2. 安卓下1px问题

Flexible只处理了IOS机型,非iOS机型还是采用传统的scale=1.0,原因是在于安卓手机不一定有devicePixelRatio属性,以及devicePixelRatio的不规范,导致Flexible放弃治疗。所以在安卓的高清屏幕上1px显示比较粗,例如安卓3倍屏,1px会用3行物理像素点展示如下图所示。比ios的1px宽了许多。


image.png

解决方案:判断若为安卓机型,给html添加样式如下

// flexible.js
function retina () { // android高分辨率屏幕处理
    if (navigator.userAgent.toUpperCase().indexOf('IPHONE OS') !== -1) return; 
    var classNames = [];
    var pixelRatio = window.devicePixelRatio || 1;
    classNames.push('pixel-ratio-' + Math.floor(pixelRatio));
    if (pixelRatio >= 2) {
        classNames.push('retina');
    }
    var html = document.getElementsByTagName('html')[0];
    classNames.forEach(function (className) {
        html.classList.add(className);
    });
  }

...
// css文件
.border {
   ...
   height:1px;
   html.pixel-ratio-2 & {
     transform: scaleY(0.5)
   }
   html.pixel-ratio-3 & {
      transform: scaleY(0.3)
   }
}

ps:在iphone下设置0.5px(小于最小的物理像素单位)依然有线条展示,在android下设置0.5px是不会展示的。
为什么小于最小的物理像素单位还会展示线条呢?
其实展示的依然是最小的物理像素单位,不同的浏览器处理小于1px的方式不同,有些采用四舍五入,有些大于某个值展示1px否则就不展示,有些只是线条的颜色变浅了,从视觉上看就变细了。对比处理效果如下图所示。

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 一些基本概念 viewport 视窗 在桌面浏览器中,viewport就是浏览器窗口的宽度高度。但在移动端设备上,...
    Cruyun阅读 1,578评论 0 2
  • 在移动互联网快速发展的今天,手机的种类和尺寸越来越多,作为前端的小伙伴们可能会越来越头疼,但又不得不去适配一款又一...
    keenjaan阅读 26,784评论 9 86
  • 本文来自尚妆前端团队南洋发表于尚妆github博客,欢迎订阅。 移动端H5页面rem缩放方案flexible.js...
    尚妆产品技术刊读阅读 2,565评论 1 12
  • 好长时间没写写东西了,忙完了工作又忙孩子,如实静不下心做个整理了!最近发生了大大小小的好多事!最让我感动的是孩她爸...
    天格燕子阅读 112评论 0 0
  • 每天都有关注心蓝老师,看见夏天的绝配冰淇淋,就忍不住也画了。 草稿这样 一点点上色 不要小看上色,要好几种颜色叠加...
    谦玥儿阅读 319评论 0 0