美文网首页编程it互联网知识点前端小院
手机端页面自适应解决方案—rem布局进阶版(附源码示例)

手机端页面自适应解决方案—rem布局进阶版(附源码示例)

作者: 梁相辉 | 来源:发表于2016-11-01 23:04 被阅读67263次

一年前笔者写了一篇 《手机端页面自适应解决方案—rem布局》,意外受到很多朋友的关注和喜欢。但随着时间的推移,该方案已然过时,故为大家介绍一个目前我极力推荐使用的,更加完美的方案——rem布局(进阶版)

另外:
  • 此方案仅适用于移动端web
  • 文章底部常见问题说明第四条,笔者已给出一个相当便捷的解决方案,欢迎留言交流。(2017/9/9)

该方案使用相当简单,把下面这段已压缩过的 原生JS(仅1kb,源码已在文章底部更新,2017/5/3) 放到 HTML 的 head 标签中即可(注:不要手动设置viewport,该方案自动帮你设置)

<script>!function(e){function t(a){if(i[a])return i[a].exports;var n=i[a]={exports:{},id:a,loaded:!1};return e[a].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var i={};return t.m=e,t.c=i,t.p="",t(0)}([function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=window;t["default"]=i.flex=function(normal,e,t){var a=e||100,n=t||1,r=i.document,o=navigator.userAgent,d=o.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i),l=o.match(/U3\/((\d+|\.){5,})/i),c=l&&parseInt(l[1].split(".").join(""),10)>=80,p=navigator.appVersion.match(/(iphone|ipad|ipod)/gi),s=i.devicePixelRatio||1;p||d&&d[1]>534||c||(s=1);var u=normal?1:1/s,m=r.querySelector('meta[name="viewport"]');m||(m=r.createElement("meta"),m.setAttribute("name","viewport"),r.head.appendChild(m)),m.setAttribute("content","width=device-width,user-scalable=no,initial-scale="+u+",maximum-scale="+u+",minimum-scale="+u),r.documentElement.style.fontSize=normal?"50px": a/2*s*n+"px"},e.exports=t["default"]}]);  flex(false,100, 1);</script>

代码原理

这是阿里团队的高清方案布局代码,所谓高清方案就是利用rem的特性(我们知道默认情况下html的1rem = 16px),根据设备屏幕的DPR(设备像素比,又称DPPX,比如dpr=2时,表示1个CSS像素由4个物理像素点组成)根据设备DPR调整页面的压缩比率(即:1/dpr),同时动态设置 html 的font-size为(50 * dpr),进而达到高清效果

有何优势

  • 引用简单,布局简便
  • 根据设备屏幕的DPR,自动设置最合适的高清缩放。
  • 保证了不同设备下视觉体验的一致性。(老方案是,屏幕越大元素越大;此方案是,屏幕越大,看的越多)
  • 有效解决移动端真实1px问题(这里的1px 是设备屏幕上的物理像素)

如何使用

重要的事情说三遍!
绝不是每个地方都要用rem,rem只适用于固定尺寸!
绝不是每个地方都要用rem,rem只适用于固定尺寸!
绝不是每个地方都要用rem,rem只适用于固定尺寸!
在相当数量的布局情境中(比如底部导航元素平分屏幕宽,大尺寸元素),你必须使用百分比或者flex才能完美布局!
看过 《手机端页面自适应解决方案—rem布局》的朋友,应该对rem有所了解,这里不再赘述,
此方案也是默认 1rem = 100px,所以你布局的时候,完全可以按照设计师给你的效果图写各种尺寸啦。
比如你在效果图上量取的某个按钮元素长 55px, 宽37px ,那你直接可以这样写样式:

.myBtn {
   width: 0.55rem;
   height: 0.37rem;
}

rem布局(进阶版)实践应用

iPhone5 下页面效果.png iPhone 6 Plus 下页面效果.png

为了让朋友们更清晰感受此方案的巨大优势,下面是源码和Demo

实践应用1(请在手机端或者手机模式下浏览效果更佳!)
实践应用2(请在手机端或者手机模式下浏览效果更佳!)
线上项目(请在手机端或者手机模式下浏览效果更佳!)
示例源码
在线Demo

常见问题说明,新手很有必要看一下(2017/1/19)

许多同学对该方案存在不少误解导致使用出现各种问题,这里统一回复下。

1.问:为啥手机网页效果图宽度是要640或者750的,我非得弄个666的不行咩?

答:老实说当然可以,不过为了规范,640或者750是相对合适的。
拿Iphone 5s 举例,它的css像素宽度是320px,由于它的dpr=2,所以它的物理像素宽度为320 × 2 = 640px,这也就是为什么,你在5s上截了一张图,在电脑上打开,它的原始宽度是640px的原因。
那 iphone 6 的截图宽度呢? 375 × 2 = 750
那 iphone 6 sp 的截图宽度呢? 414 × 3 = 1242
以此类推,你现在能明白效果图为什么一般是 640 ,750 甚至是 1242 的原因了么?(真没有歧视安卓机的意思。。。)

2.问:宽度用rem写的情况下, 在 iphone6 上没问题, 在 iphone5上会有横向滚动条,何解?

答:假设你的效果图宽度是750,在这个效果图上可能有一个宽度为7rem(高清方案默认 1rem = 100px)的元素。我们知道,高清方案的特点就是几乎完美还原效果图,也就是说,你写了一个宽度为 7rem 的元素,那么在目前主流移动设备上都是7rem。然而,iphone 5 的宽度为640,也就是6.4rem。于是横向滚动条不可避免的出现了。
怎么办呢? 这是我目前推荐的比较安全的方式:如果元素的宽度超过效果图宽度的一半(效果图宽为640或750),果断使用百分比宽度,或者flex布局。就像把等屏宽的图片宽度设为100%一样。

3.问:不是 1rem = 100px吗,为什么我的代码写了一个宽度为3rem的元素,在电脑端的谷歌浏览器上宽度只有150px?

答:先说高清方案代码,再次强调咱们的高清方案代码是根据设备的dpr动态设置html 的 font-size,
如果dpr=1(如电脑端),则html的font-size为50px,此时 1rem = 50px
如果dpr=2(如iphone 5 和 6),则html的font-size为100px,此时 1rem = 100px
如果dpr=3(如iphone 6 sp),则html的font-size为150px,此时 1rem = 150px
如果dpr为其他值,即便不是整数,如3.4 , 也是一样直接将dpr 乘以 50 。

再来说说效果图,一般来讲,我们的效果图宽度要么是640,要么是750,无论哪一个,它们对应设备的dpr=2,此时,1 rem = 50 × 2 = 100px。这也就是为什么高清方案默认1rem = 100px。而将1rem默认100px也是好处多多,可以帮你快速换算单位,比如在750宽度下的效果图,某元素宽度为53px,那么css宽度直接设为53/100=0.53rem了。

