红穆笔记
首页 语言笔记 css vh和vw自适应
语言笔记 CSS

css vh和vw自适应

css vh和vw自适应

  在移动端中利用REM的相对于根HTML进行改变,通过一段JS实现了移动端自适应,本文则使用纯CSS视口单位来自行自适应,虽然现在的兼容性还没法完全能够接受,但不妨碍你认识这个vw和vh的强大。 响应式布局的实现依靠媒体查询( Media Queries )来实现,选取主流设备宽度尺寸作为断点针对性写额外的样式进行适配,但这样做会比较麻烦,只能在选取的几个主流设备尺寸下呈现完美适配。 即使是通过 rem 单位来实现适配,也是需要内嵌一段脚本去动态计算根元素大小。 近年来,随着移动端对视口单位的支持越来越成熟、广泛,使得我们可以尝试一种新的办法去真正地适配所有设备尺寸。

css vh和vw自适应

认识视口单位( Viewport units )

首先,我们要了解什么是视口。 在业界,极为推崇的一种理论是 Peter-Paul Koch (江湖人称“PPK大神”)提出的关于视口的解释——在桌面端,视口指的是在桌面端,指的是浏览器的可视区域;而在移动端较为复杂,它涉及到三个视口:分别是 Layout Viewport(布局视口)、 Visual Viewport(视觉视口)、Ideal Viewport。 而视口单位中的“视口”,在桌面端,毫无疑问指的就是浏览器的可视区域;但是在移动端,它指的则是三个 Viewport 中的 Layout Viewport 。 视口单位中的“视口” 根据CSS3规范,视口单位主要包括以下4个:

  vw : 1vw 等于视口宽度的1%

  vh : 1vh 等于视口高度的1%

  vmin : 选取 vw 和 vh 中最小的那个

  vmax : 选取 vw 和 vh 中最大的那个

css vh和vw自适应

视口单位区别于%单位,视口单位是依赖于视口的尺寸,根据视口尺寸的百分比来定义的;而%单位则是依赖于元素的祖先元素。 用视口单位度量,视口宽度为100vw,高度为100vh(左侧为竖屏情况,右侧为横屏情况) 例如,在桌面端浏览器视口尺寸为650px,那么 1vw = 650 * 1% = 6.5px(这是理论推算的出,如果浏览器不支持0.5px,那么实际渲染结果可能是7px)。

css vh和vw自适应

兼容性

其兼容性如下图所示,可以知道:在移动端 iOS 8 以上以及 Android 4.4 以上获得支持,并且在微信 x5 内核中也得到完美的全面支持。 截图来自Can I Use 截图来自X5内核-Can I Use

  利用视口单位适配页面 对于移动端开发来说,最为重要的一点是如何适配页面,实现多终端的兼容,不同的适配方式各有千秋,也各有缺点。 就主流的响应式布局、弹性布局来说,通过 Media Queries 实现的布局需要配置多个响应断点,而且带来的体验也对用户十分的不友好:布局在响应断点范围内的分辨率下维持不变,而在响应断点切换的瞬间,布局带来断层式的切换变化,如同卡带的唱机般“咔咔咔”地一下又一下。 而通过采用rem单位的动态计算的弹性布局,则是需要在头部内嵌一段脚本来进行监听分辨率的变化来动态改变根元素字体大小,使得 CSS 与 JS 耦合了在一起。 有没有办法能够解决这样的问题呢? 答案是肯定的,通过利用视口单位实现适配的页面,是既能解决响应式断层问题,又能解决脚本依赖的问题的。

做法一

仅使用vw作为CSS单位 在仅使用 vw 单位作为唯一应用的一种 CSS 单位的这种做法下,我们遵守: 1.对于设计稿的尺寸转换为vw单位,我们使用Sass函数编译

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

  $vm_base: 375;

  @function vw($px) {

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

  } 2.无论是文本还是布局高宽、间距等都使用 vw 作为 CSS 单位

  .mod_nav {

  background-color: #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);

  }

  }

  }

  } 

3.1物理像素线(也就是普通屏幕下 1px ,高清屏幕下 0.5px 的情况)采用 transform 属性 scale 实现。


  .mod_grid {

  position: relative;

  &::after {

  // 实现1物理像素的下边框线

  content: '';

  position: absolute;

  z-index: 1;

  pointer-events: none;

  background-color: #ddd;

  height: 1px;

  left: 0;

  right: 0;

  top: 0;

  @media only screen and (-webkit-min-device-pixel-ratio: 2) {

  -webkit-transform: scaleY(0.5);

  -webkit-transform-origin: 50% 0%;

  }

  }
  } 

