首页 分享 前端适配:常用的几种方案

前端适配:常用的几种方案

来源:花匠小妙招 时间:2024-12-07 18:35
一、rem和第三方插件

rem与em不同,rem会根据html的根节点字体大小进行变换,例如1rem就是一个字体大小那么大,比如根大小font size为12px,那么1rem即12px,大家可以在网上寻找单位换算工具进行换算(从设计稿的px到rem)或是下载相关插件例如gulp-px3rem,这样在不同分辨率,不同缩放比的电脑下都能够轻松应对了。

使用:

第三方插件,例如做移动端适配的flexible.js,lib-flexible库,其核心原理就是rem,我们需要做的就是根据不同屏幕计算出不同的fontsize,而页面中元素都是用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) {

if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {

dpr = 3;

} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){

dpr = 2;

} else {

dpr = 1;

}

} else {

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'] = {}));

在实际开发中应用场景不同效果不同,因此不能写死px。

在PC端适配我们可以自动转换rem适配方案(postcss-pxtorem、amfe-flexible),这里以vue3+vite为例子。事实上amfe-flexible是lib-flexible的升级版。

注意: 行内样式px不会转化为rem

npm install postcss postcss-pxtorem --save-dev // 我试过了反正我报错了,版本太高 大家可以指定5.1.1

npm install postcss-pxtorem@^5.1.1

npm i amfe-flexible --save

记得在main.js中引入amfe-flexible

import "amfe-flexible"

相关配置

二、媒体查询

通过查询不同的宽度来执行不同的css代码,最终以达到界面的配置。

在 CSS 中使用 @media 查询来检测屏幕宽度。当屏幕宽度小于 1024px 时,增加 margin-top 以向下移动表格。

.responsive-table {

transition: margin-top 0.3s;

}

@media (max-width: 1024px) {

.responsive-table {

margin-top: 200px;

}

}

三、弹性布局

创建一个响应式的卡片布局,当屏幕宽度减小时,卡片会自动换行。

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Flexbox Example</title>

<style>

body {

display: flex;

justify-content: center;

align-items: center;

flex-wrap: wrap;

margin: 0;

height: 100vh;

background-color: #f0f0f0;

}

.card-container {

display: flex;

flex-wrap: wrap;

justify-content: center;

width: 90%;

}

.card {

background-color: white;

border: 1px solid #ccc;

border-radius: 5px;

padding: 20px;

margin: 10px;

flex: 1 1 300px;

box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);

transition: transform 0.3s;

}

.card:hover {

transform: translateY(-5px);

}

</style>

</head>

<body>

<div class="card-container">

<div class="card">Card 1</div>

<div class="card">Card 2</div>

<div class="card">Card 3</div>

<div class="card">Card 4</div>

<div class="card">Card 5</div>

</div>

</body>

</html>

相关知识

前端最常用的移动App开发方式及技术栈详解
前端工程师最常用的字体图标库
以生态适配性为基本原则的花境施工技术
「职位对比」花儿绽放 前端开发工程师怎么样
正阳街道开展残疾人辅助器具适配评估工作
花卉种植常用的几种肥料
【前端素材】推荐优质大气的鲜花预订商城FloSun平台模板(附源码)
从前端到后端——完整的Web开发指南
浦东新区残疾人辅助器具适配及其他康复业务服务项目的中标结果公告
几种常用的土壤管理制度

网址: 前端适配:常用的几种方案 https://www.huajiangbk.com/newsview948631.html

所属分类:花卉
上一篇: egret.H5游戏屏幕适配
下一篇: 【利用AI让知识体系化】常见的移

推荐分享