移动端常用的几种适配方案

目录

一、媒体查询

1.1 媒体查询的优劣势

1.2 媒体查询的应用场景

二、媒体查询+rem

2.1 如何进行等比缩放?

2.2 如何在前端开发中应用等比缩放这个计算公式?

2.3 应用实例

三、JS动态计算当前屏幕每一份大小(推荐)

四、JS动态计算当前屏幕每一份大小以及考虑像素(推荐)

4.1 什么是设备像素和CSS像素? 

4.2 设备像素和CSS像素什么时候不一样?

4.3 如何解决设备像素和CSS像素不一样的问题?

4.4 如何缩小?


一、媒体查询

1.1 媒体查询的优劣势

优势:

简单、哪里不对改哪里

调整屏幕宽度时不用刷新页面即可响应式展示

特别适合对移动端和PC端维护同一套代码的时候

劣势:

由于移动端和PC端共同使用同一套代码,因此代码量较大、维护不方便

为了兼顾大屏幕或高清设备,会造成其他设备资源浪费,特别是加载图片资源的时候

为了兼顾移动端和PC端各自响应式的展示效果,难免会损失各自特有的交互方式


1.2 媒体查询的应用场景

对于比较简单(页面不复杂)的网页,诸如:企业官网、宣传单页等,我们可以通过媒体查询、伸缩布局、Bootstrap来实现响应式特点

对于比较复杂(界面复杂)的网页,诸如:电商、团购等,更多的是PC端一套代码,移动端一套代码

示例:

        * {
            margin: 0;
            padding: 0;
        }
        
        .top {
            position: relative;
        }
        
        .top>img {
            width: 100%;
            height: auto;
        }
        
        .top>p {
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 33px;
            font-size: 16px;
            color: #fff;
        }
        
        .middle,
        .bottom {
            position: relative;
            height: 124px;
        }
        
        .main {
            border: 1px dashed #0d7efb;
            border-radius: 5px;
            padding: 4px;
            display: inline-block;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
        }
        
        .main>img:nth-of-type(1) {
            width: 175px;
            height: 116px;
            vertical-align: bottom;
        }
        
        .main>img:nth-of-type(2) {
            width: 35px;
            height: 35px;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 25px;
        }
        
        .bottom {
            margin-top: 14px;
        }
        
        @media screen and (min-width:375px) {
            .top>p {
                font-size: 18px;
                top: 40px;
            }
            .middle,
            .bottom {
                height: 143px;
            }
            .bottom {
                top: 17px;
            }
            .main>img:nth-of-type(1) {
                width: 206px;
                height: 135px;
            }
            .main>img:nth-of-type(2) {
                width: 42px;
                height: 42px;
                top: 30px;
            }
        }
        
        @media screen and (min-width:414px) {
            .top>p {
                font-size: 20px;
                top: 43px;
            }
            .middle,
            .bottom {
                height: 160px;
                padding: 5px;
            }
            .bottom {
                top: 19px;
            }
            .main>img:nth-of-type(1) {
                width: 227px;
                height: 150px;
            }
            .main>img:nth-of-type(2) {
                width: 45px;
                height: 45px;
                top: 35px;
            }
        }
    <div class="top">
        <img src="./img/bg.png" alt="">
        <p>实名验证</p>
    </div>
    <div class="middle">
        <div class="main">
            <img src="./img/back.png" alt="">
            <img src="./img/add.png" alt="">
        </div>
    </div>
    <div class="bottom">
        <div class="main">
            <img src="./img/back.png" alt="">
            <img src="./img/add.png" alt="">
        </div>
    </div>

iphone6/7/8

iphone6/7/8plus

 

补充:判断是PC端还是移动端


        // 声明浏览器用于 HTTP 请求的用户代理头的值。
        // let userAgentInfo = navigator.userAgent;
        // console.log(userAgentInfo);

        function isPc() {
            let userAgentInfo = navigator.userAgent;
            //判断是不是移动ios端
            if (/iphone/i.test(userAgentInfo)) {
                return false;
            }
            // 判断是不是移动android端 
            else if (/android/i.test(userAgentInfo)) {
                return false;
            }
            // 否则就是PC端
            return true;
        }
        // console.log(isPc());

        if (!isPc()) {
            location.href = "http://m.jd.com";
        }


二、媒体查询+rem

2.1 如何进行等比缩放?

  •     将设计图片等分为指定份数,求出每一份的大小

       例如: 750设计图片分为7.5份, 那么每一份的大小就是100px

  •    将目标屏幕也等分为指定份数,求出每一份的大小

       例如: 375屏幕也分为7.5份, 那么每一份的大小就是50px

  •     用原始元素尺寸 / 原始图片每一份大小 * 目标屏幕每一份大小 = 等比缩放后的尺寸

       例如: 设计图片上有一个150*150的图片, 我想等比缩放显示到375屏幕上

       那么: 150 / 100 * 50 = 1.5*50 = 75px


