可爱的rem

简介: 前端开发中,移动端的开发可以说是举足轻重了,可是又面临着不同设备尺寸和分辨率的尴尬点。今天[2018-09-16]台风山竹登陆广东,来势汹汹,外出是不可能的了,那就宅着写写这篇小文章吧...

前端开发中,移动端的开发可以说是举足轻重了,可是又面临着不同设备尺寸和分辨率的尴尬点。今天[2018-09-16]台风山竹登陆广东,来势汹汹,外出是不可能的了,那就宅着写写这篇小文章吧...


超长的前奏


说到移动端的响应布局,你也许会想到:


1. 使用CSS3媒体查询的方法


body {
  background: yellow;
}
@media screen and (max-width: 400px) {
  body {
    background: red;
  }
}


image.png


嗯,这种的样式的工作量超级大,因为要对图片和文字等资源针对不同的尺寸进行设置。一种凉凉的感觉从心底飘过~~~12


2. 直接使用百分比


这种方法比较适合移动端上,页面图片铺满宽度屏幕的运营推广活动的情况。因为在设计的时候会有一个750px的宽等等设计规范,能够很好的适配到不同手机啦。然后工作就是切图了...


#percent{
  width: 100%;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
#percent .item{
  flex: 1;
}
#percent .item img{
  display: block;
  width: 100%;
  height: auto;
}


image.png


这种切图比较费力,如果认真看上面的gif图的话会发现是三张同等宽高的图片,在chrome上的调试器上看是有白条的,不过不影响。因为在真机上是不存在的。如果不是切图宽度等分的情况下,那就不建议这种百分比的适配方法了。


3. 固定宽度


这种方法比较适合PC端开发,在移动端是必须不能才去的。因为移动端的宽度足够,能够带来足够好的体验,并且最重要的一点是其像素比是1啊。在缩放的时候不会带来内容变形的体验。如果到移动端上面,那就呵呵了~


#container{
  width: 680px;
  background: yellow;
  margin: 0 auto;
}
h1{
  text-align: center;
}


image.png


4. 使用viewport


移动设备上的viewport是设备屏幕上用来显示网页的那部分区域,再具体一点就是浏览器上用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域大,也可能比浏览器的可视区域小。


这得要在网页的head标签上面设置meta,比如:


<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">


嗯,这个知识点还是一丢丢的,详细的内容参考菜鸟教程:响应式 Web 设计 - Viewport。 本博文的重点不是这个~


是的,我们可以使用REM来进行适配啊:可以说是目前最强的移动端适配方案...


rem是什么


rem和em单位一样,都是一个相对单位,不同的是em是相对于父元素的font-size进行计算,rem是相对于根元素htmlfont-size进行计算的,这样一来rem就完美的绕开了复杂的层级关系,实现了类似em单位的功能。默认情况下,浏览器给的字体大小是16px,按照转化关系16px = 1rem


咦,都是固定了根元素是默认16px了,如何设备不同的移动设备呢?


问题提出也是答案所在,我们动态改变根元素html的字体默认大小不就行了嘛!见下:


rem自适应处理方案


使用rem布局的时候,为了兼容不同的分辨率,我们应该要动态的修正根字体的大小,让所有的用rem单位的子元素跟着一起缩放,从而达到自适应的效果。


嗯,下面就是动态改变根字体的大小了,采取的当然是javascript来进行控制啦,不然怎么知道像素比哦。


一种是获取像素比【像素比=物理像素/逻辑像素】通过devicePixelRatio,其兼容性在ie上要在11及11+,兼容性良好。罢了,不讨论IE浏览器了,看者慎用IE...


(function(){
  var devicePixelRatio = window.devicePixelRatio || 1;
})();


嗯,在移动端上面适配,rem和viewport搭配效果更佳哦!完整代码片段如下:


<head>
  <meta name="viewport" />
</head>


(function(){
  var fontSizeMatchDeviceWidth = function(){
    var deviceWidth = document.documentElement.clientWidth || window.screen.width || 320,
      devicePixelRatio = window.devicePixelRatio || 1,
      fontSize = (Math.ceil(deviceWidth * 16 / 320)),
      scale = 1 / devicePixelRatio; // 默认的缩放
    document.documentElement.style.fontSize = fontSize + 'px';
    document.querySelector('meta[name="viewport"]').setAttribute('content','width=device-width,initial-scale='+'scale'+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no,viewport-fit=cover'); // 增加viewport-fit=cover适配iphone x
  };
  (function(){
    var ua = navigator.userAgent;
    if(/android/i.test(ua) || /ipad|itouch|iphone/i.test(ua)|| /tianqi/i.test(ua)){
      fontSizeMatchDeviceWidth();
    } else { // pc端优雅降级
      document.documentElement.style.fontSize = '24px';
    }
  })();
})();


在上面的基础上,添加点点样式,完整的一个demo走一下:


#container{
  background: yellow;
  margin: 0 auto;
}
h1{
  text-align: center;
}


image.png

相关文章
|
5天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
390 93
|
6天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
5天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
394 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
5天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
278 158
|
13天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。