视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
关于css3的单位vw和vh的使用
2020-11-27 18:48:25 责编:小采
文档

这篇文章主要介绍了css3新单位vw、vh的使用教程,本文通过实例代码给大家介绍vw、vh、vmin、vmax 的含义及vw、vh与%百分比的区别,感兴趣的朋友一起看看吧

响应式布局的单位我们第一时间会想到通过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

    < p 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>
    < /p>
    .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 弹性布局的核心在于动态改变根元素大小,那么我们可以通过:·

    给根元素大小设置随着视口变化而变化的 vw 单位,这样就可以实现动态改变其大小。

    根元素字体大小的最大最小值,配合 body 加上最大宽度和最小宽度

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

    // rem 单位换算:定为 75px 只是方便运算,750px-75px、0-px、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: px;
     }
     @media screen and (min-width: 540px) {
     font-size: 108px;
     }
    }
    // body 也增加最大最小宽度,避免默认100%宽度的 block 元素跟随 body 而过大过小
    body {
     max-width: 540px;
     min-width: 320px;
    }

    下载本文
    显示全文
    专题