2.2 如何在前端开发中应用等比缩放这个计算公式?

  • 目标屏幕每一份的大小就是html的font-size: 50px
  • 使用时只需要用 "原始元素尺寸 / 原始图片每一份大小rem" 即可

                      150 / 100 = 1.5 / 1.5rem

                      1rem = 50px  / 1.5rem === 1.5*50 = 75px


2.3 应用实例

  1. 网易新闻:

        750/100=7.5

        375/7.5=50;

        320/7.5=42.7;

        2.苏宁易购

        750/50=15

        375/15=25

        320/15=21.33

示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>移动端常用适配方案二</title>
    <style type="text/less">
        * {
            margin: 0;
            padding: 0;
        }
        
        @media screen and (max-width: 320px) {
            /* 750 / 7.5 = 100 320 / 7.5 = 42.67 iphone5: */
            html {
                font-size: 42.67px;
            }
        }
        
        @media screen and (min-width: 375px) {
            /* 750 / 7.5 = 100 375 / 7.5 = 50 iphone6: */
            html {
                font-size: 50px;
            }
        }
        
        @media screen and (min-width: 414px) {
            /* 750 / 7.5 = 100 414 / 7.5 = 50 iphone6Plus: */
            html {
                font-size: 55.2px;
            }
        }
        
        .top {
            position: relative;
        }
        
        .top>img {
            width: 100%;
            height: auto;
        }
        
        .top>p {
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 80/100rem;
            font-size: 36/100rem;
            color: #fff;
        }
        
        .middle,
        .bottom {
            position: relative;
            height: 290/100rem;
        }
        
        .main {
            border: 1px dashed #0d7efb;
            border-radius: 5/100rem;
            padding: 10/100rem;
            display: inline-block;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
        }
        
        .main>img:nth-of-type(1) {
            width: 410/100rem;
            height: 270/100rem;
            vertical-align: bottom;
        }
        
        .main>img:nth-of-type(2) {
            width: 84/100rem;
            height: 84/100rem;
            vertical-align: bottom;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 60/100rem;
        }
        
        .bottom {
            margin-top: 35/100rem;
        }
    </style>
    <script src="js/less.js"></script>
</head>

<body>
    <div class="top">
        <img src="images/bg.png" alt="">
        <p>实名认证</p>
    </div>

    <div class="middle">
        <div class="main">
            <img src="images/back.png" alt="">
            <img src="images/add.png" alt="">
        </div>
    </div>

    <div class="bottom">
        <div class="main">
            <img src="images/back.png" alt="">
            <img src="images/add.png" alt="">
        </div>
    </div>

</body>

</html>

 


三、JS动态计算当前屏幕每一份大小(推荐)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>11-移动端常用适配方案三</title>
    <script>
        /*
        注意点: 通过JS动态计算当前屏幕每一份大小的好处: 不用写很多的媒体查询
                坏处: 切换了屏幕尺寸之后需要刷新界面才有效
                      而媒体查询如果切换了屏幕的尺寸不需要重新刷新界面
        * */
        document.documentElement.style.fontSize = window.innerWidth / 7.5 + "px";
    </script>
    <style type="text/less">
        *{
            margin: 0;
            padding: 0;
        }
        /*
        1.计算设计图片每一份大小: 750 / 7.5 = 100px
        2.计算当前屏幕每一份大小: 当前屏幕宽度 / 和设计图相同的分数 = 当前屏幕每一份大小
        */
        
        .top{
            position: relative;
        }
        .top>img{
            width: 100%;
            height: auto;
        }
        .top>p{
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 80/100rem;
            font-size: 36/100rem;
            color: #fff;
        }
        .middle, .bottom{
            position: relative;
            height: 290/100rem;
        }
        .main{
            border: 1px dashed #0d7efb;
            border-radius: 5/100rem;
            padding: 10/100rem;
            display: inline-block;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
        }
        .main>img:nth-of-type(1){
            width: 410/100rem;
            height: 270/100rem;
            vertical-align: bottom;
        }
        .main>img:nth-of-type(2){
            width: 84/100rem;
            height: 84/100rem;
            vertical-align: bottom;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 60/100rem;
        }
        .bottom{
            margin-top: 35/100rem;
        }
    </style>
    <script src="js/less.js"></script>
</head>
<body>
<div class="top">
    <img src="images/bg.png" alt="">
    <p>实名认证</p>