然而极少情况下,有设计师将效果图宽定为1242px,因为他手里只有一个iphone 6 sp (dpr = 3),设计完效果图刚好可以在他的iphone 6 sp里查看调整。一切完毕之后,他将这个效果图交给你来切图。由于这个效果图对应设备的dpr=3,也就是1rem = 50 × 3 = 150px。所以如果你量取了一个宽度为90px的元素,它的css宽度应该为 90/150=0.6rem。由于咱们的高清方案默认1rem=100px,为了还原效果图,你需要这样换算。当然,一个技巧就是你可以直接修改咱们的高清方案的默认设置。在代码的最后 你会看到 flex(false, 100, 1) ,将其修改成flex(false, 66.66667, 1)(感谢简友:V旅行指出此处错误! 2017/3/24)就不用那么麻烦的换算了,此时那个90px的直接写成0.9rem就可以了。

4.问:在此方案下,我如果引用了别的UI库,那些UI库的元素会显得特别小,如何解决?

答:可以这样去理解问题的原因,如果不用高清方案,别的UI库的元素在移动设备上(假设这个设备是iphone 5好了)显示是正常的,这没有问题,然后我们在这个设备上将该页面截图放到电脑上看,发现宽度是640(问答1解释过了),根据你的像素眼大致测量,你发现这个设备上的某个字体大小应该是12px,而你在电脑上测量应该是24px。

现在我们使用高清方案去还原这个页面,那么字体大小应该写为 0.24rem 才对!

所以,如果你引用了其他的UI库,为了兼容高清方案,你需要对该UI库里凡是应用px的地方做相应处理,即: a px => a*0.02 rem
(具体处理方式因人而异,有模块化开发经验的同学可使用类似的 px2rem 的插件去转化,也可以完全手动处理)


(2017/9/9更新)然而真实情况往往更为复杂,比如,你引入了百度地图(N个样式需要处理转换);或者你引入了一个
framework;又或者你使用了 video 标签,上面默认的尺寸样式很难处理。等等这些棘手问题

面对这些情况,此时我们的高清方案如果不再压缩页面,那么以上问题将迎刃而解。
基于这样的思路,笔者对高清方案的源码做了如下修改,即添加一个叫做 normal 的参数,由它来控制页面是否压缩。
在文章顶部代码的最后,你会看到 flex(false, 100, 1),默认情况下页面是开启压缩的。

如果你需要禁止压缩,由于我们的源码执行后,直接将flex函数挂载到全局变量window上了,此时你直接在需要禁止压缩的页面执行 window.flex(true) 就可以了,而rem的用法保持不变。

有一点美中不足的是,如果禁止了页面压缩,高清屏的1像素就不能实现了,如果你必须要实现1像素,那么自行谷歌:css 0.5像素,有N多的解决方案,这里不再赘述。

5.问:有时候字体会不受控制的变大,怎么办?

答:在X5新内核Blink中,在排版页面的时候,会主动对字体进行放大,会检测页面中的主字体,当某一块字体在我们的判定规则中,认为字号较小,并且是页面中的主要字体,就会采取主动放大的操作。然而这不是我们想要的,可以采取给最大高度解决

解决方案:

*, *:before, *:after { max-height: 100000px }

补充:有同学反映,在一些情况下 textarea 标签内的字体大小即便加上上面的方案,字体也会变大,无法控制。此时你需要给 textareadisplay 设为 table 或者 inline-table 即可恢复正常。(感谢 程序媛喵喵 对此的补充!2017/7/7)

6.问:我在底部导航用的flex感觉更合适一些,请问这样子混着用可以吗?

答:咱们的rem适合写固定尺寸。其余的根据需要换成flex或者百分比。源码示例中就有这三种的综合运用。

7.问:在高清方案下,一个标准的,较为理想的宽度为640的页面效果图应该是怎样的?

点击浏览:一个标准的640手机页面设计稿参考(没错,在此方案中,你可以完全按照这张设计稿的尺寸写布局了。就是这么简单!)

8.问:用了这个方案如何使用媒体查询呢?

一般来讲,使用了这个方案是没必要用媒体查询了,如果你必须要用,假设你要对 iphone5 (css像素宽度320px,
这里需要取其物理像素,也就是640)宽度下的类名做处理,你可以这样

@media screen and (max-width: 640px) {
    .yourLayout {
        width:100%;
    }
}
9.问:可以提供下这个高清方案的源码吗?
'use strict';

/**
 * @param {Boolean} [normal = false] - 默认开启页面压缩以使页面高清;  
 * @param {Number} [baseFontSize = 100] - 基础fontSize, 默认100px;
 * @param {Number} [fontscale = 1] - 有的业务希望能放大一定比例的字体;
 */
