获取浏览器可视屏幕宽度

1.各浏览器

// 360
innerWidth=outerWidth    //窗口宽度
innerHeight=outerHeight  //窗口高度  (仅白色body区域,不包顶部和尾部状态栏)

// chrom
innerWidth=outerWidth    //窗口宽度
innerHeight!=outerHeight  //窗口高度  
innerHeight 是白色body区域
outerHeight 是body+顶部地址栏等的高度

//ie8
alert(innerWidth)  // ie 无法识别该属性,报错,应写成window.innerWidth; 但也无法得出宽度,返回undefined


//Firefox

innerWinth=outerWinth  //基本相等,但有10几像素误差 ?
innerHeight  //body的高度
outerHeight  //body +顶部地址栏等高度+状态栏, 有几像素误差 ?

2.获取body的宽、高方法

var width = window.innerWidth; //这里要加window,因为IE 会无效;window.innerWidth在ie浏览器返回undefined
var height = window.innerHeight;

if (typeof width != 'number') { //如果是IE,就使用document
    if (document.compatMode == 'CSS1Compat') {  //标准模式
        width = document.documentElement.clientWidth;
        height = document.documentElement.clientHeight;
    } else {
        width = document.body.clientWidth;  //非标准模式使用body
        height = document.body.clientHeight;
    }
}
alert(width);  
alert(height);      
//是ie则进入if语句,再判断是标准还是非标准  ,其他浏览器直接根据变量得出宽高

 3.窗口的位置

//ie支持,火狐不支持:
alert(screenLeft); 
alert(screenTop);
alert(typeof screenLeft); //ie支持,返回number;不支持的返回undefined

//火狐支持,ie不支持:
alert(screenX);
alert(screenY);


//跨浏览器兼容:
var leftX=(typeof screenLeft=="number")?screenLeft:screenX;
var topY=(typeof screenTop=="number")?screenTop:screenY;

  

转载于:https://www.cnblogs.com/luhailin/p/6595224.html

