动态

详情 返回 返回

前端方面移動端適配方法,減少兼容性問題 - 动态 详情

  1. 使用viewport配置,確保完美視口。
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">

關鍵屬性解析:
width=device-width:將視口寬度設置為設備寬度
initial-scale=1.0:初始縮放比例為1
user-scalable=no:禁用用户縮放
viewport-fit=cover:適配劉海屏

  1. 使用rem實現彈性佈局
    rem是相對於根元素(html)的字體大小的單位,可以實現整體佈局的彈性縮放。
// 設置 rem 基準值
(function flexible() {
    const docEl = document.documentElement;
      function setRemUnit() {
        const rem = docEl.clientWidth / 10;
        docEl.style.fontSize = rem + 'px';
    }
 setRemUnit();
    window.addEventListener('resize', setRemUnit);
    window.addEventListener('orientationchange', setRemUnit);
})();a

配套的CSS使用:

.container {
    width: 7.5rem;  /* 750px / 100 */
    height: 1rem;   /* 100px / 100 */
    font-size: 0.28rem; /* 28px / 100 */
}
  1. CSS媒體查詢處理不同尺寸
    使用媒體查詢針對不同屏幕尺寸定製樣式。
/* iPhone SE */
@media screen and (max-width: 374px) {
    .container {
        font-size: 14px;
    }
}

/* iPhone 6/7/8/X */
@media screen and (min-width: 375px) and (max-width: 413px) {
    .container {
        font-size: 16px;
    }
}

/* iPhone 6/7/8 Plus */
@media screen and (min-width: 414px) {
    .container {
        font-size: 18px;
    }
}
  1. 1px邊框問題解決方案
    在高清屏幕下1px邊框顯示過粗的解決方案。
.border-1px {
    position: relative;
    &::after {
        content: '';
        position: absolute;
        left: 0;
        bottom: 0;
        width: 100%;
        height: 1px;
        background-color: #000;
        transform: scaleY(0.5);
        transform-origin: bottom;
    }
}

// 2x屏
@media (-webkit-min-device-pixel-ratio: 2) {
    .border-1px::after {
        transform: scaleY(0.5);
    }
}
// 3x屏
@media (-webkit-min-device-pixel-ratio: 3) {
    .border-1px::after {
        transform: scaleY(0.33);
    }
}
  1. 安全區域適配
    適配iPhone X等帶有劉海的機型。
/* 適配劉海屏 */
.safe-area-inset {
    padding-top: constant(safe-area-inset-top);
    padding-top: env(safe-area-inset-top);
    padding-bottom: constant(safe-area-inset-bottom);
    padding-bottom: env(safe-area-inset-bottom);
}

/* 底部固定導航適配 */
.fixed-bottom {
    position: fixed;
    bottom: 0;
    bottom: constant(safe-area-inset-bottom);
    bottom: env(safe-area-inset-bottom);
}
  1. 圖片適配方案
    針對不同分辨率設備的圖片適配策略。
<!-- 使用srcset適配不同分辨率 -->
<img srcset="image-320w.jpg 320w,
             image-480w.jpg 480w,
             image-800w.jpg 800w"
     sizes="(max-width: 320px) 280px,
            (max-width: 480px) 440px,
            800px"
     src="image-800w.jpg" alt="Responsive image">

配合CSS的處理:

.responsive-image {
    max-width: 100%;
    height: auto;
    display: block;
}
  1. 橫屏適配處理
    處理橫屏模式下的佈局適配。
/* 檢測橫屏 */
@media screen and (orientation: landscape) {
    .landscape-container {
        display: flex;
        flex-direction: row;
    }
}

/* 檢測豎屏 */
@media screen and (orientation: portrait) {
    .portrait-container {
        display: flex;
        flex-direction: column;
    }
}

JavaScript監聽屏幕旋轉:

window.addEventListener('orientationchange', function() {
    if (window.orientation === 180 || window.orientation === 0) {
        // 豎屏
        console.log('豎屏');
    }
    if (window.orientation === 90 || window.orientation === -90) {
        // 橫屏
        console.log('橫屏');
    }
});
  1. 軟鍵盤彈出處理
    處理軟鍵盤彈出時的頁面適配問題。
// 監聽軟鍵盤
const originalHeight = document.documentElement.clientHeight;

window.addEventListener('resize', () => {
    const currentHeight = document.documentElement.clientHeight;
    const input = document.activeElement;
    
    if (originalHeight > currentHeight) {
        // 軟鍵盤彈出
        if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {
            input.scrollIntoView({ block: 'center' });
        }
    } else {
        // 軟鍵盤收起
        window.scrollTo(0, 0);
    }
});

CSS處理:

/* 防止鍵盤頂起頁面 */
.container {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}
user avatar xingzoudedahuoji 头像 bytebase 头像 sy_records 头像 guanguans 头像 l7luo 头像 witersen 头像 baiyu_5e8165d8c9fd8 头像
点赞 7 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.