const win = window;
export default win.flex = (normal, baseFontSize, fontscale) => {
  const _baseFontSize = baseFontSize || 100;
  const _fontscale = fontscale || 1;

  const doc = win.document;
  const ua = navigator.userAgent;
  const matches = ua.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i);
  const UCversion = ua.match(/U3\/((\d+|\.){5,})/i);
  const isUCHd = UCversion && parseInt(UCversion[1].split('.').join(''), 10) >= 80;
  const isIos = navigator.appVersion.match(/(iphone|ipad|ipod)/gi);
  let dpr = win.devicePixelRatio || 1;
  if (!isIos && !(matches && matches[1] > 534) && !isUCHd) {
    // 如果非iOS, 非Android4.3以上, 非UC内核, 就不执行高清, dpr设为1;
    dpr = 1;
  }
  const scale = normal ? 1 : 1 / dpr;

  let metaEl = doc.querySelector('meta[name="viewport"]');
  if (!metaEl) {
    metaEl = doc.createElement('meta');
    metaEl.setAttribute('name', 'viewport');
    doc.head.appendChild(metaEl);
  }
  metaEl.setAttribute('content', `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);
  doc.documentElement.style.fontSize = normal ? '50px' : `${_baseFontSize / 2 * dpr * _fontscale}px`;
};
10.问:我在使用 rem 布局进阶方案的时候遇到了XXX的问题,如何解决?
  • 此方案久经考验,具有普遍适用性,自身出致命问题的情况很少,至少笔者是没遇到过。
  • 绝大多数你遇到的问题,都是由于对rem布局理解不到位导致的。本文对rem布局做了大量的解释说明,配置了若干 demo,你可以把你遇到的问题放到demo里测试。遇到问题时,首先问自己,为什么这明显的错误大家没遇到就我遇到了??
  • 如果你真的经过充分验证,比对,确实是rem布局自身出了问题,那么请私信我,把还原问题场景的 demo 或者文件发给我。谢谢!

相关文章

网友评论

  • _于曼丽_:这个代码可以通过 npm 安装么?
  • 0c96af0b9876:请问这个方案可以做web-view吗?
    我接在小程序上没问题,接在安卓app上就出现问题了
  • 43a846cb3185:如果用了这个高清方案,手机端banner轮播图的图片宽度至少要在1242以上,才不会出现左右留白?
    梁相辉:@松_327f 看文章底部常见问题第二条
  • 1f7219e3fa3c:使用这种方式在适配iPhone X等特殊屏幕上需要使用媒体查询的时候,min-width 和 min-height 得使用 devicePixelRatio * clientWidth 了
  • 9ef1ac5143d3:大家有没有发现一个问题, 这种rem布局在ios上进行 双击 操作, 页面会缩放? 怎么解决?
    9ef1ac5143d3:safra浏览器上
  • cytheria19900:实践应用链接在真机上浏览的时候,oppo手机明显比其他的手机小很多
  • 472d5e2dd907:这个和flexible.js的区别是什么?
  • 银河太空船:用ui框架,引入这个js,就会变得内容小,就犹如第四个答案解说,加入window.flex(true) 但是加入之后页面就炸了。用的sui框架。看来还是不能同时用,用这个最好的选择就是不用其他的框架,,手撸代码
  • 3ac7eaa71f59:2.问:宽度用rem写的情况下, 在 iphone6 上没问题, 在 iphone5上会有横向滚动条,何解?
    我的做法是多加了一个屏幕宽度来计算缩放系数,比如我是基于750的宽度已经适应了苹果6s,320 360上有横行滚动屏,就针对绽放系数进行修正一下。感谢楼主的贡献。
    w = r.documentElement.clientWidth,
    s = i.devicePixelRatio || 1;
    p || d && d[1] > 534 || c || (s = 1);
    var u = (1 / s) * (w / 375),
  • 9581317108ed:楼主你好,想问下在最新的火狐浏览器上模拟的,设备选的三星s6/s8,显示dpr都是4,发现一刷新整个页面的元素会变得巨大,换回iP7刷新就没问题,楼主有遇到这个问题吗,怎么解决的,感谢:+1:
  • 六翅兽:请问这个可以和bootstrap联合使用吗?
    梁相辉:@六翅兽 不能
  • ad772a745c5b:楼主,最近开发的一个项目,用这个方式开发的页面,在iphone8上图片显示异常 缩放倍数异常
    ad772a745c5b:@_minooo_ ios跟我说 图片显示异常 高度上会缩放到30%-40%
    梁相辉:@痞夫_a7ed 怎么个异常法?用文章里的demo测试下?
  • 281c70f764b4:楼主,此方案在用火狐浏览器模仿三星s5手机的时候,font-size还是150px。导致页面样式错乱。尺寸是360*640不应该是font-size:50px; 楼主能解释下吗,非常感谢
  • Tatinic:LZ讲了半天也没把阿里是怎么处理 viewport 讲明白.
    这个讲不明白其它的也白讲啊.
  • 84cef8881f88:ipad页面可以用吗?
    梁相辉:@LOVE鳾 当然可以,其实你可以先试试,再不济拿文章里的demo试试嘛
  • 84cef8881f88:楼主 如果要做ipad版本的应该怎么做啊
  • 35cdbe127b0b:大大我想问下,body的fontsize应该写多少?
    梁相辉:@swallow_9a16 个人更倾向于0.28rem
  • 已婚老男孩:你好 楼主 我用的rem布局,在安卓机上正常显示,苹果手机上字体就很小。。。。这个有什么解决方案么
    梁相辉:@已婚老男孩 文章里的demo也是这样么
  • a7005f230d79:楼主 引入插件的话 怎么办呢 插件的尺寸会变得别的小 还有引入供应商的东西单位都是用的px 引过来尺寸会变小 这种怎么解决呢
    梁相辉:@皮卡_53b1 文章底部常见问题第四条有解决方案
  • 果汁凉茶丶:楼主你好,我们知道手机可以设置字体大小,那修改手机字体大小引起字体偏大,文案换行等问题怎么处理?有的手机能修改显示模式会改变手机的物理像素,rem是否还能处理?
  • 我叫小阿伟:楼主你好 我加上那段js 然后我也遇见了 设置3rem 然后只有150px 我按照你说的 (在代码的最后 你会看到 flex(false, 100, 1) ,将其修改成flex(false, 66.66667, 1)) 我修改了还是不行,我看你写的demo 我看你也没修改这里。 还有我看你的demo外边为什么设置 10rem 求回答,困扰好几天了 不知道问题出在哪
    梁相辉:@我叫小阿伟 设置 3rem,看到150px和 设置flex里的参数完全是两码事,文章你再好好看看。至于最外层为什么是10rem,因为在电脑屏幕下直接浏览的话,页面太宽,不够美观,所以加了限制。
  • 946808ca3f6d:你好,很感谢你的源码,使用过程,有两个问题,一个是高清适配是安卓4.3以上,但是很多vivo,oppo手机,尽管已经是安卓4.3以上,但是高清适配依然不使用,甚至他们有时候不支持meta标签的缩放,还有一个问题是,当使用echart类似这样的绘图的时候 ,传入的值是不带单位的,他的源码也无法修改,是直接绘图或者写内联样式,有什么好的解决方案吗?
    梁相辉:@genius_bf2d 第一个问题,如果非要兼容那么低的版本,推荐你使用rem布局的老方案。第二个问题,参照文章底部常见问题的第四条。
  • GG93YN:这个方案在不同屏幕的图片高度自适应有问题吧,比如iphone5,6,7,x下面图片没问题,放在ipad图片横向拉伸,ipad也是移动端~
    梁相辉:@23年旧港 如果一定要去掉最大高度,让banner高度自适应就行了
    GG93YN:@_minooo_ demo有最大宽度max-width:10rem; 去掉后banner高度不变,图片会横向拉升
    梁相辉:@23年旧港 你拿我文章里的demo做测试了吗?
  • a9007864445a:我的效果图是1080的。。。怎么弄
  • 05b6aae8dde6:我在使用的时候,遇见效果图640*1136的,页面布局分上中下三部分,中间部分有按照效果图量取离上部分的一个margin-top值,最后展示效果底部的按钮在iphone5上已经看不到了,想问下楼主这个适配方案跟手机自带头部有没有关系
    梁相辉:@低调有内涵_abbb 看起来你是要全屏显示的,但是手机屏幕的比例是不同的,而你的效果图只有固定的一种比例,所以最好是放不下的页面滚动就好了。
  • 小鳄鱼的大哥哦:作者你好。用了你的适配方案之后,我引入了一个时间插件,但是插件的单位是px,所以插件,看起来特别得的小,看不清楚,于是我加上了禁止缩放页面的方法window.flex(true);发现插件还是很小,有什么解决办法吗
    梁相辉:@风吹_过往 :blush: 谢谢
    小鳄鱼的大哥哦:非常感谢作者提供的高清方案,问题得到了解决,希望作者能更多的分享自己的才能和想法
    梁相辉:如果执行了window.flex(true);发现插件还是很小,那只能说明该插件本身就没有对移动端做适配,解决方法,在常见问题的第四条:“所以,如果你引用了其他的UI库,为了兼容高清方案,你需要对该UI库里凡是应用px的地方做相应处理,即: a px => a*0.02 rem”
  • tuohuang:用媒体查询设置html的初始font-size;其他元素用rem这样也能实现不同分辨率屏幕设置不同字体大小,从而达到适配的目的,还可以通过font-size 保证大屏幕显示的内容更多,请问这样的解决方案会有什么问题吗
    tuohuang:@_minooo_ 谢谢您的回答
    梁相辉:@TtmSino 这样基本够用了,只是高清方案对于还原效果图表现力更好,比如1像素边框,比如小于12px的字体电脑浏览器上也能表现出来(我们知道电脑浏览器最小的中文字体是12像素),又比如 canvas 绘制图片问题,如果不用高清方案,绘制的图片会很模糊。
  • 423f9ff59005:为什么我把你的demo 拿过来 发现字体大小不会随着屏幕的宽变化而变化,我有写了一个div 高设置为1rem,打开后是100px 屏幕怎么缩放 都是100px,而我用你的第一篇文章的时候,高度是随着屏幕宽度变化而变化,请问这是怎么回事?
    423f9ff59005:@_minooo_ 我看了 把最外层设置为100% 可字体大小没变化
    梁相辉:你这个问题,,,看起来你根本就没看文章,解释都在文章里。:disappointed_relieved:
  • 信鑫_King:响应式的话,也可以用这个开发?
    信鑫_King:@_minooo_ 我是将 pc 的html、body font-size设置成了 100px,div设置 font-size: 0.16rem。不知这样会有什么问题
    梁相辉:@信鑫_King 响应式没必要的,毕竟响应式横跨电脑端和移动端,而这个方案只是用于移动端。
  • 2b5bf800d8fe:我用这方案写页面在手机浏览器和微信QQ都能正常显示,但是嵌入app里就放大的厉害。我也把评论从头到尾看了遍看到您说这方案不适用于APP,如果想在非浏览器中使用,需要修改这个全局变量为当前环境的全局变量。请问一下具体该怎样修改呀,不是很明白这句话,是要把window替换成什么吗?
    还有就是如果在app内真的不好用这方案,那您知道可以用什么方案替代此方案从而实现差不多的效果吗?
    最近刚接触移动端,很小白,希望能得到您的回答,谢谢了。:blush:
    梁相辉:@樂了乐乐 目前主流手机的宽度在320-450之间,所以一般情况下没必要使用媒体查询,毕竟不像pc端从960—1920的分辨率,媒体查询在这个情况下是有必要的。
    2b5bf800d8fe:@_minooo_ 但是手机不是有各种各样的尺寸嘛,连媒体查询这样的都不用吗:flushed: 不是要适配嘛
    梁相辉:如果是app,就用一般的px写法就可以了,完全满足需求。
  • 月痕影:一开始是没问题,不过刷新一下页面的话图片和文字等变小了
    梁相辉:@月痕影 文章里的demo是这样吗?
  • e427ef5c87ef:楼主有问题,想和你确定一下爱!!!阿里团队的新旧方案,①旧方案(屏幕越大,元素也越大【根据设备宽度/一个固定值,来实时改变html的字体大小】),②新方案(屏幕越大,看到的越多【也改变html的字体大小,但是很有限只有50px、100px、150px三个值;主要根据dpr来缩放页面,实现看到的越多】)。以上两种方案我的对么?那么如果采用新方案,dpr不变html的字体大小就不会变化是么?如iPhone4和iPhone5,他们的html的字体大小都是100px,这种方案如果字体也用rem的话,根据设计稿计算的出来的字体就会偏小,在iPhone 6sp上字体偏小就会更加明显!不能解决么?新旧方案不能融合么?
    梁相辉:@水目_55788 rem布局进阶能很好的还原效果图,至于字体偏大或是偏小那是效果图问题。至于效果图的规范文章里有相关说明。
    e427ef5c87ef:@_minooo_ 抱歉刚回来,看完你的文章我就顺手做了一个,因为我是plus所以字体偏小感觉很严重,https://shuimupj.github.io/remDemo/
    梁相辉:@水目_55788 文章看完最好动手实践,遇到问题再回头看文章的常见问题解答,多试几次就明白了
  • 6fc8d1661680:那这里的1rem=50px,100,或150,,表示的是物理像素还是逻辑像素啊?
    梁相辉:@FighGirl雯雯 当然是物理像素
  • 月痕影:高清方案图片有失真的情况啊
    梁相辉:@月痕影 我文章里的demo出问题了么
    月痕影:@_minooo_ 额,就是放在手机端下测试图片和字体都出了问题
    梁相辉:@月痕影 在什么情况下失真,嗯?
  • 秋夜已凉:最近也为rem布局头疼。我们项目中定一个了一个@r = 16/750 rem 然后开发时候都是 量取设计稿(750的稿) 中的尺寸(px单位) 然后乘以2再跟 @r相乘来做的。比如设计稿中一个div的宽度是10px 那我在写布局的时候就会写 width: 20 * @r 这样就达到效果了。楼主清楚这是应用的你的拿套方案吗? 另外我是从楼主第一套方案看过来的,感觉第一套方案比较好理解,屏幕越大对应的元素也相应变大,而这个进阶版的方案中 ‘应用了rem布局的元素在各个手机上的尺寸是一样的‘ 请问这合理吗? 我苹果4上看的一个div跟在苹果6Plus上显示的一样大小,这样好吗?合适吗?
    秋夜已凉:@_minooo_有道理,果然是进阶版。 我们看来我们项目中采用的还是楼主第一套那样的方案,随着设备的屏幕大小等比缩放来显示,屏幕大只是看的图标大而已,并没有多看到内容。楼主进阶版的方案果然很先进,或许后期也会改成这样的。虽然还是不太懂各种像素之间的区别和换算,但是感觉好神奇。。。。😂
    梁相辉:正因为应用了rem的元素大小固定,也实现了一开始说的“保证了页面效果在不同移动设备视觉的一致性。”
    纵观当前各大APP,你也会发现,它们的界面在不同尺寸设备上的字体大小,缩略图,也是基本一样的大小,故而屏幕越大,看的越多。
    为什么要这样?拿字体来说,假如最合适人眼阅读的字体大小是14px,在大屏幕上14px就不适合阅读了么,非得要“等比例放大”字体阅读才合适吗,答案显然是否定的,小屏幕也是同理。
    最后,该方案主要应用于移动端,目前主流设备的CSS宽度在320px~450px之间。所以元素固定大小不会对页面适配屏幕造成很大干扰。相反,它保证了页面视觉的一致性。
  • 拿着号码牌徘徊:iphone6、iPhone5 font-size没有变,都是100px,这不正确吧,是我搞错了,还是本来就这样
    梁相辉:@ziven先生 屏幕越大,看的越多才符合目前主流。尤其对于文字,假如适合人眼阅读的字体大小是14px,那么无论对大屏还是小屏,它都是一个合适的大小。至于布局,在该方案下,基本不会有什么影响,文章里的DEMO,你可以测试下。
    拿着号码牌徘徊:为什么不结合你第一种方案,只是针对dpi不是片面吗?苹果6和苹果5毕竟宽度不一样,font-size不变的话,布局就不一样了。是不是你的需求不一样?
    梁相辉:@ziven先生 iphone6 和 iphone 的dpi 都是2,6sp 是3.
  • 拿着号码牌徘徊:就是很很多框架UI,插件不兼容
  • af5905d754c6:请问这个能用在APP的嵌入页面中用吗?我是APP,有一个页面直接调用的web端的地址,那个地址页面就是采用的你这个种方法,浏览器中看没问题,微信中看也没有问题,在APP里面一调用,看着效果好吓人,是不能用吗?
    af5905d754c6:@_minooo_ 哦,好的,谢谢回复
    梁相辉:@lovebslq 不能用于APP
  • 阿波罗程序猿:lz 你好 我在贵公司在github上开源出来的dolife中项目提了几个问题。望回复 多谢
    梁相辉:http://www.jianshu.com/p/8e8ace90b671
  • 一曲折扇情_60ab:楼主此方法没加viewport,然后ip5的dpr为2,font-size是100px,6ps的dpr是3,font-size是150,所以才应对了那句“保证了不同设备下视觉体验的一致性。(老方案是,屏幕越大元素越大;此方案是,屏幕越大,看的越多)”吗?
    一曲折扇情_60ab:@_minooo_ 感谢回复~
    梁相辉:@一曲折扇情_60ab 新方案是根据设备情况,自动添加viewport的
  • 一曲折扇情_60ab:偷偷注册了账户,默默的为你点了关注,加油。
  • 343c81c22246:手淘的Flexible方案感觉会更完美一些...
    梁相辉: @Vitalik 实际上,高清方案是flexble的一个变种,不是很理解你说的使用高清方案,在不同设备上视觉差异很大。如果你指的是元素间隔有差异,你完全可以使用百分比或者flex布局。
  • 江可可_6a34:亲,用了这个后,好像就不能用 媒体查询了,媒体查询没有用了,是吗?
  • fb15ccf41f8f:块级元素里面包裹行内元素 css什么都不设置 为什么外层块级元素的高不是里面行内元素撑起来的高 而是全部都是131px?求解 谢谢!
    梁相辉: @丶WJun 把你还原问题的demo私信给我
    fb15ccf41f8f:@_minooo_ 去掉那段引入的JS就正常了 但是整体布局就缩小了 :no_mouth:
    梁相辉: @丶WJun 这种看似莫名其妙的问题极大可能是自己误操造成的,建议你审查下元素看看这个高度是谁给的
  • 轩轩小王子:您好,我这个出现了横向的滚动条,设计图是750,然后我页面的而每个div的 宽度也都没超过750,我把你上面的压缩代码flex(false,100, 1),1改成0.5没有了横向滚动条,但是页面整体变小了,请问这个问题怎么解决???
    梁相辉: @李卓轩小男孩 那就审查下具体是那个元素导致出现滚动条的,然后对其选择合适的布局策略,总之这种问题不是rem布局自身的问题
    轩轩小王子:@_minooo_ 我用了百分比布局,还有flex布局,还是会出现横向滚东条
    梁相辉: @李卓轩小男孩 常见问答第二条再认真看看吧,,
  • d117a7a2365b:<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    div{
    max-width:6.4rem;
    height:10rem;
    font-size:0.20rem;
    background:red;
    }


    </style>
    </head>
    <body>
    <div>
    看我编辑不变
    </div>
    </body>
    <script>
    !function(e){function t(a){if(i[a])return i[a].exports;var n=i[a]={exports:{},id:a,loaded:!1};return e[a].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var i={};return t.m=e,t.c=i,t.p="",t(0)}([function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=window;t["default"]=i.flex=function(normal,e,t){var a=e||100,n=t||1,r=i.document,o=navigator.userAgent,d=o.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i),l=o.match(/U3\/((\d+|\.){5,})/i),c=l&&parseInt(l[1].split(".").join(""),10)>=80,p=navigator.appVersion.match(/(iphone|ipad|ipod)/gi),s=i.devicePixelRatio||1;p||d&&d[1]>534||c||(s=1);var u=normal?1:1/s,m=r.querySelector('meta[name="viewport"]');m||(m=r.createElement("meta"),m.setAttribute("name","viewport"),r.head.appendChild(m)),m.setAttribute("content","width=device-width,user-scalable=no,initial-scale="+u+",maximum-scale="+u+",minimum-scale="+u),r.documentElement.style.fontSize=normal?"50px": a/2*s*n+"px"},e.exports=t["default"]}]); flex(false,100, 1);</script>


    </html>

    楼主你好。我这样写,然后手机端并没有随之比例改变,是哪里出了问题吗。求指导
    d117a7a2365b:@_minooo_ 我又试了几次。现在的情况是一开始打开页面不会正常加载。然后变成手机端测试,然后再刷新一下,才会正常显示。然后再次变成PC端,刷新一次还是会不正常
    d117a7a2365b:@_minooo_ <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    !function(e){function t(a){if(i[a])return i[a].exports;var n=i[a]={exports:{},id:a,loaded:!1};return e[a].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var i={};return t.m=e,t.c=i,t.p="",t(0)}([function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=window;t["default"]=i.flex=function(normal,e,t){var a=e||100,n=t||1,r=i.document,o=navigator.userAgent,d=o.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i),l=o.match(/U3\/((\d+|\.){5,})/i),c=l&&parseInt(l[1].split(".").join(""),10)>=80,p=navigator.appVersion.match(/(iphone|ipad|ipod)/gi),s=i.devicePixelRatio||1;p||d&&d[1]>534||c||(s=1);var u=normal?1:1/s,m=r.querySelector('meta[name="viewport"]');m||(m=r.createElement("meta"),m.setAttribute("name","viewport"),r.head.appendChild(m)),m.setAttribute("content","width=device-width,user-scalable=no,initial-scale="+u+",maximum-scale="+u+",minimum-scale="+u),r.documentElement.style.fontSize=normal?"50px": a/2*s*n+"px"},e.exports=t["default"]}]); flex(false,100, 1);</script>

    <style>
    div{
    max-width:6.4rem;
    height:10rem;
    font-size:0.20rem;
    background:red;
    }


    </style>
    </head>
    <body>
    <div>
    看我编辑不变
    </div>
    </body>



    </html>

    这样以后还是不对。。。是哪里出了问题
    梁相辉: @qzuser_7716 脚本位置放到head里,并且放到style之前
  • c2ba39de2523:demo里面body设置了font-size:0.24rem。这个是必须的么 设置有什么需要注意的地方
    梁相辉:@前端鞠亮 不是不必须的,最好给全局字体设置个默认值。需要注意的地方都写在文章里了
  • 8e22cc8647b6:我使用这段适配代码,发现静态页面上都能正常显示,但是,在测试环境中,对于某些手机浏览器(QQ浏览器、三星自带浏览器)有的字感觉并没有经过适配,普遍偏大,这是什么原因?是不是这段代码只针对大部分手机,并没有做到各种机型的dpr识别与适配?
    梁相辉:@乌梅菌 你这个问题在文章底部的常见问题说明第五条有相关介绍
  • 布蕾布蕾:大佬,关于meta标签设置那一块,initial-scale 应该等于1吧,而不是${scale}
    布蕾布蕾:@_minooo_ 还是不太理解,不知道自己究竟是那一块出了问题,也不知道为啥改成1就可以了,是不是有别的途径。:sob:
    布蕾布蕾:@_minooo_ 可是如果赋值scale,打包出的app在手机上,一点开就处于放大的状态啊。这个要怎么避免呢?我用的vue 打包用的cordova。在电脑chorme上模拟没问题,但是放到安卓模拟器、真机上就出现问题了。没办法,后来把initial-scale改正了1,就可以了。
    梁相辉:scale 是高清方案代码根据设备情况计算出的缩放值,赋值给 initial-scale 没毛病。
  • 8d83c748efeb:楼主,用这个js后,插件mobiscroll展示出来会有问题,插件中宽度,高度,滚动特效中的距离都是用px来计算的,导致插件显示效果很小都看不见了,可以在不改 插件的情况下单独在楼主你的js中给个 排除部分div或元素不根据你给的rem 布局设置吗?
    梁相辉:@蓝灵_0c50 文章底部第四条更新了一个解决方案,你尝试下。
    布蕾布蕾:这个插件,可以配合postcss-pxtorem使用,比较灵活,postcss-pxtorem规则是,如果30px写成大写,30PX就不转化为rem,也就是说,在自己写样式时候,可以通过这个控制是否转化为rem,进而,是否使用此插件。
  • 布蕾布蕾:大佬好,源码貌似没有你说的改动啊,比如flex(false, 100, 1),源码参数只有两个
    梁相辉:源码里也已经更新过了:wink:
    梁相辉: @布蕾布蕾 文章顶部,压缩版里改动了
  • 张张张啊先生:写的太好了
  • 张张张啊先生:注册只为给你评论点个赞
  • 28da3adbd754:用这代码,百度地图内容在手机上显示过小,该怎么解决啊
    梁相辉: @Anthony_4e55 文章底部常见问题第四条更新了一个很便捷的解决方案,你可以尝试下。
    梁相辉:@Anthony_4e55
    建议
    1. 参考文章底部常见问题第四条
    2. 在百度地图的页面去除rem js代码。
  • ae11bd1b4c4e:请问,我用这个方案做出的的页面为什么这么卡呢,手机端是6sp,请问这是什么原因,我真没有到的原因
    梁相辉:刚方案对页面性能影响微乎其微,找找其他原因吧。
  • 555a218d38cb:你好,这插件屏掉了媒体查询。有什么办法,可以同时使用媒体查询吗?
    比如:设计稿是750宽度,左边是180px,右边是570px。我设左右分别为1.8rem 和5.7rem。
    但右边5.7rem,在phone5下是放不完,会出现水平滚动条,在iphone 6s时,右边不占满屏幕。
    梁相辉:@yaya0775 比如你要媒体查询Iphone 5的尺寸,你可以
    @media screen and (max-width: 640px) {
    .yourLayout {
    width:100%;
    }
    }
  • 916f456bf946:字体出现问题了,变大收不下去
    梁相辉:@千城墨白_cbe6 文章底部的常见问题解答有对字体大小变大的解决方案。
  • 织雪纱奈:大神你的源码咋写的一个p div 文字都没看到
    梁相辉:@漫长的海岸线 用的React,一个如日中天的前端框架。
  • 0870f3fb6ba4:我把100改成200可以嘛,然后14px就等于0.14rem,这样不是方便吗?
    梁相辉:@0870f3fb6ba4 当然,怎么方便怎么来
  • 心挚:为什么body要设置 font-size: 0.24rem; 不设置的话图片 输入框布局都有问题
  • d2958351bf26:加入一个盒子已经设定了 2rem 3rem 不同屏幕下并没有发生变化?这是为什么呢? 还有750的图换算的时候还用除以2吗?
    梁相辉: @JackDon 为什么没有变化需要好好读文章,7850的图先按照文章默认的方式去写,根据实际效果再微调
  • 3ae7fe10ba4c:楼主,我们的设计稿是720*1280的,这个时候换算成rem的话是除以多少啊
  • 晨曦的暮光:icon图标用图片的话,怎么才能自适应那些用户端
    梁相辉:@晨曦的暮光 图片的尺寸用rem就行了
  • 09b732e01d7e:楼主你好,问下你用的什么html编辑软件啊?
    梁相辉: @互联狐狸 webstorm
  • 212e7df0b24d:老师,我想请问一下在ipad 其他平板上这方案也有效?
    梁相辉: @锅只是个炒饭 当然有效
  • c4a07077840c:想问下ipad上为什么尺寸好小, 刷新后 font-size 是100px,还望指点下该怎么处理,让ipad也能正常适配
    梁相辉:@剑兔 你也说了,改成2,字体都放大了。这就是影响。
    c4a07077840c:@_minooo_ 噢噢,这样啊,我把flex 改成2在ipad上显示字体什么的都放大了,这样会影响什么吗?
    梁相辉:你是用的谷歌浏览器的ipad模式测试的么? 如果是这样,记得把那个模式栏上的 75% 改成 100%就行了。
  • 方克己:为何我在我的项目中加入了你文章开始的那段代码,我在6p 或者7p下 整个页面都是缩小的。拿走那段代码就可以呢
    梁相辉: @烧开的汽水 因为你根本就没把文章看完理解
  • 0f15c204254c:楼主,这套适配方案对字体也是用rem吗,感觉你这多处都要设置font-size,挺麻烦的。
    没有类似pc端的一个默认大小14px?然后再针对一些特殊的做处理
    梁相辉:字体如果没有特殊需求,直接用rem问题不大。
    梁相辉:当然,body里直接设置个默认字体大小就可以了。
  • 579891a1d95f:小白问一下 看了好几遍有点疑问 你写的第四个提示 设计给的图是960那么这个的dpr是2吗
    梁相辉: @清江菇凉 暂且当成2来处理吧,有问题再说
  • 南陈_:请问写媒体查询无效了,怎么解??
    南陈_:@_minooo_ 嗯嗯,因为虽然设计稿是750,但是我们看设计图上是有标注好宽度的,所以我用这个就sass里所以宽度都*2才算是正常的,写媒体查询是有一点细节要调整,忘记*2了,谢谢~
    梁相辉: 另外此方案下一般不需要媒体查询的。
    梁相辉:比如你想媒体查询iphone 5宽度下的
    @media screen and (max-width: 640px){
    .app {
    color: red;
    }
    }
  • cc9e5fefd5fe:受益良多,作者老爷辛苦了,手动点赞!
  • znsw007:doc.documentElement.style.fontSize = `${_baseFontSize / 2 * dpr * _fontscale}px`;
    为什么 要 除以2 ?
    梁相辉:首先, _fontscale 这个参数默认为1,主要用于某些业务的比例缩放,暂且不管
    其次,乘以dpr 是为了中和页面缩放 1/dpr 带来的影响。
    最后,按照该方案的默认设定,你的效果图的元素尺寸比设备上的实际效果要大两倍,为了还原本来大小,必须除以2才行。
  • 94e4d0de9726:app内嵌页用手机浏览器,微信打开都没问题,但是放进app就无法识别屏幕大小,不自适应了,怎么解决
    梁相辉:该方案不适用于app
  • f80b1099f3f7:请教个问题,项目在某小米手机qq内打开,布局错乱,之后打开dome如图http://chuantu.biz/t5/133/1499937308x3080481231.png,检查发现是initial-scale=0.5无效,此手机只能设置initial-scale=1。我想问有什么方案能排除initial-scale无效的浏览器不使用缩放嘛?
    梁相辉:@幻V不知 那就自己找个平衡点调试下了,期待你的新发现。
    f80b1099f3f7:@_minooo_ 改为537的话确实可以,不过现在基本安卓手机都没大于537的吧,这样就等于把安卓手机都放弃这个高清布局了呀,感觉不好看了
    梁相辉:代码里有个 534 的数字,你改为537,再试试。
  • 遨游在bug中:挺好,就是在ipad下,不会自适应了,得把最外面包裹div的max改成100%或者去掉,不知道会不会有后遗症:smile:
    梁相辉:@写代码不存在的 不会有后遗症的,之所以demo上宽度做了限制,是因为电脑端浏览器太宽了,影响体验,虽说这最终是要展示在移动端的。
  • 1377884bd6b4:想了解你这个单页面是用什么技术做的 能否参考下
    梁相辉:@没冠希有关系 react官方有 creat-react-app,国内有阿里的dva,这些适合快速上手。也可以自己动手搭架子,不过就比较费精力了。
    1377884bd6b4:@_minooo_ 请问楼主 react做单页面 使用什么移动端框架好了
    梁相辉:https://github.com/minooo/React-Study
  • 夏晗默:第一,楼主很有耐心,有的问题要是我连回答都不想回答,还有好多人问的都是重复的问题,明明自己多看看多想想多折腾一下就可以自行解决了。
    第二,放在一年前我可能也是那些连demo,还有你底部写的注意就随便看看就问你问题的,哈哈。
    梁相辉:@夏晗默 是的,信息爆炸的时代,每个人内心多少都会浮躁。
  • 88675e9a81f8:楼主说的固定尺寸指的是哪方面的?
    梁相辉:你平时使用px的地方,就用rem替代就行了。
  • 88675e9a81f8:楼主,ui给我的图是750的,我在用楼主给的这个rem.js的时候,是直接将测量的数据除以100吗还是要缩小一倍后再除以100?
    梁相辉:直接除以100就可以了。
  • 一袭白衣染:还是不明白为什么font-size要乘于2 ;;


    我之前都是这样写的
    document.documentElement.style.fontSize = $(document.documentElement).width()/3.2 + 'px';
    $(window).on('resize', function() {
    document.documentElement.style.fontSize = $(document.documentElement).width()/3.2 + 'px';
    });

    貌似也没啥问题啊 , 也不用乘2,
    望大神指点下
    一袭白衣染:@_minooo_ 谢谢 楼主热心的解答; 还有一个问题就是 document.documentElement.style.fontSize = $(document.documentElement).width()/3.2 + 'px'; 我 之前都是这样写的,我这样写 有什么弊端吗 ?
    梁相辉:你可以不乘以2,只要能解决问题。之所以乘以2,在dpr=1时,一个字体12px是可以接受的,而该方案下,由于默认dpr=2,页面scale 就会缩放至1/2,所以之前12px的字体,需要设为24px才和dpr=1时候的尺寸一样的。
  • 156ac20b115b:你好,之前用的旧版的代码,写好了样式,现在把旧的替换成这个新的了,可是现在的字体都变的特别小了
    梁相辉:@幻V不知 是在真机上测试的么?
    f80b1099f3f7:发现有的机型边框.01rem没有显示,我猜可能是因为font-size小于100px,而这个机型又小于1px的边框不显示,请问有遇到过这种嘛
    梁相辉:能不能先看看这篇文章的使用说明呢朋友?
  • 255e9f0f8b1d:楼主,我有个问题。我在真机上测试,发现0.01rem在有些手机上(目前我测试的是魅族手机上)看不见,需要设置成0.02rem。并没有解决1px的问题啊 就连你的demo在谷歌跟2345浏览器上都有这个问题,谷歌上font-size是100px(100X0.01=1),2345浏览器上是50px(50X0.01=不显示) ,同一台机子上为什么font-size会不一样? 这0.01rem该怎么解决?
  • 1c0817ad422b:终于发现这个方案的缺陷了,在调用谷歌地图的时候,地图被缩放得很小很小😭
    1c0817ad422b:@JaneSir 我临时解决方案就是,在有地图的页面不用该方案。。。
    33dc16b06b92:那怎么办呢!!!
  • sf1991:rem用于固定尺寸是什么意思,能一句话说出这个rem布局,淘宝的那个有什么用吗,是为了解决什么问题的吗,我之前用百分比也好好的啊。
    梁相辉: @s_d2db 设计图设计问题,14号字体在苹果6上阅读很合适,难道在苹果四上就不合适了么?至于整体协调问题可以参考文章demo在不同设备上的展示效果
    sf1991:“无论在什么显示设备下你量取这个元素的尺寸大小都是一样的。”这肯定不行啊,不符合逻辑啊,iphone6上2厘米的按钮合适,但是如果iphone4上还是2厘米就显得很大了,整体不协调了,肯定不行啊,我用px就没事,大小不管在哪里看都是协调的,你现在说要一致,用尺子量一致,怎么会有这种需求。是不是我理解错了啊?
    梁相辉:意思就是,假如你手边有个量尺,在该方案下用了rem的元素大小,无论在什么显示设备下你量取这个元素的尺寸大小都是一样的。这符合当今的需求,这保证了效果图在各设备上显示的一致性。如果你觉的百分比用的挺好的话也可以继续用,直到有需求了再考虑这个。
  • fontDuan:博主 不建议文字都用rem,标题类的可以,但是内容类的最好用px,可以做下面的完善
    源码后面添加以下代码:
    var dpr = window.devicePixelRatio;
    document.getElementsByTagName('html')[0].setAttribute('data-dpr', dpr)
    然后在用sass定义mixin
    @mixin font-dpr($font-size) {
    font-size: $font-size;
    [data-dpr="2"] & {
    font-size: $font-size * 2;
    }
    [data-dpr="3"] & {
    font-size: $font-size * 3;
    }
    }
    这样就能做到字体的适配 个人拙见
    梁相辉:首先为你这个建议点赞,对本文介绍的布局方案是一个很好的补充。
    但是,在本文介绍的这个高清方案下,字体大小使用rem也是没有问题的。
    所以我对此的态度是,除非你在项目中遇到字体大小必须使用px才能解决某些需求,再使用你提供的这个方案也不迟。
    对大多数人而言,字体大小用rem足够了。
    再次感谢你提供的这个方案!
  • 06c0ae45e968:楼主 用了这个方案后,再使用swiper时,再chrom浏览器下查看,页面特别模糊,swiper-slide里面有字体。还有,使用这个方案,iscroll也不能用,好像是没有viewport的原因,这个应该是iscroll的问题
    梁相辉:@小明_3ab1 页面模糊不要紧,在真机上绝不会模糊的。iscroll 不能用是不可能的,因为我就在用iscroll。再好好看看,检查下。
  • 159d14e744d5:楼主,我用你的方案实现微信公众号,引用了一个日期插件mobiscroll,我把里面的样式里的px全部替换为rem(用了正确的倍数手动更改),但在i6plus上显示有问题,实在不会了。。楼主可以解答下吗?或者楼主有针对这趟方案的日期插件吗?我可以付费的 项目紧急呢
    梁相辉:@缘来不是你_7846 em不用改,但是内联的涉及到px的也需要改 - - 总之,就是这样
    159d14e744d5:@_minooo_ 我就按这样修改的,但他还涉及一些内联样式和em单位
    梁相辉:@缘来不是你_7846 举个例子,原来样式是 12px,修改后需要是 0.24rem 才是正常的。
  • fa17636c450c:奇怪刚接触这个 我给一个div宽度设置为6.4rem 所有手机都是640px?
    梁相辉:@Striver_2901 元素的宽度如果要用rem,最好不超过3.2rem。因为rem的尺寸都是固定的,对于大宽度元素你可以使用百分比或者flex解决,文章里这点已经说过很多次,你可以参考下文中demo的布局方式。
    fa17636c450c:@_minooo_ 你的意思 是 較大的DIV 用padding :rem margin:rem就行了 其他固定大小的用REM?
    梁相辉: @Striver_2901 你问题的答案我已经尽最大努力在文章中解释说明了🙃
  • wgj416416:设计出的pad版设计图(768),那尺寸能直接除以100么?
    梁相辉: @wgj416416 这要看设计师依据的标准是什么了,一般来说直接除以100是没有问题的
  • 159d14e744d5:你好,再次来提问,我用楼主这个方案实现微信公众号购票的前端界面编写,当用电脑端打开微信操作时,浏览窗口拖动他的布局就变了呢,有什么办法吗?
    梁相辉:先用文章的demo做下测试,如果demo没问题,那就是你的使用问题,重新思考,继续看文章或者把你问题的demo网址发来。
  • 94b5ffa9c912:以前是按640来除以百分比 现在这个高清方案是按多少来除的?高清方案的源码里没有提是多少
    梁相辉:@curryhh 那就实践下吧,文章已经尽最大努力讲解了。
    94b5ffa9c912:@_minooo_ 问题是我不懂这核心 更别说设计师了
    梁相辉:如果你真正理解了这个方案的核心思想,就会发现,效果图宽度是多少对前端来说已经不重要(对设计师还是挺重要的,因为ta做完图还要拿到真机上预览调整),因为你只需要按照你看到的尺寸去布局就可以。
  • 111113dac38b:楼主,你写的那个轮播的js可以发我么?
    梁相辉:@明年今日_09ac 自己实践下,文章给了大量的解释和demo,遇到问题时再回过头来看。
    111113dac38b:@_minooo_ 哦哦,好的,我还想问一下楼主,就是如果ui是按照iphone6来设计尺寸的,那我的那些宽度、高度、字体大小计算起来还需要减半吗?因为之前用rem布局的时候,这些尺寸都是按照ui设计稿尺寸的一半来设置的,不知道这个进阶是否是一样呢?
    梁相辉:轮播用的 antd-mobile ,一个React组件库。
  • 111113dac38b:楼主,我想问一下就是如果使用了你的这个js,有的时候是不是后端人用别人的插件的时候会跟这个js设置的有冲突?
  • 46115cda3911:微信上字体大小用rem变小是怎么回事
    梁相辉:首先你的这个问题是我的demo的问题,还是你自己项目的问题,如果是后者,请参照我的demo的做法,以及文章底部的常见问题说明。
  • 8e2edb2d8c54:楼主您好,我看到你楼下提供的高清方案的源码是react写的,有原生js写的吗
    梁相辉:@yaya0775 源码使用了ES6的语法,你也许需要转成es5才行。另外,源码只是导出了模块并未调用。
    555a218d38cb:引用压缩版js生效,但把原生放到js文件来引用,发现不起作用,是什么原因呢?
    梁相辉:@知了_e517 没有影响的,React只是个前端框架。而这个布局方案只是样式上的设置而已。
  • 85cf89f52079:页面放入SVG文件 SVG制作的图不能缩放 跟这个JS代码有冲突 怎么破啊???
    85cf89f52079:@_minooo_ 请问下这个百分比怎么设置?是给页面上那个元素设置呢?
    梁相辉:rem是固定尺寸,你想随着屏幕缩放需要设置百分比
  • f80b1099f3f7:楼主问个问题,我使用这个方案布局,750的设计稿上边框都是1px,这样到了苹果6的手机上因为页面缩放了0.5倍,边框会很模糊,是否边框对应设置为0.02rem更合适。不知道楼主注意过没有
    f80b1099f3f7:@_minooo_ 恩,我注意到了。浏览器里面很模糊,到真机上面不会
    梁相辉:@幻V不知 你确定此方案下的1px边框很模糊,确认是拿的真机测试的??不存在的朋友,此方案完美解决1px问题,你可以把我的demo放到你的苹果6上看看1px边框!
    f80b1099f3f7:发现好像设计稿的视觉效果也一样的问题,设计稿也是很模糊,哎,可能是我近视眼太严重
  • f227f7a365ff:你好 如果页面font-size必须为14px 我应该怎么办 :grin:
    梁相辉:@rsglz_z 你的问题,本文已经做了最大努力给出了详尽的解释和demo,如果还不明白那就多看一遍,动手写写,体会体会。
    f227f7a365ff:@_minooo_ 什么意思 在哪改 为什么是0.28呢??你好 ,我就是因为看了你的自适应 ,可是公司里的font-size为14px;也就是那个100px不能用,所以我不知道那段核心代码怎么改?能说详细一点吗 谢谢
    梁相辉:@rsglz_z 那就 font-size: 0.28rem
  • 银河太空船:不要手动设置viewport,意思是<meta name ="viewport" content ="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 这句话不写吗?
    93bcc806e570:楼主我的这句话,是这样的<meta name ="viewport" content ="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">,何解?
    银河太空船:@_minooo_ 谢谢
    梁相辉:@麋鹿不是鹿 是的,不写。
  • 27b37c14fbf0:在华为手机还有模拟器中 app里面打开获取宽度好像有问题 导致布局变大 楼主的测试源码也实验过还是一样变大了
    梁相辉:这方案只适用于浏览器环境,因为里面用到了全局变量window。如果想在非浏览器中使用,你需要修改这个全局变量为当前环境的全局变量。理论是这样,你试试。

本文标题:手机端页面自适应解决方案—rem布局进阶版(附源码示例)

本文链接:https://www.haomeiwen.com/subject/jhtvuttx.html