移动端html适配方案,原生js实现 兼容常规pc、大屏、移动端 适配方案
1、设计稿
1)pc设计稿为19201080的可视化大屏,16:9比例设计
2)大屏设计稿35841152的可视化大屏,28:9比例设计
3)移动端设计稿 宽750的可视化大屏
2、适配不同屏幕
1)pc要兼容不同分辨率下的屏幕,注意这里说的是往下兼容 兼容1k以下的 不能出现滚动条 使用scale
2)大屏比例为28:9,在项目开发中,可以按照1680:540 达到28:9的效果 不能出现滚动条 使用rem
3)移动端兼容,以750为标准实现适配 使用rem
3、实现思路:
1)pc可以根据vw、vh去实现
@function vw($px) {
@return ($px/1920) * 100vw;
}
body {
width:vw(1920)
}
问题:在echats中,当在小屏幕的时候,图表的字体会比ui稿上的大,这时候你又要把字体在js里面再进行一步转换
// 字体转换
function toFontSize(px){
let vw = px / 1920;
let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
return htmlWidth * vw
}
2)rem
rem (font size of the root element), 是 css3 的引入的一个大小单位。即相对于根元素的 font-size 值的大小。所谓根元素在网页里一般就是 html。
问题:在echats中,当在小屏幕的时候,图表的字体会比ui稿上的大,这时候你又要把字体在js里面再进行一步转换
3)缩放scale
浏览器body设置为设计稿宽高即1920*1080, 动态根据实际宽高对body的width,height进行缩放,从而实现内容缩放
采用scale方案,字体不受浏览器最小字体限制,可以自由绽放到该分辨率下对应比例
4)根据不同屏幕切换显示 不同页面
pc和大屏的页面布局结构一致,所以更换className去实现切换
移动端与pc、大屏的页面布局都不一致,所以根据js判断当前是否为移动设备进行显示切换
4、简单实现代码
var docWidth,docHeight;
var designWidth,designHeight;
// 屏幕缩放实现
function refreshScale(){
bodyStyle.innerHTML=`body{width:${designWidth}px; height:${designHeight}px!important;}`
document.documentElement.firstElementChild.appendChild(bodyStyle)
document.getElementById('main').style='display:flex'
document.getElementsByClassName('mobile')[0].style='display:none'
var widthRatio = docWidth / designWidth,
heightRatio = docHeight / designHeight;
document.body.style = `transform:scale(${widthRatio},${heightRatio});transform-origin:left top;`;
// 应对浏览器全屏切换前后窗口因短暂滚动条问题出现未占满情况
setTimeout(function(){
var lateWidth= document.documentElement.clientWidth,
lateHeight = document.documentElement.clientHeight;
if( lateWidth === docWidth ) return;
widthRatio = lateWidth / designWidth
heightRatio = lateHeight / designHeight
document.body.style = "transform:scale(" + widthRatio + "," + heightRatio + ");transform-origin:left top;"
},0)
}
// 清除scale
function clearScale(){
// 清除pc样式
bodyStyle.innerHTML=``
document.documentElement.firstElementChild.appendChild(bodyStyle)
document.body.style="transform:none;transform-origin:none"
}
// 初始化
function init(){
// 获取当前屏幕可视区域大小
docWidth = document.documentElement.clientWidth;
docHeight = document.documentElement.clientHeight;
// 判断是否是移动设备
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(navigator.userAgent)){
mobilePage();
}else{
let mainClass = document.getElementById('main').classList;
if(docWidth == 1680 || docWidth == 3584){ // 模拟大屏
designWidth = docWidth;
designHeight = docWidth / 28 *9;
mainClass.add('large');
mainClass.remove('pc');
largePage();
}else{ // pc
designWidth = 1920;
designHeight = 1080;
mainClass.add('pc');
mainClass.remove('large');
refreshScale()
}
}
}
// 大屏设置 rem 函数
function setRem (designSize) {
// 基准大小
baseSize = 100;
let basePc = baseSize / designSize; // 表示1680的设计图,使用100PX的默认值
let vW = window.innerWidth; // 当前窗口的宽度
let rem = vW * basePc; // 以默认比例值乘以当前窗口宽度,得到该宽度下的相应font-size值
document.documentElement.style.fontSize = rem + "px";
}
// 大屏页面
function largePage(){
clearScale();
document.getElementById('main').style='display:flex'
document.getElementsByClassName('mobile')[0].style='display:none'
// 大屏 设置 rem 函数
let designSize = 1680;
setRem(designSize);
}
// 移动端页面
function mobilePage(){
clearScale()
// 是移动设备 展示移动设备页
document.getElementById('main').style='display:none'
document.getElementsByClassName('mobile')[0].style='display:flex'
// mobile 设置 rem 函数
let designSize = 750;
setRem(designSize);
}
// 初始化
init();
// 监听前进/后退以及load事件触发
window.addEventListener("pageshow", function (e) {
if (e.persisted) { // 浏览器后退的时候重新计算
init()
}
}, false);
// 监听屏幕缩放
window.addEventListener("resize",function(){
init()
}, false);
width: 100%;
height: 100%;
}
body{
margin:0px;
transform: translate3d(0,0,0)
}
/* pc */
.pc {
width: 1860px;
height: 1020px;
display: flex;
flex-direction: row;
justify-content: space-between;
padding:30px;
}
.pc .column {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.pc .bk {
width: 450px;
height: 350px;
border: #000 solid 1px;
margin-top: 30px;
}
.bk:first-child{
margin-top: 0px;
}
.pc .big-bk {
width: 850px;
height: 550px;
border: #000 solid 1px;
margin: 30px 30px 0px 30px;
}
.big-bk:first-child {
margin-top: 0px;
}
/* 移动端 */
.mobile {
display: flex;
flex-direction: column;
align-items: center;
}
.mobile .bk {
width: 6.9rem;
height: 2rem;
border: #000 solid 0.01rem;
margin-top: 0.3rem;
}
/* 大屏 */
.large {
width: 16.2rem;
height: 4.6rem;
display: flex;
flex-direction: row;
justify-content: space-between;
padding:0.3rem;
}
.large .column {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.large .bk {
width: 4.5rem;
height: 1.5rem;
border: #000 solid 1px;
margin-top: 0.3rem;
}
.large .big-bk {
width: 6.5rem;
height: 2.5rem;
border: #000 solid 1px;
margin: 0.3rem 0.3rem 0rem 0.3rem;
}
pc兼容 参考:https://blog.csdn.net/sophie_u/article/details/109582687
移动端html适配方案,原生js实现 兼容常规pc、大屏、移动端 适配方案相关推荐
- 原生 js 实现类 3d 地图大屏展示自动高亮轮播、显示悬浮提示 tootip 的方案:svg + popper.js 定位引擎
要实现的效果 如下图,3d 地图高亮自动轮播,展示白云区各个镇街的人口数局. 原由 为什么想到这个方案,是因为我在用 echarts-gl 实现 3d 地图效果的过程中,我发现通过 dispatchA ...
- 【前端大屏可视化项目适配方案】
引自 https://juejin.cn/post/7009081081760579591#heading-27 感谢!!! 前端大屏可视化项目适配方案 1. 全局适配 1.1 css scale 适 ...
- 大屏iPhone的适配 +iOS 图片尺寸要求
摘自:http://blog.ibireme.com/2014/09/16/adapted_to_iphone6/ 苹果公司官网设计介绍到:Retina显示屏的超高像素密度已超过人眼能分辨的范围. R ...
- gis 大屏_gis大屏可视化应用技术方案_gis大屏可视化应用技术_gis大屏可视化应用 - 帆软...
如今大屏可视化的应用越来越普遍,在很多公共场合.交易大厅,以及企业的展览中心,大屏可视化都是非常震撼的.那么gis大屏可视化应用技术方案哪家公司靠谱?你需要掌握这2招选择标准. 一.gis大屏可视化应 ...
- vue大屏可视化自适应完美方案
背景 在做大屏可视化项目的时候,一般设计稿会设计成1920*1080,但是页面写死1920*1080在2k.4k等分辨率的屏幕下是不适配的.如果页面能够根据屏幕比例进行等比缩放那就好了. 比例 什么? ...
- 基于js+echarts实现数据可视化大屏展示
vue+echarts大屏数据可视化展示点击进入 写在前面: 本项目中使用的是echarts图表库,ECharts 提供了常规的折线图.柱状图.散点图.饼图.K线图,用于统计的盒形图,用于地理数据可视 ...
- 大屏数据可视化开发方案
什么是数据可视化? 数据可视化其实就是把数据以更直观的形式进行展示,其实就是通过图表的方式进行展示. 数据可视化的特点: 1.可以清晰有效的传达与沟通信息 大屏数据可视化技术选型 1.百度的 suga ...
- react + dataV + three.js + blender 实现3D可视化大屏效果
效果图 3D 可视化展示是一个很不错的方向,但是纯three.js 开发效率低,简单展示类的可视化,可以考虑使用blender 等3D 绘制工具,快速,高效. 文章目录 效果图 前言 一.DataV ...
- 大屏可视化的适配方案
这里找了几个写的非常不错的文章,分享一下: https://blog.csdn.net/qq_41238459/article/details/122812296?ops_request_misc=& ...
最新文章
- 全球及中国PMN-PT单晶行业发展模式及未来产销前景预测报告2022-2028年版
- MyEclipse使用总结
- 权限申请_Android 开发工程师必须掌握的动态权限申请,三步轻松搞定!
- All Of ACM
- 网络通信之TCP Client通信(基于Arduino)
- dubbo协议_Dubbo框架支持多少种协议?各有什么特点?文中一一为你揭晓
- 赚钱真的要抓住风口,抓住风口猪都能飞
- 我在公司内部的分享(秒针系统)
- 保存页面的滚动条的位置
- 存储过程写法_计算机组成原理学习笔记:三 存储系统
- kafka集群搭建超详细教程
- Ubuntu压缩、解压
- 怎么给图片批量加边框
- 华为芯片鸿蒙的由来,华为“鸿蒙”真的来了!看完这些商标来历,网友们又激动了...
- 炼成的:精妙SQL语句介绍
- Hdu 4090 GemAnd Prince (搜索_2010年北京区域赛)
- 瀑布模型的特点及优缺点
- LeetCode第172场周赛:5322. 工作计划的最低难度(动态规划)
- 灰度图像的中值滤波取证
- python turtle绘制正多边形
热门文章
- java程序卡住的原因_Java程序卡住问题的解决
- Android中简单实现贴纸功能labelview
- 高数培训3:多元函数微分
- 关于树莓派USB端口号查询说明
- java 墨卡托 经纬度_Web墨卡托坐标与WGS84经纬度互转 java代码
- 改变el-progress底色
- 170916_算法导论学习(四)_2.3 设计算法_练习
- 1.1 关于emscripten
- 基于RuoYi开发+flowable实现OA办公系统
- 饥荒机器人升级上限多少_饥荒机器人最快速升级攻略_饥荒这款游戏可以来说是非常的大众化,因为有非常多的玩家喜欢这--找找啦游戏平台-分享值得玩的好游戏!...