• 技术文章 >web前端 >css教程

    关于css3的单位vw和vh的使用

    不言不言2018-06-20 11:44:23原创1950
    这篇文章主要介绍了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、vh 与 % 百分比的区别

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

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

    vmin、vmax 用处

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

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

    浏览器兼容性

    (1)桌面 PC

    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、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;
    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    关于CSS代码如何书写规范

    以上就是关于css3的单位vw和vh的使用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:css3 vh vw css3 vw css3 vh
    上一篇:关于CSS代码如何书写规范 下一篇:实如何使用CSS保持页面内容的宽高比
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• css3怎样实现不是直角的菱形效果• css样式中有文字描边吗• 12个值得收藏的 CSS 技巧!!• css中圆角属性值能用百分比吗• css3怎样实现翻转2次效果
    1/1

    PHP中文网