浅谈移动端的自适应问题——响应式rem/em利用js动态实现移动端自适应

书山有路      2022-02-08     598

关键词:

  随着3G的普及,越来越多的人使用手机上网。移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页?本篇文章将讲述自适应网页设计的概念和方法,使网页开发人员维护同一个网页代码,即可使网站在多种设备上具有更好的阅读体验。本文详细介绍了自适应网页的实现方法,希望能给迷惑的你带来帮助。

  一. 在HTML的头部加入meta标签

    在HTML的头部,也就是head标签中增加meta标签,告诉浏览器网页宽度等于设备屏幕宽度,且不进行缩放,代码如下:

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

 

     简单分析一下这一行代码的含义:width=device-width表示网页的宽度等于设备屏幕的宽度,initial-scale=1.0表示设置页面初始的缩放比例为1,user-scalable=no表示禁止用户进行缩放,maximum-scale=1.0 和 minimum-scale=1.0 表示设置最大的和最小的页面缩放比例。因为各大浏览器对meta标签的解析程度不一样,所以我们要尽可能的去兼容所有浏览器。

 

  二. 百分比布局

    在页面布局中,相对宽度和绝对宽度相结合来进行布局,将更有利于网页的可维护性。

    下图分别是拉勾网在iPhone5、iPhone6和iPhone 6 Plus下的布局,可以看到随着设备的屏幕宽度不同,即使是同一套网页代码显示出来的字体大小以及间隔也都不一样。红线框内部分就是使用了百分比布局的做法,对于网页的可维护性将更好。

                     

 

  三.  响应式页面的实现

    目前一般常见的实现响应式有两种方法,一种是利用媒体查询,另外一种是bootstrap下的栅格布局,以后介绍bootstrap的时候来介绍栅格布局,这里主要来说一下如何利用媒体查询实现响应式布局。

    媒体查询,即 @media 查询,媒体查询可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设计响应式的页面,@media 是非常有用的。当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。因为是设置样式,所以将媒体查询相关的代码放在css文件的最下方即可。

    为了更加清晰地理解响应式的用法,我在下方列举了两个案例。第一个案例比较简单,实现了在不同的页面宽度中改变body的背景颜色的作用。第二个案例以具体的项目来举例,更加方便用户

实例1:

如果页面宽度小于 300 像素,则修改body的背景颜色为红色:

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

 如果页面宽度大于 300 像素并且小于600像素,则修改body的背景颜色为绿色:

@media screen and (min-width: 300px) and (max-width:600px) {
    body {
         background-color:green;
    }
}

如果页面宽度大于 600 像素,则修改body的背景颜色为蓝色:

@media screen and (min-width: 600px) {
    body {
         background-color:blue;
    }
}

 

代码解释:

  screen 表示电脑屏幕,平板电脑,智能手机等,min-width和max-width 用于定义设备中页面的最小和最大宽度。

 

