在移动端避免使用100vh「建议收藏」

在移动端避免使用100vh「建议收藏」在移动端避免使用100vhCSS中的Viewport单元听起来很棒。如果你想将一个元素设置成全屏高度,你可以设置高度:100vh,这样你就有了一个完美的全屏元素,它会随着视口的改变而改变大小!遗憾的是,事实并非如此。100vh在不同的浏览器的实现方式上也有一点微妙的变化,这使得它几乎毫无用处。最好避免100vh,而是依赖javascript来设置高度,以获得完整的视口体验。核心问题是移动浏览器…

大家好,又见面了,我是你们的朋友全栈君。

在移动端避免使用100vh

CSS中的Viewport单元听起来很棒。如果你想将一个元素设置成全屏高度,你可以设置高度:100vh,这样你就有了一个完美的全屏元素,它会随着视口的改变而改变大小!遗憾的是,事实并非如此。100vh在不同的浏览器的实现方式上也有一点微妙的变化,这使得它几乎毫无用处。最好避免100vh,而是依赖javascript来设置高度,以获得完整的视口体验。

核心问题是移动浏览器(Chrome和Safari)有一个“帮助”功能,地址栏有时可见,有时隐藏,改变了视口的可见大小。这些浏览器没有将100vh的高度调整为视口高度变化时屏幕的可见部分,而是将100vh设置为隐藏地址栏的浏览器高度。结果是,当地址栏可见时,屏幕的底部部分将被切断,从而破坏了100vh的初衷。

如下所示:

在这里插入图片描述
当地址栏可见时,由于移动浏览器不正确地将100vh设置为屏幕高度而没有显示地址栏,因此屏幕底部被切断。在上图中,应该在屏幕底部的按钮被隐藏了。更糟糕的是,当用户第一次使用手机访问网站时,地址栏会显示在页面顶部,因此用户体验是很糟糕的。

一个好的解决方案: window.innerHeight

解决这个问题的一种方法是依赖javascript而不是css。当页面加载时,将高度设置为window.innerHeight将正确地将高度设置为窗口的可见部分。如果地址栏是可见的,那么window.innerHeight是全屏的高度。如果地址栏是隐藏的,那么window.innerHeight将是屏幕可见部分的高度,正如您所期望的那样。

在vue项目中使用

${app}/src/app.vue

<script>
export default { 
   
  name: 'App',
  mounted() { 
   
    // First we get the viewport height and we multiple it by 1% to get a value for a vh unit
    let vh = window.innerHeight * 0.01
    // Then we set the value in the --vh custom property to the root of the document
    document.documentElement.style.setProperty('--vh', `${ 
     vh}px`)

    // We listen to the resize event
    window.addEventListener('resize', () => { 
   
      // We execute the same script as before
      let vh = window.innerHeight * 0.01
      console.log(vh);
      document.documentElement.style.setProperty('--vh', `${ 
     vh}px`)
    })
  },
}
</script>

${app}/views/foo.vue

<style lang="scss" scoped>
.container {
  height: 100vh; /* Fallback for browsers that do not support Custom Properties */
  height: calc(var(--vh, 1vh) * 100 - 46px);
</style>

在之前设置为100vh,可以兼容某些不支持自定义属性的浏览器。

遗憾的是,仍然没有一种简单的方法可以让一个元素在不依赖javascript的情况下占据整个视口高度。height: 100vh是如此接近伟大,但考虑到它在移动设备上的局限性,最好避免它。

参考或翻译

Avoid 100vh On Mobile Web https://chanind.github.io/javascript/2019/09/28/avoid-100vh-on-mobile-web.html

The trick to viewport units on mobile https://css-tricks.com/the-trick-to-viewport-units-on-mobile/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138701.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微机原理与接口技术课程论文_微机原理与接口技术谁讲得好

    微机原理与接口技术课程论文_微机原理与接口技术谁讲得好《微机原理与接口技术综述论文》由会员分享,可在线阅读,更多相关《微机原理与接口技术综述论文(5页珍藏版)》请在人人文库网上搜索。1、微机原理与接口技术综述论文班级:10计本(1)班姓名:许生亮学号:1004011029微机原理课程综述论文内容摘要:微机原理与接口技术是计算机科学与技术专业非常重要的一门专业课程,它与前面的电路分析、数字逻辑、计算机组成原理,以及后面的体系结构、单片机应用、嵌入…

    2022年10月2日
  • CSS常见问题

    CSS常见问题

    2021年6月29日
  • JavaScript如何判断是否为数字?

    JavaScript如何判断是否为数字?JavaScript如何判断是否为数字?方法1:使用isNaN()函数isNaN()函数是js自带的全局函数,isNaN()函数用于检查其参数是否是非数字值。如果值x是特殊的非数字值NaN(或者能被转换为这样的值),返回的值就是true;如果值x是其他值,则返回false。isNaN()的缺点就在于null、空格以及空串会被按照0来处理NaN:NotaNumber<script>document.write(isNaN(123));//数字-

    2022年6月29日
  • 一阶惯性滤波电路图_matlab比例微分环节

    一阶惯性滤波电路图_matlab比例微分环节MATLAB中进行软件滤波仿真我身边有些朋友说现在在学校学习什么拉氏变换,Z变换,傅立叶变换没有用,传递函数没有用,差分方程没有用,只是纸上谈兵,我这里先就传递函数和拉氏变换和差分方程介绍几点不自量力的看法,我们学习拉氏变换主要是为了从脱离时域,因为时域分析有它的难度指数,我们从时域映射到S域,目的只有一个,那就是简化计算,正如我们在时域要计算卷积过来,卷积过去,我们把它映射到S域过后,就是乘积过…

    2022年9月27日
  • 移位运算用法总结

    移位运算用法总结位运算总结原文一、位运算应用口诀清零取位要用与,某位置一可用或若要取反和交换,轻轻松松用异或二、移位运算它们都是双目运算符,两个运算分量都是整形,结果也是整形。‘&lt;&lt;’左移:右边空出的位置补0,其值相当于乘以2。‘&gt;&gt;’右移:左边空出的位,如果是正数则补0,若为负数则补0或1,取决于所用的计算机系统OSX中补1。其值相当于除以2。…

    2022年7月13日
  • pycharm输出中文出现乱码的几种解决方法以及读取时打印出现乱码的解决[通俗易懂]

    pycharm输出中文出现乱码的几种解决方法以及读取时打印出现乱码的解决[通俗易懂]pycharm打印中文出现乱码,有几种情况第一种:对于这种情况,是普通的一种,你需要检查开头,是否加了#-*-coding:utf-8-*-还有importsysreload(sys)sys.setdefaultencoding(‘utf-8’)对于这两个处理中文输出的代码,最好每次处理中文时就加上,会减少很多问题第二种问题:

    2022年8月28日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号