get reliable CSS vh
sizes for 1kb gzipped
Browsers don't always compute the vh unit the same way.Some mobile browsers compute the vh
CSS unit without taking care of the url bar.That means that a 100vh
div will overflow the viewport by the size of the url bar.
This is the current behavior for:
As explained in the chrome post, that make sense but make it hard to have a full hero top block.
This script will measure the difference and put it in a CSS var.You can read more on this css-trick article by Louis Hoebregts
It's doing a very good job:
https://github.com/rodneyrehm/viewport-units-buggyfill
But it has some problems with media-queries:
https://github.com/rodneyrehm/viewport-units-buggyfill/issues/13
<script src="https://unpkg.com/vh-check/dist/vh-check.min.js"></script>
<script>
(function () {
// initialize the test
var test = vhCheck();
}());
</script>
npm install vh-check
var check = require('vh-check')
var test = vhCheck() // return an object (see below)
npm install vh-check
import vhCheck from 'vh-check'
const test = vhCheck()
vh-check
CSS custom property if neededvh-check
will be updated on orientationchange
eventvh-check
will not be updated on scroll event by defaultvh-check will return a full object:
{
isNeeded: false,
// wether or not it's needed
value: 0,
// the CSS var value
vh: 480,
// a 100vh div size
windowHeight: 480,
// same value as window.innerHeight
offset: 0,
// difference between the above sizes
recompute: function computeDifference(),
// call this to programmatically get all the values and set the CSS var
// - this can be useful if you want to add your own listeners
// that will trigger a computation
unbind: function unbindVhCheckListeners(),
// call this to remove any window listeners created by vh-check
},
vhCheck()
main {
height: 100vh;
/* If you need to support browser without CSS var support (<= IE11) */
height: calc(100vh - var(--vh-offset, 0px));
/* enable vh fix */
}
You can pass the CSS var name as a param to vhCheck()
(default vh-offset
)
vhCheck('browser-address-bar')
In your CSS you will have to reference:
main {
min-height: 100vh;
min-height: calc(100vh - var(--browser-address-bar, 0px));
}
vh-check
allows you to have more control by passing a configuration object.
vhCheck({
cssVarName: 'vh-offset',
force: false,
bind: true,
redefineVh: false,
updateOnTouch: false,
onUpdate: function noop() {},
})
type: string
default: 'vh-offset'
Change the CSS var name
type: boolean
default: false
Set the CSS var even if 100vh
computation is good
type: boolean
default: true
Automatically bind to orientationchange
event
type: boolean
default: false
Change the CSS var value.Instead of being the total size of the gap, it will be 1% of the real window size.
You can find more explanation in this CSS Trick article
If you don't set a cssVarName
, the CSS custom property will be named vh
instead of vh-offset
.
So your CSS should be:
.my-element {
height: 100vh;
height: calc(var(--vh, 1vh) * 100);
}
type: boolean
default: false
Add an event listener on touchmove
to recompute the sizes
options.bind
is false
, this will be ignored as welltype: function
default: function noop(){}
you can specify a callback which will be called with an updated vh-check
object every time a computation occurre.
This library require requestAnimationFrame which is IE10+You'll need a polyfill if you want to support older browsers
To sum it up:
Browser | Library will work | CSS Custom property |
---|---|---|
<= IE 9 |
|
|
IE 10 & IE 11 |
|
|
IE Edge |
|
|
< iOS 9.3 |
|
|
https://hiswe.github.io/vh-check/
you'll need node
npm install
npm start
On iOS only, Chrome & Firefox will change dynamically the size of 1vh
depending on the display of the address bar.
Thus the library will return a not needed
value.
If you want to prevent your vh's components to resize, you could fix the size of the unit like this:
vhCheck({
bind: false,
redefineVh: true,
})
.my-div {
height: calc(var(--vh, 1vh) * 100);
}
See CHANGELOG.md
See MIGRATING.md
npm install
npm test
开发移动端 当设置100vh时,在各个浏览器计算高度不同,Chrome和Safari浏览器会计算底部tabbar和顶部url地址栏,所以产生比预期高的值, 至此 可借助vh-check来帮助适配各个浏览器的兼容 使用方法 npm install vh-check vue main.js 引入 import vhCheck from "vh-check"; //移动端浏览器100vh高度不一致
vminpoly A polyfill for CSS units vw, vh & vmin. Simple online demo right here. A more sophisticated responsive demo demonstrating vw/vh/vmin units along with media queries, working right down to IE5.
起因: 中间内容需要减去顶部内容与底部导航原先使用 100 vh - 245px, 发现pc端浏览器显示正常,移动端除了Chrome与Safari 都显示正常。 定位: 排查得知,这Safari iOS 与Chrome >= 56 中的vh包括了搜索栏的高度。 解决: 采用 vh-check npm i vh-check -s 在vue中main.js引入 import vhCheck from
我想知道如何计算和的值。我正在设计一个网站,使用和它的工作为我的文本完美。然而,我只是猜测。请告诉我这些单元是如何工作的,这样我以后就可以使用它们了。我还想知道他们是否有跨浏览器支持。
问题内容: 我刚刚了解了一个新的不常见的CSS单元。并分别测量视口的高度和宽度百分比。 vw和vh分别是窗口宽度和高度的百分比:100vw是宽度的100%,80vw是80%,依此类推。 这似乎与单位完全相同,这很常见。 在开发人员工具中,我尝试将值从vw / vh更改为%,反之亦然,并得到相同的结果。 两者之间有区别吗?如果没有,为什么要引入这些新单位? 问题答案: 可以达到任何高度。举例来说,如
我刚刚了解了一个新的不常见的CSS单元。和分别测量视口的高度和宽度的百分比。 我从Stack Overflow看这个问题,但它使单元看起来更加相似。 vw和vh单元是如何工作的 答案特别说 vw和vh分别是窗口宽度和高度的一个百分比:100vw是宽度的100%,80vw是80%等。 这似乎与单元完全相同,后者更为常见。 在Developer Tools中,我尝试将vw/vh的值更改为%,反之亦然,
我已经使用SOF很长时间了,但从来没有问过一个问题。今天我在Firefox的网站上,注意到它谈到了px和%就好像它已经过时了。该网站建议使用ViewHeight和view width或view像素(vh和vi或vpx)。用... 而且 ..????他们为什么要做出改变?
我将div设置为父容器 我在css文件中设置了100vh 我通过css中的背景色属性对其进行着色 我的问题是,这是一种有效的方法吗?有什么优点和缺点吗?还有你建议的其他方法。我只想给网页的背景上色。例如,Home组件,而不是其他组件,仅此一个。 如果不是,请用正确的方式建议我吗?
问题内容: 我正在使用100vh将div以行高垂直居中。该网站对vh和vw的支持率约为70%,这是一个公平的评估吗?建立网站时,您是否建议使用视口单位?我知道这有点主观,我只是在寻求比我更有经验的Web开发人员的意见。 编辑:感谢大家的投入,我希望它在移动设备上看起来不错,所以我想我不得不放弃vh。 问题答案: 在我看来,该统计数据显然是很公平的评估。 我认为必须由您来决定。如果您想使用最新的,最