css3新单位vw、vh的使用详解

简介: 响应式布局的单位我们第一时间会想到通过rem单位来实现适配,但是它还需要内嵌一段脚本去动态计算跟元素大小。比如:(function (doc, win) {  let docEl = doc.documentElement  let resizeEvt = 'orientationchang...

响应式布局的单位我们第一时间会想到通过rem单位来实现适配,但是它还需要内嵌一段脚本去动态计算跟元素大小。

比如:

(function (doc, win) {

  let docEl = doc.documentElement

  let resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'

  let recalc = function () {

    var clientWidth = docEl.clientWidth

    if (!clientWidth) return

    docEl.style.fontSize = 14 * (clientWidth / 320) + 'px'

  }

  if (!doc.addEventListener) return

  win.addEventListener(resizeEvt, recalc, false)

  doc.addEventListener('DOMContentLoaded', recalc, false)

})(document, window)

那有没有一个单位不需要JS和CSS耦合在一起的单位?答案是有的,就是vw/vh。

vw = view width

vh = view height

这两个单位是CSS3引入的,以上称为视口单位允许我们更接近浏览器窗口定义大小。

vw、vh、vmin、vmax 的含义

(1)vw、vh、vmin、vmax 是一种视窗单位,也是相对单位。它相对的不是父节点或者页面的根节点。而是由视窗(Viewport)大小来决定的,单位 1,代表类似于 1%。

视窗(Viewport)是你的浏览器实际显示内容的区域—,换句话说是你的不包括工具栏和按钮的网页浏览器。

(2)具体描述如下:

  • vw:视窗宽度的百分比(1vw 代表视窗的宽度为 1%)
  • vh:视窗高度的百分比
  • vmin:当前 vw 和 vh 中较小的一个值
  • vmax:当前 vw 和 vh 中较大的一个值

 

vw、vh 与 % 百分比的区别

(1)% 是相对于父元素的大小设定的比率,vw、vh 是视窗大小决定的。

(2)vw、vh 优势在于能够直接获取高度,而用 % 在没有设置 body 高度的情况下,是无法正确获得可视区域的高度的,所以这是挺不错的优势。

 

vmin、vmax 用处

做移动页面开发时,如果使用 vw、wh 设置字体大小(比如 5vw),在竖屏和横屏状态下显示的字体大小是不一样的。

由于 vmin 和 vmax 是当前较小的 vw 和 vh 和当前较大的 vw 和 vh。这里就可以用到 vmin 和 vmax。使得文字大小在横竖屏下保持一致。

 

浏览器兼容性

(1)桌面 PC

  • Chrome:自 26 版起就完美支持(2013年2月)
  • Firefox:自 19 版起就完美支持(2013年1月)
  • Safari:自 6.1 版起就完美支持(2013年10月)
  • Opera:自 15 版起就完美支持(2013年7月)
  • IE:自 IE10 起(包括 Edge)到现在还只是部分支持(不支持 vmax,同时 vm 代替 vmin)

(2)移动设备

  • Android:自 4.4 版起就完美支持(2013年12月)
  • iOS:自 iOS8 版起就完美支持(2014年9月)

 

如何利用视口单位适配页面

仅使用vw作为CSS单位

1.根据设计稿的尺寸转换为vw单位(SASS函数编译)

//iPhone 6尺寸作为设计稿基准

$vm_base: 375;

@function vm($px) {

    @return ($px / 375) * 100vw;

}

2.无论是文本还是布局高宽、间距等都使用 vw

 < div class="mod_nav">

            < nav class="mod_nav_list" v-for="n in 5">

                < a href="#" class="mod_nav_list_item">

                    < span class="mod_nav_list_item_logo">

                < img src="http://jdc.jd.com/img/80">

                    < /span>

                    < p class="mod_nav_list_item_name">导航入口< /p>

                < /a>

            < /nav>

< /div>

.mod_nav {

    background: #fff;

    &_list {

        display: flex;

        padding: vm(15) vm(10) vm(10);

        &_item {

            flex: 1;

            text-align: center;

            font-size: vm(10);

            &_logo {

                display: block;

                margin: 0 auto;

                width: vm(40);

                height: vm(40);

                img {

                    display: block;

                    margin: 0 auto;

                    max-width: 100%;

                }

            }

            &_name {

                margin-top: vm(2);

            }

        }

    }

}

 

最优做法——搭配vw和rem

使用vm作为css单位代码量确实减少很多,但是你会发现它是利用视口单位实现,依赖于视口大小而自动缩放,失去了最大最小宽度的限制。

于是,联想到不如结合rem单位来实现布局?rem 弹性布局的核心在于动态改变根元素大小,那么我们可以通过:·

  1. 给根元素大小设置随着视口变化而变化的 vw 单位,这样就可以实现动态改变其大小。
  2. 限制根元素字体大小的最大最小值,配合 body 加上最大宽度和最小宽度

这样我们就能够实现对布局宽度的最大最小限制。因此,根据以上条件,我们可以得出代码实现如下:

// rem 单位换算:定为 75px 只是方便运算,750px-75px、640-64px、1080px-108px,如此类推

$vm_fontsize: 75; // iPhone 6尺寸的根元素大小基准值

@function rem($px) {

     @return ($px / $vm_fontsize ) * 1rem;

}

// 根元素大小使用 vw 单位

$vm_design: 750;

html {

    font-size: ($vm_fontsize / ($vm_design / 2)) * 100vw;

    // 同时,通过Media Queries 限制根元素最大最小值

    @media screen and (max-width: 320px) {

        font-size: 64px;

    }

    @media screen and (min-width: 540px) {

        font-size: 108px;

    }

}

// body 也增加最大最小宽度限制,避免默认100%宽度的 block 元素跟随 body 而过大过小

body {

    max-width: 540px;

    min-width: 320px;

}

 

 

相关文章
|
1月前
|
编解码 前端开发 UED
解密CSS单位:px、em、vh的区别与应用
解密CSS单位:px、em、vh的区别与应用
76 0
|
1月前
|
编解码 前端开发 小程序
CSS中rpx、px、em、rem、%、vh、vw各自都代表什么
CSS中rpx、px、em、rem、%、vh、vw各自都代表什么
60 0
|
20天前
|
编解码 前端开发 UED
解密CSS单位:px、em、vh的区别与应用
解密CSS单位:px、em、vh的区别与应用
14 1
|
1月前
|
编解码 前端开发
CSS中单位:【px和%】【em和rem】【vw|vh|vmin|vmax】的区别
CSS中单位:【px和%】【em和rem】【vw|vh|vmin|vmax】的区别
|
前端开发 小程序
css:尺寸单位整理px、rem、em、vh、rpx
css:尺寸单位整理px、rem、em、vh、rpx
79 0
|
编解码 前端开发
【CSS】一文搞懂 em、px、rem、vh、vw 的区别!🔥🔥
前言 大家好,我是HoMeTown,今天聊一下CSS中em、px、rem、vh、vw这些单位都有什么区别,什么时候该用什么单位,如何正确使用。
167 0
|
编解码 前端开发
css中rem em vh px各自代表的含义
css中rem em vh px各自代表的含义
128 0
css中rem em vh px各自代表的含义
|
前端开发
css:尺寸单位整理px、rem、em、vh、rpx
css:尺寸单位整理px、rem、em、vh、rpx
103 0
css:尺寸单位整理px、rem、em、vh、rpx
|
3天前
|
前端开发
HTML+CSS练习小项目——百叶窗
HTML+CSS练习小项目——百叶窗
|
1天前
|
XML 前端开发 JavaScript
HTML、CSS、JavaScript有什么区别
HTML、CSS、JavaScript有什么区别