首页 > 其他分享 >前端常用页面适配

前端常用页面适配

时间:2023-08-05 16:22:43浏览次数:38  
标签:scale dpr 适配 前端 rem doc var match 页面

1、媒体查询(media )

通过在CSS文件中使用@media规则来定义媒体查询。

@media screen and (max-width: 768px) {
  /* 在宽度小于等于768px时应用的CSS样式 */
}

@media screen and (min-width: 768px) and (max-width: 992px) {
  /* 在宽度大于768px且小于等于992px时应用的CSS样式 */
}

@media screen and (min-width: 992px) {
  /* 在宽度大于992px时应用的CSS样式 */
}

使用CSS媒体查询关键字:CSS3还引入了一媒体查询关键字,可以方便地根据设备的类型或特性来应用样式

/* 应用于打印设备 */
@media print {
  /* 打印相关的CSS样式 */
}

/* 应用于屏幕设备 */
@media screen {
  /* 屏幕相关的CSS样式 */
}

/* 应用于横向方向的设备@media (orientation: landscape)  /* 横向设备相关的CSS样式 */
} 

/* 应用于高分辨率设备 */
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  /* 高分辨率设备相关的CSS样式 */
}

使用CSS框架或工具:许多CSS框架或工具已经内置了响应式设计的媒体查询,如Bootstrap、Foundation等。这些框架会根据一系列的预定义断点(breakpoint)来设置媒体查询,简化了开发过程。你可以选择适合自己的CSS框架,并按照框架的文档来使用。

2、scale(缩放)

根据宽度比率进行缩放

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

  <script>
    // 设计稿: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})`;
    }
  </script>

 

3、flexible

h5移动适配解决方案

(function(win, lib) {
    var doc = win.document;
    var docEl = doc.documentElement;
    var metaEl = doc.querySelector('meta[name="viewport"]');
    var flexibleEl = doc.querySelector('meta[name="flexible"]');
    var dpr = 0;
    var scale = 0;
    var tid;
    var flexible = lib.flexible || (lib.flexible = {});
     
    if (metaEl) {
        console.warn('将根据已有的meta标签来设置缩放比例');
        var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
        if (match) {
            scale = parseFloat(match[1]);
            dpr = parseInt(1 / scale);
        }
    } else if (flexibleEl) {
        var content = flexibleEl.getAttribute('content');
        if (content) {
            var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
            var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
            if (initialDpr) {
                dpr = parseFloat(initialDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));   
            }
            if (maximumDpr) {
                dpr = parseFloat(maximumDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));   
            }
        }
    }
  
    if (!dpr && !scale) {
        var isAndroid = win.navigator.appVersion.match(/android/gi);
        var isIPhone = win.navigator.appVersion.match(/iphone/gi);
        var devicePixelRatio = win.devicePixelRatio;
        if (isIPhone) {
            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {               
                dpr = 3;
            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
                dpr = 2;
            } else {
                dpr = 1;
            }
        } else {
            // 其他设备下,仍旧使用1倍的方案
            dpr = 1;
        }
        scale = 1 / dpr;
    }
  
    docEl.setAttribute('data-dpr', dpr);
    if (!metaEl) {
        metaEl = doc.createElement('meta');
        metaEl.setAttribute('name', 'viewport');
        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
        if (docEl.firstElementChild) {
            docEl.firstElementChild.appendChild(metaEl);
        } else {
            var wrap = doc.createElement('div');
            wrap.appendChild(metaEl);
            doc.write(wrap.innerHTML);
        }
    }
  
    function refreshRem(){
        var width = docEl.getBoundingClientRect().width;
        if (width / dpr > 540) {
            width = 540 * dpr;
        }
        var rem = width / 10;
        docEl.style.fontSize = rem + 'px';
        flexible.rem = win.rem = rem;
    }
  
    win.addEventListener('resize', function() {
        clearTimeout(tid);
        tid = setTimeout(refreshRem, 300);
    }, false);
    win.addEventListener('pageshow', function(e) {
        if (e.persisted) {
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
        }
    }, false);
  
    if (doc.readyState === 'complete') {
        doc.body.style.fontSize = 12 * dpr + 'px';
    } else {
        doc.addEventListener('DOMContentLoaded', function(e) {
            doc.body.style.fontSize = 12 * dpr + 'px';
        }, false);
    }
     
  
    refreshRem();
  
    flexible.dpr = win.dpr = dpr;
    flexible.refreshRem = refreshRem;
    flexible.rem2px = function(d) {
        var val = parseFloat(d) * this.rem;
        if (typeof d === 'string' && d.match(/rem$/)) {
            val += 'px';
        }
        return val;
    }
    flexible.px2rem = function(d) {
        var val = parseFloat(d) / this.rem;
        if (typeof d === 'string' && d.match(/px$/)) {
            val += 'rem';
        }
        return val;
    }
  
})(window, window['lib'] || (window['lib'] = {}));

 