实例2:视觉中国首页(http://www.shijue.me/)的响应式实现

  首先来看该页面在不同窗口中的展示效果:

  在窗口宽度大于1200px时候的页面样式如下:

 

  在窗口宽度大于900px并且小于1200px时候页面样式如下:

 

当页面宽度小于900px时候页面样式如下:

 

接下来我们来看具体的代码实现:

  html代码如下:注意有几张图片则写几个col

<div class="group_wrap">
    <div class="group">
        <div class="col">
            <div class="img_logo">
                <img src="img/8.jpg" alt="">
            </div>
        </div>
        <div class="col">
            <div class="img_logo">
                <img src="img/9.jpg" alt="">
            </div>
        </div>
    </div>
</div>

 

css代码如下,默认是页面宽度大于1200px时候的页面:

.group_wrap{
    width: 100%;
    overflow: hidden;
}
.group{
    width: 1200px;
    margin: 0 auto;
    overflow: hidden;
}
.col{
    width: 280px;
    margin: 10px;
    float: left;
}
.img_logo{
    padding: 10px;
    background: white;
}

 

 实现响应式代码如下,放在css文件的最下方即可:

/*当页面的宽度在900px ~ 1200px之间的时候*/
@media screen and (min-width: 900px) and (max-width: 1200px){
    .group{
        width: 900px;
    }
}
/*当页面的宽度在600px ~ 900px之间的时候*/
@media screen and (min-width:600px) and (max-width: 900px){
    .group{
        width: 600px;
    }
}

 

总结:实际上响应式页面的实现非常简单,只要认真学,经常练,一定可以熟练掌握的!

 

  

四. 页面使用相对字体

  在我们平常的网页布局过程中经常使用绝对单位像素(px)来进行布局,这样的布局不适合我们自适应网页的实现,所以我们现在来介绍两种常见的绝对单位em和rem。rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。

  1. 相对长度单位em

      em的特点 : ① em的值并不是固定的; ② em始终会继承父级元素的字体大小。

      废话不多说,直接上代码:

html代码:

<div class="one">
    <span>第一层</span>
    <div class="two">
        <span>第二层</span>
        <div class="three">
            <span>第三层</span>
        </div>
    </div>
</div>

 

css代码:

body{
    font-size: 20px;
}
.one{
    font-size: 1.5em;
}
.two{
    font-size: 0.5em;
}
.three{
    font-size: 2em;
}
结果: 
   .one ---> 30px 1.5 * 20 = 30px
   .two ---> 15px 0.5 * 30 = 15px
   .three ---> 30px 2 * 15 = 30px

代码分析:
  em会继承父级元素的字体大小,对于大多数浏览器而言,如果没有给body字体大小,则默认为16px,所以对于class名称为 one 的div而言,它的父亲是body,所以 1em = 16px; 本案例中规定了body的字体大小为20px,所以对于 .one 而言,1em = 20px ,那么 1.5em = 30px。所以 one 的 font-size 为30px。
  对于class名称为 two 的div而言,它的父亲是 one ,因为em会继承父级的元素的字体大小,所以 1em = 30px, 那么 0.5em = 15px,所以 two的 font-size为15px。
  对于class名称为 three 的div而言,它的父亲是 two ,因为em会继承父级的元素的字体大小,所以 1em = 30px, 那么 0.5em = 15px,所以 two的 font-size为15px。

 

    2. 相对长度单位rem 

      rem是CSS3新增的一个相对单位(root em,根em),这个单位引起了广泛关注。这个单位与em有什么区别呢?区别在于使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。

      我们来看下面的例子:

html代码:

<div class="one">
    <span>第一层</span>
    <div class="two">
        <span>第二层</span>
        <div class="three">
            <span>第三层</span>
        </div>
    </div>
</div>

css代码:

html{
    font-size: 20px;
}
.one{
    font-size: 1.5rem;
}
.two{
    font-size: 0.5rem;
}
.three{
    font-size: 2rem;
}
结果: 
   .one ---> 30px 1.5 * 20 = 30px
   .two ---> 10px 0.5 * 20 = 10px
   .three ---> 40px 2 * 20 = 40px

 代码分析:

      rem是css3中引进的新单位,rem的值始终相对于根元素html中设置的font-size大小,如果没有设置,则在大多数浏览器中默认为font-size为16px,那么1rem = 16px;

所以对于class名称为one的div而言,1.5rem = 1.5 * 20 = 30px。其他的类似,不再一一赘述。

 

 

    关于em和rem的总结:

    “em”是相对于其父元素来设置字体大小的,这样就会存在一个问题,进行任何元素设置,都有可能需要知道他父元素的大小,在我们多次使用时,就会带来无法预知的错误风险。而rem则相对就好用很多了,就我所在的公司而言,在实际的项目开发中用rem的情况也是非常多的。估计在不久的将来,国内的设计师将会和国外的设计师一样,爱上rem。

 

  五. Js动态设置rem来实现移动端字体的自适应

    实际上讲了这么多,大家可能已经了解了rem的用法,但是还不了解如何利用rem去实现移动端的自适应。说到底,rem实现移动端自适应的原来在于它本身的特性,它可以始终根据根元素的字体大小去改变自己的值。目前各种常见手机的屏幕尺寸大小如下图所示:

           

  

  我们想实现手机端自适应,就是可以让页面的元素字体、间距、宽高等属性的属性值可以随着手机屏幕尺寸的变化而变化,接下来我们看如何利用Js来动态的设置rem并实现移动端的自适应,Js代码如下:

//获取html元素
var html = document.getElementsByTagName('html')[0]; 
//屏幕的宽度(兼容处理)
var w = document.documentElement.clientWidth || document.body.clientWidth;
//750这个数字是根据你的设计图的实际大小来的,所以值具体根据设计图的大小
html.style.fontSize = w / 750 + "px";

 

  以上代码实现了利用Js获取设备屏幕的宽度,并根据屏幕的宽度动态改变根元素html的font-siz属性的作用。比如说,对于iphone6而言,屏幕尺寸为750,那么在iPhone6下html的font-size为1px,所以1rem = 1px;对于iPhone5而言,屏幕尺寸为640,那么在iPhone5下html的font-size为640/750 = 0.85333px,所以1rem = 0.85333px。这样的话即使我们对一个元素设置同样的大小和单位,也会在不同的设备下显示不同的大小。比如说div{width:100rem},在iPhone6下它的宽度将等于100px,而在iPhone5下它的宽度等于100 * 0.85333 = 85.333px。这样我们就真正实现了移动端的自适应,怎么样,是不是很简单呢!

  如果大家有任何疑问,可以给我留言,我会及时回复大家,祝大家学习进步,工作顺利!

  

 

静态自适应流式响应式

...面的宽高是固定的,超出页面的内容用户手动拖拽。手机端的话,另外设计一套。自适应布局:用媒体查询(@media)根据不同屏幕定义不同的宽高,比静态布局少了用户手动拖拽的几率。(因为媒体查询范围不能做到无穷的刚刚... 查看详情

浅谈web自适应

浅谈Web自适应2016-08-13 前端大全 前端大全(点击上方公众号,可快速关注我们) 来源:卖烧烤夫斯基链接:www.cnblogs.com/constantince/p/5708930.html 前言  随着移动设备的普及,移动web在前端工程师们的工作中占有... 查看详情

移动端自适应处理页面布局

处理页面大概会有若干种方案:第一种就是使用bootstrap;自己使用自适应单位常用的rem,em,及别人封装好的插件flexble.js;在使用flexble.js;时发现两个问题,高度没有很好的展现,有时会比设计稿低,会造成页面扁平不好看,第二种就... 查看详情

响应式布局

...是:html5/css3响应式布局是利用css3的media媒体查询功能。移动端一般都是对css3支持比较好的高级浏览器不需要考虑响应式布局的媒体查询media兼容问题。    一个普通的自适应显示的三栏网页,当你用不同的终端来查看这个... 查看详情

响应式布局

响应式布局就是一套代码的开发能使得网页适应移动端和电脑端,响应式主要是根据屏幕的尺寸来改变网页的一些布局,但是缺点就是不适合有太复杂结构的网页在响应式里,我们需要在mate中加上适配移动端的代码<metaname="vie... 查看详情

css怎么自适应宽度

怎么让右边的边框移动到箭头指的位置?就是文字有多宽,那个边框就有多宽的代码怎么写?图上的css代码是#dsadsa border:1pxsolid#00CC66; height:auto; width:auto;}css自适应宽度有2种方式:1.是通过百分比来控制宽度;2.可以通过块状元... 查看详情

我应该如何使用 createJs 创建响应式画布以适应不同的移动设备屏幕?

】我应该如何使用createJs创建响应式画布以适应不同的移动设备屏幕?【英文标题】:HowshouldIcreatearesponsivecanvaswithcreateJstoadaptdifferentmobiledevice\'sscreens?【发布时间】:2015-04-1112:28:58【问题描述】:我想开发一款html5手机游戏。如... 查看详情

html5响应式(自适应)网页设计

自适应丨Html5响应式(自适应)网页设计目录自适应丨Html5响应式(自适应)网页设计第一步:在网页代码的头部,加入一行viewport元标签第二步:(注意)不使用绝对宽度,字体大小第三步:(注意)字体大小第四步:流动布局... 查看详情

响应式布局学习笔记

...整时,使用横向和竖向的滚动条来查阅被遮掩部分;对于移动设备,单独设计一个布局,使用不同的域名如wap.或m.。   适应布局(Adaptive Layout)自适应布局(Adaptive) 查看详情

html5----响应式(自适应)网页设计

现在,很多项目都需要做响应式或者自适应的来适应我们不同屏幕尺寸的手机,电脑等设备,那么就需要我们在页面上下功夫,下面我就来说一下如何做响应式(自适应)的网页设计 1、在网页代码的头部,加入一行viewport元... 查看详情

html5----响应式(自适应)网页设计

现在,很多项目都需要做响应式或者自适应的来适应我们不同屏幕尺寸的手机,电脑等设备,那么就需要我们在页面上下功夫,下面我就来说一下如何做响应式(自适应)的网页设计 1、在网页代码的头部,加入一行viewport元... 查看详情

java自适应响应式网站源码ssm生成静态化手机平板pc

前台:支持四套模版,可以在后台切换系统介绍:1.网站后台采用主流的SSM框架jspJSTL,网站后台采用freemaker静态化模版引擎生成html2.因为是生成的html,所以访问速度快,轻便,对服务器负担小3.网站前端采用主流的响应式布局,... 查看详情

Bootstrap 4 模态中的 Cloudinary 响应式图像以适应移动屏幕

】Bootstrap4模态中的Cloudinary响应式图像以适应移动屏幕【英文标题】:CloudinaryresponsiveimageinBootstrap4modaltofitmobilescreen【发布时间】:2020-12-0621:54:46【问题描述】:我想在Bootstrap4模式弹出窗口中使用Cloudinary图像。模态弹出窗口在桌... 查看详情

响应式和自适应

很多人容易把【响应式设计】和【自适应】混为一谈,认为都是适配不同的终端,然而他们两个是有本质的区别。响应式设计的目标对象是PC端和Mobile端web页面,设计师出一张图,告诉开发人员,在PC上要显示哪些内容,在Mobile... 查看详情

响应式网站与自适应网站比较

Adaptivewebsite(自适应网站)      应对在浏览器的宽度变化不调整网页元素的位置,缩放网页元素,以适应在可用空间。Responsivewebsite (响应式网站)    应对在浏览器的宽度变化通过调整... 查看详情

vue项目中利用锁控制页面响应式布局(代码片段)

...就是页面布局跟随屏幕分辨率自动变化。响应式布局跟自适应布局不一样。自适应布局就是用百分比来定义页面内各布局元素,在屏幕分辨率发生变化时,不至于错位。而响应式布局更强一些,其布局会跟随屏幕分辨... 查看详情

vue项目中利用锁控制页面响应式布局(代码片段)

...就是页面布局跟随屏幕分辨率自动变化。响应式布局跟自适应布局不一样。自适应布局就是用百分比来定义页面内各布局元素,在屏幕分辨率发生变化时,不至于错位。而响应式布局更强一些,其布局会跟随屏幕分辨... 查看详情

用bootstrap框架能不能开发手机端页面

...uery的一种JS框架属于网页开发脚本,不能做APP但是可以做移动端的网页,bootstrap有响应式布局可以再手机、平板和台式端以网页的形式显示。参考技术ABootstrap移动设备优先:自Bootstrap3起,框架包含了贯穿于整个库的移动设备优... 查看详情