</div>

<div class="middle">
    <div class="main">
        <img src="images/back.png" alt="">
        <img src="images/add.png" alt="">
    </div>
</div>

<div class="bottom">
    <div class="main">
        <img src="images/back.png" alt="">
        <img src="images/add.png" alt="">
    </div>
</div>

</body>
</html>


四、JS动态计算当前屏幕每一份大小以及考虑像素(推荐)

4.1 什么是设备像素和CSS像素? 

  • 设备像素又称为物理像素, 是"物理屏幕"上真实存在的发光点,只有屏幕一经出厂就固定不会改变
  • CSS像素又称为逻辑像素,是编程世界中虚拟的东西, 我们通过代码设置的像素都是逻辑像素

例如: 

iPhone3G/iPhone3GS   3.5英寸/ 逻辑像素320*480 / 设备像素320*480

iPhone4/4S                    3.5英寸/ 逻辑像素320*480 / 设备像素640*960

 也就是说CSS像素和设备像素在有的时候是不一样的


4.2 设备像素和CSS像素什么时候不一样?

在PC端,1个CSS像素往往都是对应着电脑屏幕的1个物理像素,所以我们无需关心PC端的CSS像素和设备像素

在手机端,最开始其实1个CSS个像素也是对应着手机屏幕的1个物理像素,但是后来一个改变世界的男人(乔布斯)改变了这一切~

    从iPhone4开始,苹果公司推出了所谓的retina视网膜屏幕。

    iPhone4的屏幕尺寸却没有变化,但是像素点却多了一倍

这就导致了在1个CSS个像素等于1个物理像素的手机上, 我们设置1个CSS像素只会占用1个物理像素,而在1个CSS个像素不等于1个物理像素的手机上, 我们设置1个CSS像素就会占用2个物理像素,所以仔细观察你会发现同样是1像素但是在retina视网膜屏幕的手机上会粗一些

参考资料:

https://segmentfault.com/a/1190000015736900

https://ask.csdn.net/questions/692608



4.3 如何解决设备像素和CSS像素不一样的问题?

如果设备像素和CSS像素一样, 那么无需处理不会带来任何负面影响
如果设备像素是CSS像素的2倍, 那么我们只需将CSS像素缩小一半即可
但是有时候设备像素可能是CSS像素的3倍/4倍...

获取设备像素比DPR(Device Pixel Ratio)
        DPR = 设备像素 / CSS像素
        iPhone3GS :  320 / 320 = 1
        iPhone4S:    640 / 320 = 2
        iPhone678:   750 / 375 = 2
        iPhoneX:     1125 / 375 = 3
在JS中我们可以通过 window.devicePixelRatio 获取当前的设备像素


4.4 如何缩小?

通过 <meta name="viewport">的initial-scale属性来缩小
注意点: 缩放视口后视口大小会发生变化
       


示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>移动端常用适配方案四</title>
    <script>
        // console.log(1.0 / window.devicePixelRatio); // 1 / 1 = 1;  1 / 2 = 0.5;
        let scale = 1.0 / window.devicePixelRatio;
        let text = `<meta name="viewport" content="width=device-width, initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}, user-scalable=no">`;
        document.write(text);

        document.documentElement.style.fontSize = window.innerWidth / 7.5 + "px";
    </script>
    <style type="text/less">
        *{
            margin: 0;
            padding: 0;
        }
        .top{
            position: relative;
        }
        .top>img{
            width: 100%;
            height: auto;
        }
        .top>p{
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 80/100rem;
            font-size: 36/100rem;
            color: #fff;
        }
        .middle, .bottom{
            position: relative;
            height: 290/100rem;
        }
        .main{
            border: 1px dashed #0d7efb;
            border-radius: 5/100rem;
            padding: 10/100rem;
            display: inline-block;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
        }
        .main>img:nth-of-type(1){
            width: 410/100rem;
            height: 270/100rem;
            vertical-align: bottom;
        }
        .main>img:nth-of-type(2){
            width: 84/100rem;
            height: 84/100rem;
            vertical-align: bottom;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 60/100rem;
        }
        .bottom{
            margin-top: 35/100rem;
        }
    </style>
    <script src="js/less.js"></script>
</head>
<body>
<div class="top">
    <img src="images/bg.png" alt="">
    <p>实名认证</p>
</div>

<div class="middle">
    <div class="main">
        <img src="images/back.png" alt="">
        <img src="images/add.png" alt="">
    </div>
</div>

<div class="bottom">
    <div class="main">
        <img src="images/back.png" alt="">
        <img src="images/add.png" alt="">
    </div>
</div>

</body>
</html>

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白小白从不日白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值