<think>我们正在讨论如何在Vue3中获取屏幕可视宽度(即视口宽度)。根据引用内容,我们可以使用以下几种方法: 1. **使用Vue3的组合式API**(推荐):创建一个可重用的组合函数,使用`ref`来存储屏幕宽度,并在`onMounted``onUnmounted`生命周期钩子中添加移除`resize`事件监听器。引用[1]提供了这样的示例。 2. **在组件中直接监听**:在组件的`mounted`钩子中直接监听`window`的`resize`事件,并更新一个数据属性。引用[2]展示了这种方法(尽管是Vue2的写法,但在Vue3中类似,只是需要将数据定义在`setup`中)。 3. **使用`window.innerWidth`**:这是获取视口宽度的标准方法,如引用[4]所述。 下面我将分别展示这两种在Vue3中的实现方式: ### 方法1:使用组合式API(推荐) 创建一个可重用的函数`useScreenWidth`,返回一个响应式的屏幕宽度值。 ```javascript // useScreenWidth.js import { ref, onMounted, onUnmounted } from 'vue'; export default function useScreenWidth() { const screenWidth = ref(window.innerWidth); const handleResize = () => { screenWidth.value = window.innerWidth; }; onMounted(() => { window.addEventListener('resize', handleResize); }); onUnmounted(() => { window.removeEventListener('resize', handleResize); }); return { screenWidth }; } ``` 在组件中使用: ```vue <template> <div>当前屏幕宽度: {{ screenWidth }}px</div> </template> <script setup> import useScreenWidth from './useScreenWidth'; const { screenWidth } = useScreenWidth(); </script> ``` ### 方法2:在组件内直接实现 如果你不想使用组合式函数,也可以在组件的`setup`中直接实现。 ```vue <template> <div>当前屏幕宽度: {{ screenWidth }}px</div> </template> <script> import { ref, onMounted, onUnmounted } from 'vue'; export default { setup() { const screenWidth = ref(window.innerWidth); const handleResize = () => { screenWidth.value = window.innerWidth; }; onMounted(() => { window.addEventListener('resize', handleResize); }); onUnmounted(() => { window.removeEventListener('resize', handleResize); }); return { screenWidth }; } }; </script> ``` ### 注意事项 - `window.innerWidth` 获取的是视口的宽度(包括滚动条,如果有的话)[^4]。 - 如果你需要获取不包括滚动条的宽度,可以使用`document.documentElement.clientWidth`。 - 在组件卸载时一定要移除事件监听,避免内存泄漏。 ### 完整示例(组合式函数) 下面是一个完整的Vue3组件示例,使用组合式函数获取并显示屏幕宽度: ```vue <template> <div> <h1>屏幕宽度: {{ screenWidth }}px</h1> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue'; const screenWidth = ref(window.innerWidth); const handleResize = () => { screenWidth.value = window.innerWidth; }; onMounted(() => { window.addEventListener('resize', handleResize); }); onUnmounted(() => { window.removeEventListener('resize', handleResize); }); </script> ``` ### 引用说明 - 引用[1]提供了组合式函数的实现方式[^1]。 - 引用[2]展示了在Vue2中通过`mounted`钩子监听的方式,在Vue3中我们可以使用`onMounted`替代[^2]。 - 引用[4]说明了`window.innerWidth`是获取屏幕可视宽度的正确属性[^4]。 §§相关问题§§ 1. 如何在Vue3中响应式地获取屏幕高度? 2. Vue3组合式函数中如何避免重复添加事件监听器? 3. 如何实现大屏适配的缩放功能(如引用[3]所述)? 4. 在Vue3中,如何优雅地处理多个窗口尺寸变化监听?</think>在 Vue3 中获取屏幕可视宽度(视口宽度)主要有以下几种方法,这些方法都基于 JavaScript 的标准 API,并结合 Vue3 的响应式特性实现: ### 方法 1: 使用组合式函数(推荐) ```javascript import { ref, onMounted, onUnmounted } from 'vue'; export function useViewportWidth() { const viewportWidth = ref(window.innerWidth); const updateWidth = () => { viewportWidth.value = window.innerWidth; }; onMounted(() => { window.addEventListener('resize', updateWidth); }); onUnmounted(() => { window.removeEventListener('resize', updateWidth); }); return { viewportWidth }; } ``` 在组件中使用: ```vue <template> <div>当前屏幕宽度: {{ viewportWidth }}px</div> </template> <script setup> import { useViewportWidth } from './composables/useViewportWidth'; const { viewportWidth } = useViewportWidth(); </script> ``` ### 方法 2: 直接在组件中实现 ```vue <template> <div>当前屏幕宽度: {{ screenWidth }}px</div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue'; const screenWidth = ref(window.innerWidth); const handleResize = () => { screenWidth.value = window.innerWidth; }; onMounted(() => { window.addEventListener('resize', handleResize); }); onUnmounted(() => { window.removeEventListener('resize', handleResize); }); </script> ``` ### 方法 3: 使用文档元素获取(备选) ```javascript const screenWidth = ref(document.documentElement.clientWidth); ``` ### 关键说明 1. **核心 API**: - `window.innerWidth`:获取包含滚动条的视口宽度[^4] - `document.documentElement.clientWidth`:获取不包含滚动条的视口宽度 2. **响应式更新**: - 监听 `resize` 事件实时更新宽度值 - 使用 `ref` 创建响应式变量,Vue 会自动更新 DOM 3. **内存管理**: - 在 `onUnmounted` 中移除事件监听器,防止内存泄漏[^1] 4. **与屏幕宽度的区别**: - `screen.width` 返回整个显示器的物理宽度 - `window.innerWidth` 返回浏览器窗口的可视区域宽度(含滚动条)[^4] ### 完整示例(带防抖优化) ```vue <template> <div class="screen-info"> <p>可视宽度: {{ viewportWidth }}px</p> <p>完整屏幕宽度: {{ screenWidth }}px</p> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue'; const viewportWidth = ref(window.innerWidth); const screenWidth = ref(screen.width); // 防抖函数优化 let resizeTimer; const handleResize = () => { clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { viewportWidth.value = window.innerWidth; screenWidth.value = screen.width; }, 200); }; onMounted(() => { window.addEventListener('resize', handleResize); }); onUnmounted(() => { window.removeEventListener('resize', handleResize); clearTimeout(resizeTimer); }); </script> ``` ### 应用场景 1. **响应式布局**:根据宽度应用不同的布局样式 2. **大屏适配**:如引用[3]中的可视化大屏缩放方案[^3] 3. **组件条件渲染**:在特定宽度下显示/隐藏组件 4. **图表适配**:调整 Echarts 等可视化库的尺寸 > **提示**:对于复杂的大屏适配需求,可参考引用[3]中的缩放算法,根据设计稿尺寸动态计算缩放比例[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值