4.对于需要保持高宽比的图,应改用 padding-top 实现

  .mod_banner {

  position: relative;

  padding-top: percentage(100/700); // 使用padding-top

  height: 0;

  overflow: hidden;

  img {

  width: 100%;

  height: auto;

  position: absolute;

  left: 0;

  top: 0;

  }

css vh和vw自适应

由此,我们能够实现一个常见布局的页面效果如下: 体验地址点击此处

做法二

搭配vw和rem,布局更优化 这样的页面虽然看起来适配得很好,但是你会发现由于它是利用视口单位实现的布局,依赖于视口大小而自动缩放,无论视口过大还是过小,它也随着视口过大或者过小,失去了最大最小宽度的限制。 当然,你可以不在乎这样微小的不友好用户体验,但我们还是尝试下追求修复这样的小瑕疵吧。 于是,联想到不如结合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;

  } 

这里就不再给出截图,但你可以点击此处在线地址进行体验。

  小结 相对于做法一,个人比较推崇做法二,有以下两点原因: 第一,做法二相对来说用户视觉体验更好,增加了最大最小宽度的限制; 第二,更重要是,如果选择主流的rem弹性布局方式作为项目开发的适配页面方法,那么做法二更适合于后期项目从 rem 单位过渡到 vw 单位。只需要通过改变根元素大小的计算方式,你就可以不需要其他任何的处理,就无缝过渡到另一种CSS单位,更何况vw单位的使用必然会成为一种更好适配方式,目前它只是碍于兼容性的支持而得不到广泛的应用。

微信赞赏

微信

支付宝赞赏

支付宝

✍️ 作者: 红穆

网站管理员 · 感谢阅读,更多精彩内容敬请关注

作者主页 查看主页 →

相关文章

css 定位(position)

css 定位(position) 语言笔记 CSS

语法:position:static | relative | absolute | fixed | center | page | sticky默认值:static适用于:除display属性定义为table-column-group | table-column之外的所有元素继承性:无动画性:否…
👁 119
CSS border

CSS border 语言笔记 CSS

div{ border:2px solid; border-radius:25px; }定义和用法border-radius 属性是一个简写属性,用于设置四个 border-radius 属性。提示:该属性允许您为元素添加圆角边框!默认值:0继承性:no版本:CSS3JavaScript 语法:ob…
👁 175

推荐阅读

资源网站typecho001模板

资源网站typecho001模板 程序笔记 Typecho

typecho001模板板本请勿修改本模板文件夹名称 文件夹名称为:typecho001 1.4修复文章页面js输出问题1.3修复未安装插件时的报错提示优化列表页代码输出1.2修复评论功能增加自定义首页标题1.1修复评论回复不对称功能添加首页单独的标题设置功能增加网站favicon.ico图标增加一…
👁 198
typecho分页样式的修改

typecho分页样式的修改 程序笔记 Typecho

大人,时代变了!目前typecho最完美的解决方案了,因为百度只能看到固定思维的代码。实际生成的html代码,干净到让人窒息完全的自定义,包括给li元素加上class,给a元素加上class,给上一页下一页加上class,去除typecho自带用于表示更多的li标签。甚至里面的内容我也能添加一些文字…
👁 516
typecho文章页评论样式修改

typecho文章页评论样式修改 程序笔记 Typecho

需求使用 typecho 进行模板开发的时候,默认评论样式很难看。因此需要评论需要重新输出或进行样式设定。默认的评论模板文件路径是:comments.php主要使用的相关变量<?php $comments->gravatar('40', ''); ?> //头像,有两个参数,大小、…
👁 387
Typecho 对数据库的增删改查操作方法 API

Typecho 对数据库的增删改查操作方法 API 程序笔记 Typecho

Typecho数据库提供了非常易用的api,和原生SQL写法没有太大的差别,同时也很好地处理了SQL常见的安全问题,如sql注入。本文从实用角度出发,介绍了typecho操作数据库的常用场景以及相关api用法。表创建和删除在Typecho插件开发过程中,往往需要创建自己的表。上文提到Typecho_…
👁 552
PHP ob函数记录

PHP ob函数记录 语言笔记 PHP

下面3个函数的用法 ob_get_contents(); ob_end_clean(); ob_start(); 可以借助这几个函数实现缓冲本地文件,以及执行本地脚本代码。 使用ob_start()把输出的代码存到缓冲区,页面不会显示出来; 然后用ob_get_contents得到缓冲区的数据。 o…
👁 141
Typecho调用热门评论文章和调用最新文章的方法总结

Typecho调用热门评论文章和调用最新文章的方法总结 程序笔记 Typecho

Typecho文章调用Typecho程序在设计主题的时候,侧栏有些时候需要调用热评文章或者最新文章。我们可以在指定的位置通过脚本直接调用。在这篇文章整理这个调用文章的方法,以后在有需要的模板中可以直接调用使用。其实设计主题就那么回事,静态模板搞定后,就是直接调用。最新文章调用 <?php $t…
👁 295