移动端页面横屏和强制横屏适配

前言

在移动端中我们经常碰到横屏竖屏的问题,那么如何去判断或者针对横屏、竖屏来写不同的代码呢。
首先在head中加入如下代码:

<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>

一、页面横屏

1、CSS判断横屏竖屏

1.1 写在同一个CSS文件中

@media screen and (orientation: portrait) {
  /*竖屏 css*/
} 
@media screen and (orientation: landscape) {
  /*横屏 css*/
}

1.2 分开写在2个CSS文件中

竖屏引用方式

<link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css">

横屏引用方式

<link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css">

2、JS判断横屏竖屏

//判断手机横竖屏状态:
window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", function() {
    if (window.orientation === 180 || window.orientation === 0) {
        alert('竖屏状态!');
    }
    if (window.orientation === 90 || window.orientation === -90 ){
        alert('横屏状态!');
    } 
}, false);
//移动端的浏览器一般都支持window.orientation这个参数,通过这个参数可以判断出手机是处在横屏还是竖屏状态。

二、页面强制横屏显示

有这个需求这个是因为客户端将手机横屏的功能屏蔽掉了,所以只能强制将页面横屏显示了

以下是我的示例结构

<div class="horizontal-main">
	horizontal-main
</div>

css:

.horizontal-main {
    background: linear-gradient(168deg, #f4dcef, #feead1);
    transform: rotate(90deg);
    transform-origin: 50% 50%;
    top: 146px;
    width: 667px;
    left: -146px;
    height: 375px;
    overflow-x: hidden;
    overflow-y: auto;
}

js:

$(function(){
    var width = document.documentElement.scrollWidth;
    var height =  document.documentElement.scrollHeight;
    if( width < height ){
        $horiM =  $('.horizontal-main');
        $horiM.width(height);
        $horiM.height(width);
        $horiM.css('top',  (height-width)/2 );
        $horiM.css('left',  0-(height-width)/2 );
    } 
})

注意:这个方法只适合一屏展示的页面,不适合带有滚动条的页面。

<think>嗯,用户问的是如何在Vue3中实现大屏可视化的移动端适配。我需要先理解他们的需求。大屏可视化通常用在数据展示,比如监控中心或者展示面板,而移动端适配可能是指在不同尺寸的手机或平板上也能正常显示。用户可能已经尝试过在PC端实现,但转到移动端时遇到了布局或缩放的问题。 首先,我得回忆一下Vue3的相关知识,还有大屏适配的常用方法。根据提供的引用,看到有几种方案,比如scale缩放、rem布局、vw/vh单位,还有动态计算。引用里提到引用45讨论的是scale方案,可能这是常用的方法。引用3提到监听resize事件,动态调整样式,这可能scale或者rem有关。 用户需要的是移动端适配移动端屏幕比例PC不同,比如更窄或者更长,所以直接等比例缩放可能有问题。可能需要考虑横屏竖屏的适配,或者使用响应式布局。比如,使用媒体查询来调整布局,或者动态计算缩放比例。 引用5提到了在index.html中添加样式,确保overflow:hiddenheight:100%,这可能防止出现滚动条,确保全屏显示。此外,scale方案需要计算当前窗口与设计稿的比例,然后应用transform的scale。这种方法能保持整体布局,但可能会影响清晰度,尤其是在缩放比例较大时。 另外,rem布局也是常见做法,通过设置根元素的字体大小,然后所有尺寸用rem单位,根据屏幕尺寸调整根字体大小。但大屏可能元素较多,rem可能需要较多计算。或者使用vw/vh单位,直接根据视口大小来调整,但可能需要配合flex布局或grid来保证元素排列。 用户可能需要具体的步骤,比如如何配置scale,或者如何使用rem。引用4提到始终满屏适配,适用于比例接近的情况,但移动端比例差异可能较大,所以可能需要结合其他方法。比如,在移动端采用不同的布局方式,或者动态切换scale的比例。 还需要考虑图表的适配,比如ECharts可能需要监听resize事件,在容器尺寸变化时调用resize方法。引用3中的resize监听可能就是这个用途。同时,地图组件如高德地图,可能需要调整中心点或缩放级别以适应移动端。 另外,移动端触摸事件交互可能需要调整,比如避免点击区域过小,或者手势操作。但用户的问题主要是在视觉适配,可能暂时不需要处理交互。 总结可能的步骤:选择适配方案(如scale或rem),设置基础样式,监听窗口变化,动态调整样式,处理图表地图的适配,测试不同设备。需要给出具体的代码示例,比如使用scale的计算方法,或者rem的设置方法。 需要确保回答结构清晰,分步骤说明,并引用提供的参考资料。比如,引用5中的index.html样式,引用3中的resize监听,引用4的scale方案。同时,要提到可能的注意事项,比如图片模糊、字体大小调整,或者使用CSS变量方便管理。 可能还需要比较不同方案的优缺点,比如scale简单但可能影响清晰度,rem/vw需要更多布局调整但更灵活。根据移动端的特点,可能推荐scale方案,因为实现简单,适合快速适配,但需要注意限制缩放比例,避免过度拉伸。 最后,给出示例代码,比如在Vue组件中使用resize监听,计算scale值,应用transform。同时,处理图表resize,比如在ECharts实例调用resize方法。还要提到如何在高德地图中调整,可能需要重新渲染或调整参数。</think>在Vue3中实现大屏可视化移动端适配,需结合屏幕比例动态调整响应式布局技术。以下是分步骤实现方案: ### 一、核心适配方案 1. **基础容器配置** 在入口文件`index.html`添加全局样式确保容器满屏: ```html <style> html, body, #app { overflow: hidden; height: 100%; width: 100%; } </style> ``` [^5] 2. **动态缩放方案** 通过`transform: scale`实现等比例缩放(以1920*1080设计稿为基准): ```javascript // utils/scale.js export const useScale = (baseWidth = 1920, baseHeight = 1080) => { const scale = ref(1) const updateScale = () => { const wRatio = window.innerWidth / baseWidth const hRatio = window.innerHeight / baseHeight scale.value = Math.min(wRatio, hRatio) // 取较小值避免溢出 } onMounted(() => { updateScale() window.addEventListener('resize', updateScale) }) return { scale } } ``` ```vue <!-- App.vue --> <template> <div class="container" :style="{ transform: `scale(${scale})` }"> <!-- 大屏内容 --> </div> </template> ``` [^4] ### 二、图表与地图适配 1. **ECharts响应式** 监听容器尺寸变化并调用`resize()`: ```javascript const chartRef = ref(null) onMounted(() => { const chart = echarts.init(chartRef.value) window.addEventListener('resize', () => chart.resize()) }) ``` 2. **高德地图适配** 在scale容器内需特殊处理: ```javascript // 地图容器需设置固定尺寸 const mapStyle = { width: '1920px', height: '1080px', transformOrigin: '0 0' // 保持缩放基准点 } ``` ### 三、移动端优化技巧 1. **方向锁定** 通过CSS强制横屏显示: ```css @media screen and (orientation: portrait) { body { transform: rotate(90deg); width: 100vh; height: 100vw; } } ``` 2. **触控事件优化** 添加视口元标签: ```html <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> ``` ### 四、注意事项 1. **字体清晰度** 缩放后添加抗锯齿处理: ```css .container { -webkit-font-smoothing: antialiased; image-rendering: -webkit-optimize-contrast; } ``` 2. **性能优化** 使用防抖函数控制resize触发频率: ```javascript import { debounce } from 'lodash-es' window.addEventListener('resize', debounce(updateScale, 200)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值