八個移動端適配技巧,兼容性問題減少 90%
作者:story
移動端適配一直是前端開發(fā)中的重點難題,本文分享下常見的移動端兼容處理方案。
移動端適配一直是前端開發(fā)中的重點難題,分享下常見的移動端兼容處理方案。
1. 使用viewport配置,確保完美視口
移動端開發(fā)首先要設置正確的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:適配劉海屏
2. 使用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);
})();
配套的CSS使用:
.container {
width: 7.5rem; /* 750px / 100 */
height: 1rem; /* 100px / 100 */
font-size: 0.28rem; /* 28px / 100 */
}
3. 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;
}
}
4. 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);
}
}
5. 安全區(qū)域適配
適配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);
}
6. 圖片適配方案
針對不同分辨率設備的圖片適配策略。
<!-- 使用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;
}
7. 橫屏適配處理
處理橫屏模式下的布局適配。
/* 檢測橫屏 */
@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監(jiān)聽屏幕旋轉:
window.addEventListener('orientationchange', function() {
if (window.orientation === 180 || window.orientation === 0) {
// 豎屏
console.log('豎屏');
}
if (window.orientation === 90 || window.orientation === -90) {
// 橫屏
console.log('橫屏');
}
});
8. 軟鍵盤彈出處理
處理軟鍵盤彈出時的頁面適配問題。
// 監(jiān)聽軟鍵盤
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;
}
移動端適配是一個系統(tǒng)工程,需要在項目開始時就建立完整的適配方案,而不是在遇到問題時臨時處理。
責任編輯:趙寧寧
來源:
JavaScript