红穆笔记
首頁 語言筆記 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標籤。甚至裏面的內容我也能添加一些文字…
👁 517
typecho文章页评论样式修改

typecho文章頁評論樣式修改 程序筆記 Typecho

需求使用 typecho 進行模板開發的時候,默認評論樣式很難看。因此需要評論需要重新輸出或進行樣式設定。默認的評論模板文件路徑是:comments.php主要使用的相關變量<?php $comments->gravatar('40', ''); ?> //頭像,有兩個參數,大小、…
👁 388
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