前端大屏适配几种方案

2024-02-26 1369阅读

温馨提示:这篇文章已超过401天没有更新,请注意相关的内容是否还可用!

       记录一下前端大屏的几种适配方案。

我们是1920*1080的设计稿。

文章目录

  • 一、方案一:rem+font-size
    • 1.查看适配情况
      • 1.1 1920*1080情况下
      • 1.2 3840*2160(4k屏)情况下
      • 1.3 7680*2160 超宽屏下
      • 二、方案二:vw(单位)
      • 三、方案三:scale(缩放)强烈推荐
        • 1、根据宽度比率进行缩放
        • 2、动态计算
          • 2.1、超宽屏最终适配效果

                   大屏是适配是前端开发必不可少的技能,适配各种大屏也是为了给用户更好的体验。


            一、方案一:rem+font-size

                   动态设置HTML根字体大小和body字体大小,会使用到lib-flexible.js插件

            lib-flexible.js

            (function flexible(window, document) {
              var docEl = document.documentElement
              var dpr = window.devicePixelRatio || 1
              // adjust body font size
              function setBodyFontSize() {
                if (document.body) {
                  document.body.style.fontSize = (16 * dpr) + 'px'
                }
                else {
                  document.addEventListener('DOMContentLoaded', setBodyFontSize)
                }
              }
              setBodyFontSize();
              function setRemUnit() {
                var rem = docEl.clientWidth / 24
                docEl.style.fontSize = rem + 'px'
              }
              setRemUnit()
              // reset rem unit on page resize
              window.addEventListener('resize', setRemUnit)
              window.addEventListener('pageshow', function (e) {
                if (e.persisted) {
                  setRemUnit()
                }
              })
              // detect 0.5px supports
              if (dpr >= 2) {
                var fakeBody = document.createElement('body')
                var testElement = document.createElement('div')
                testElement.style.border = '.5px solid transparent'
                fakeBody.appendChild(testElement)
                docEl.appendChild(fakeBody)
                if (testElement.offsetHeight === 1) {
                  docEl.classList.add('hairlines')
                }
                docEl.removeChild(fakeBody)
              }
            }(window, document))
            

            我们可以将它下载下来。打开js文件,将设计稿的宽度(1920px)平均分成24等份,每一份为80px。将这个值设置为html字体大小,既1rem = 80px; 24rem = 1920px。


            tips:rem是根据html字体大小来计算的,假如html字体为16px,则1rem就等于16px;

            前端大屏适配几种方案

                   在移动端通常会分成10份,PC端分成24份。

                   安装cssrem插件,根节点的字体大小设置为80px。这个是px单位转rem的参考值。

            前端大屏适配几种方案

            配置插件的基准值:

            前端大屏适配几种方案

            这样的话放我们在书写px的适合,这个插件就会自动帮我们转化成rem。

            
              
                
                
                
                Document
                
                  * {
                    margin: 0;
                    padding: 0;
                  }
                  body {
                    width: 24rem;
                    height: 13.5rem;
                    border: 3px solid red;
                    box-sizing: border-box;
                  }
                  ul {
                    display: flex;
                    flex-direction: row;
                    flex-wrap: wrap;
                    width: 100%;
                    height: 100%;
                  }
                  li {
                    width: 33.333%;
                    height: 50%;
                    font-size: 0.375rem;
                    list-style: none;
                    border: 3px solid green;
                    box-sizing: border-box;
                  }
                
              
              
                
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6

            1.查看适配情况

            1.1 1920*1080情况下

            前端大屏适配几种方案

            1.2 3840*2160(4k屏)情况下

            3840也是分成24等份:3840 / 24 = 160

            前端大屏适配几种方案

            1.3 7680*2160 超宽屏下

            超宽屏情况下只显示了上半部分,这种适配方式比较适合16:9的情况下使用,后面会有其他方案解决这个问题。

            前端大屏适配几种方案

            二、方案二:vw(单位)

                  直接使用vw单位,屏幕宽度默认为100vw,那么100vw = 1920px;1vw = 19.2px。这个也是使用cssrem插件,直接将body的宽高(1920px * 1080px),将px转成vw单位。

            前端大屏适配几种方案

            这种方案和第一个方案类似,超宽屏的情况下也是不能全部显示。


            
              
                
                
                
                Document
                
                  * {
                    margin: 0;
                    padding: 0;
                  }
                  body {
                    width: 100vw;
                    height: 56.25vw;
                    border: 3px solid red;
                    box-sizing: border-box;
                  }
                  ul {
                    display: flex;
                    flex-direction: row;
                    flex-wrap: wrap;
                    width: 100%;
                    height: 100%;
                  }
                  li {
                    width: 33.333%;
                    height: 50%;
                    font-size: 1.5625vw;
                    list-style: none;
                    border: 3px solid green;
                    box-sizing: border-box;
                  }
                
              
              
                
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6

            三、方案三:scale(缩放)强烈推荐

                  很多的大屏适配都是使用的这种方案。

            这种方案的原理就是根据宽高比例进行缩放。

            1、根据宽度比率进行缩放

            (宽度比率=网页当前宽度/设计稿宽度)

                // 设计稿:1920 * 1080
                // 1.设计稿尺寸
                let targetWidth = 1920;
                // 2.拿到当前设备(浏览器)的宽度
                // document.documentElement  获取html的宽度
                let currentWidth =
                  document.documentElement.clientWidth || document.body.clientWidth;
                // 3.计算缩放比率(屏幕过宽,根据高度计算缩放比例)
                let scaleRatio = currentWidth / targetWidth; 
                // 4.开始缩放网页
                document.body.style = `transform: scale(${scaleRatio})`;
              
            

                  上面这种根据宽度比例进行缩放的,针对1920 * 1080,3840 * 2160(4k)是没有问题的,但是在超宽屏的情况下还是存在只显示一半的问题。

            分析原因:

            我们的设计稿:
            1920 * 1080 => 要适配 (1920*2=3840, 1080*2=2160, 4k屏) 3840 * 2160
            也要适配=> ( 1920*4 = 7680 : 1080 * 2 = 2160) 7680 * 2160 
            我们当前是根据宽度比率进行缩放的:
            先设配3840 * 2160
            scaleRatio = 3840 / 1920  = 2
            根据这个缩放比率
            我们的设计稿宽高都会被缩放两倍
            1920 * 2 = 3840
            1080 * 2 = 2160
            设配7680 * 2160
            scaleRatio = 7680 / 1920  =  4
            根据这个宽度比例我们的设置稿宽高都会被缩放4倍
            1920 * 4 = 7680
            1080 * 4  = 4240 
            这个原先的比例是 4 : 2,现在变成了 4 :4 ,这也是为什么我们只看到一半高度的原因。 
            

            2、动态计算

                  动态计算网页宽高比,决定是按照宽度的比例还是高度的比例进行缩放。

              
                // 设计稿:1920 * 1080
                // 1.设计稿尺寸
                let targetWidth = 1920;
                let targetHeight = 1080;
                let targetRatio = 16 / 9; // 宽高比率 (宽 / 高)
                // 2.拿到当前设备(浏览器)的宽度和高度
                let currentWidth =
                  document.documentElement.clientWidth || document.body.clientWidth;
                let currentHeight =
                  document.documentElement.clientHeight || document.body.clientHeight;
                // 3.计算缩放比率(屏幕过宽,根据高度计算缩放比例)
            		// 若currentWidth是4k屏宽度 3840 除于 我们设计稿的宽度 1920  3840/1920 = 2
            		// 这样页面就行进行2倍缩放
                let scaleRatio = currentWidth / targetWidth; // 参照宽度进行缩放(默认情况下)
            		
                // 当前页面宽高比例,当页面越宽currentRatio值就越大
                let currentRatio = currentWidth / currentHeight;
            		
            		// 判断是根据宽度进行缩放,还是根据高度进行缩放
                if (currentRatio > targetRatio) {
                  // 根据高度进行网页的缩放
                  scaleRatio = currentHeight / targetHeight; // 参照高度进行缩放(屏幕很宽的情况下)
                  document.body.style = `transform: scale(${scaleRatio}) translateX(-50%)`;
                } else {
                  // 根据宽度进行网页的缩放
                  document.body.style = `transform: scale(${scaleRatio})`;
                }
              
            

            2.1、超宽屏最终适配效果

            前端大屏适配几种方案


            完整demo代码:

            
              
                
                
                
                Document
                
                  * {
                    margin: 0;
                    padding: 0;
                  }
                  body {
                    position: relative;
                    width: 1920px;
                    height: 1080px;
                    border: 3px solid red;
                    /* 设置缩放原点 */
                    transform-origin: left top;
                    box-sizing: border-box;
                  }
                  ul {
                    display: flex;
                    flex-direction: row;
                    flex-wrap: wrap;
                    width: 100%;
                    height: 100%;
                  }
                  li {
                    width: 33.333%;
                    height: 50%;
                    font-size: 30px;
                    list-style: none;
                    border: 3px solid green;
                    box-sizing: border-box;
                  }
                
              
              
                
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            // 设计稿:1920 * 1080 // 设配目标:1920 * 1080 ( 1 : 1) | 3840* 2160 ( 2 : 2 ) | 7680 * 2160 ( 4 : 2) // 1.设计稿尺寸 let targetWidth = 1920; let targetHeight = 1080; let targetRatio = 16 / 9; // 宽高比率 (宽 / 高) // 2.拿到当前设备(浏览器)的宽度 let currentWidth = document.documentElement.clientWidth || document.body.clientWidth; let currentHeight = document.documentElement.clientHeight || document.body.clientHeight; // 3.计算缩放比率(屏幕过宽,根据高度计算缩放比例) let scaleRatio = currentWidth / targetWidth; // 参照宽度进行缩放(默认情况下) // 当前宽高比例 let currentRatio = currentWidth / currentHeight; if (currentRatio > targetRatio) { scaleRatio = currentHeight / targetHeight; // 参照高度进行缩放(屏幕很宽的情况下) document.body.style = `transform: scale(${scaleRatio}) translateX(-50%); left: 50%;`; } else { // 4.开始缩放网页 document.body.style = `transform: scale(${scaleRatio})`; }

                  最近看网上一直在说前端,Java的行情不好,不够也确实如此,我好几个朋友都在找工作,也是说现在工作挺难找的,不知道讲何区何从,怕是会转行吧。唉,工作是为了生活,当时在当下的社会里,很多人包括我自己,都被工作给填满了,没有空余的时间发展自己的爱好了,挺难过的,我这种从农村出来的人,刚出社会也是信心满满,想要干出一番事业,何曾想被每天的工作堆满,可能很多人从出生就注定了只能当螺丝钉啊,但是我希望我这个螺丝钉是在最重要的部分,哈哈,见笑了,吐槽一下就行了。生活还要继续,明天会更好,加油吧,同志。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]