4、vw、vh、rem的使用

;(function(win, lib) {     var doc = win.document;     var docEl = doc.documentElement;     var metaEl = doc.querySelector('meta[name="viewport"]');     var flexibleEl = doc.querySelector('meta[name="flexible"]');     var dpr = 0;     var scale = 0;     var tid;     var flexible = lib.flexible || (lib.flexible = {});           if (metaEl) {         console.warn('将根据已有的meta标签来设置缩放比例');         var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);         if (match) {             scale = parseFloat(match[1]);             dpr = parseInt(1 / scale);         }     else if (flexibleEl) {         var content = flexibleEl.getAttribute('content');         if (content) {             var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);             var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);             if (initialDpr) {                 dpr = parseFloat(initialDpr[1]);                 scale = parseFloat((1 / dpr).toFixed(2));                }             if (maximumDpr) {                 dpr = parseFloat(maximumDpr[1]);                 scale = parseFloat((1 / dpr).toFixed(2));                }         }     }        if (!dpr && !scale) {         var isAndroid = win.navigator.appVersion.match(/android/gi);         var isIPhone = win.navigator.appVersion.match(/iphone/gi);         var devicePixelRatio = win.devicePixelRatio;         if (isIPhone) {             // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案             if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {                                dpr = 3;             else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){                 dpr = 2;             else {                 dpr = 1;             }         else {             // 其他设备下,仍旧使用1倍的方案             dpr = 1;         }         scale = 1 / dpr;     }        docEl.setAttribute('data-dpr', dpr);     if (!metaEl) {         metaEl = doc.createElement('meta');         metaEl.setAttribute('name''viewport');         metaEl.setAttribute('content''initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');         if (docEl.firstElementChild) {             docEl.firstElementChild.appendChild(metaEl);         else {             var wrap = doc.createElement('div');             wrap.appendChild(metaEl);             doc.write(wrap.innerHTML);         }     }        function refreshRem(){         var width = docEl.getBoundingClientRect().width;         if (width / dpr > 540) {             width = 540 * dpr;         }         var rem = width / 10;         docEl.style.fontSize = rem + 'px';         flexible.rem = win.rem = rem;     }        win.addEventListener('resize'function() {         clearTimeout(tid);         tid = setTimeout(refreshRem, 300);     }, false);     win.addEventListener('pageshow'function(e) {         if (e.persisted) {             clearTimeout(tid);             tid = setTimeout(refreshRem, 300);         }     }, false);        if (doc.readyState === 'complete') {         doc.body.style.fontSize = 12 * dpr + 'px';     else {         doc.addEventListener('DOMContentLoaded'function(e) {             doc.body.style.fontSize = 12 * dpr + 'px';         }, false);     }              refreshRem();        flexible.dpr = win.dpr = dpr;     flexible.refreshRem = refreshRem;     flexible.rem2px = function(d) {         var val = parseFloat(d) * this.rem;         if (typeof d === 'string' && d.match(/rem$/)) {             val += 'px';         }         return val;     }     flexible.px2rem = function(d) {         var val = parseFloat(d) / this.rem;         if (typeof d === 'string' && d.match(/px$/)) {             val += 'rem';         }         return val;     }    })(window, window['lib'] || (window['lib'] = {}));

标签:scale,dpr,适配,前端,rem,doc,var,match,页面
From: https://www.cnblogs.com/dongzi1997/p/17608102.html

相关文章