1. 程式人生 > >響應式網頁開發你不知道的那些事

響應式網頁開發你不知道的那些事

簡介

原文地址:www.dpfblog.com

響應式網頁設計通過使用彈性網格和佈局、響應式圖片、CSS media query等技術手段,使頁面能夠自動切換解析度、圖片尺寸及相關指令碼功能,以適應不同裝置,來滿足使用者在各種裝置環境下的需求。響應式網頁設計就是一個網站能夠相容多個終端——而不是為每個終端做一個特定的版本。

alt text

媒體查詢

什麼是媒體查詢

媒體查詢可以讓我們根據裝置顯示器的特性(如視口寬度、螢幕比例、裝置方向:橫向或縱向)為其設定CSS樣式,媒體查詢由媒體型別和一個或多個檢測媒體特性的條件表示式組成。媒體查詢中可用於檢測的媒體特性有 width 、 height 和 color (等)。使用媒體查詢,可以在不改變頁面內容的情況下,為特定的一些輸出裝置定製顯示效果。

如何在CSS檔案中引入媒體查詢

媒體查詢寫在CSS樣式程式碼的最後,CSS是層疊樣式表,在同一特殊性下,靠後的的樣式會重疊前面的樣式。

怎樣使用media

第一步:需要在html文件中新增以下程式碼,用來相容移動裝置的顯示效果

<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
  • width=device-width:寬度等於當前裝置的寬度
  • initial-scale=1:初始的縮放比例(預設為1)
  • minimum-scale=1:允許使用者縮放到得最小比例(預設為1)
  • maximum-scale=1:允許使用者縮放到得最大比例(預設為1)
  • user-scalable=no:使用者不能手動縮放

第二步:怎樣在CSS檔案中寫CSS響應式媒體查詢

body {
  font-size: 1.6rem;
  background: #f7f7f7;
}


@media only screen and (max-width: 50em) {
  body {
    font-size: 1.2rem;
    background: #fff;
  }
}
@media only screen and (min-width: 30.0625
em) and (max-width:50em)
{ } @media only screen and (max-width: 30em) { body { font-size: 1.0rem; background: #999; } }
  • 在不同寬度下,改變背景顏色和字型大小

相容性解決

部分IE瀏覽器(IE9以下),不支援 html5 和媒體查詢。需要在 html 文件 <head></head>標籤中新增以下程式碼。

<!--[if lt IE 9]>
    <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->

html5shiv:解決IE瀏覽器(IE6、IE7、IE8)不支援HTML5的問題
respond:使IE瀏覽器(IE6、IE7、IE8)支援媒體查詢中的min-width和max-width

相對長度單位

px: 畫素,1個px相當於一個畫素

em: 元素字型高度,相對參照物為父元素的 font-size。em 的值並不固定,會繼承父元素的字型大小

rem: 元素字型高度,相對參照物為根元素 html,相於參照固定不變。目前,除 IE9 以下版本,所有瀏覽器均已支援rem

注意:
1. 若rem沒有在根元素(html字型)指定參照值,那瀏覽器預設1 rem就是16px,若rem有指定值,則1rem就是等於指定值 。
2. html設定為62.5%或者10px時會失效,是因為小於12px或者75%的字型大小不支援換算。這可能與有些瀏覽器不支援12px以下的大小有關。所以,使用rem單位,html的字型預設字型大小必須設定為12px或以上。若小於12px則瀏覽器換算時自動預設字型為12px。

html {
  font-size: 62.5%;   /* 10÷16=62.5% */
}
body {
  font-size:1.2rem ;  /* 12÷10=1.2 */
}

在響應式網頁開發中,我們會更多的使用到 rem,而對 px的適應基本很少。

響應式廣告

現在大部分的網頁都會有一個滾動廣告(輪播圖),一個好的廣告滾動元件支援:
1. 支援不同的圖片數量
2. 支援響應式
3. 具有良好的相容性

現在網上滾動廣告元件非常多,在這裡我只推薦兩種 Owl Carousel 2myfocus,非常輕量,使用文件非常齊全。這裡,主要講一下 Owl Carousel 2的用法。

Owl Carousel 2 下載之後的目錄結構:

Owlcarousel2/
├── assets/
│   ├── owl.carousel.css
│   ├── owl.carousel.min.css   // 主樣式檔案
│   ├── owl.theme.default.css
│   ├── owl.theme.default.min.css  // 面板樣式檔案
│   ├── owl.theme.green.css
│   ├── owl.theme.green.min.css
│   └── owl.video.play.png
│
├── owl.carousel.js
├── owl.carousel.min.js
├── LICENSE-MIT
└── README.md

html結構:

<div class="ad">
   <div class="owl-carousel owl-theme">
      <div class="item">
         <img src="img/ad001.png" alt="">   //  圖片尺寸480*480
      </div>
      <div class="item">
         <img src="img/ad002.png" alt="">
      </div>
      <div class="item">
         <img src="img/ad003.png" alt="">
      </div>
   </div>
</div>

在html檔案中引入css:

<link rel="stylesheet" href="OwlCarousel2/assets/owl.carousel.min.css">
<link rel="stylesheet" href="OwlCarousel2/assets/owl.theme.default.min.css">

在html檔案中引入js:

<script src="js/jquery-3.2.1.min.js"></script>
<script src="OwlCarousel2/owl.carousel.min.js"></script>
<script src="js/main.js"></script>

main檔案自己定義:

$(document).ready(function(){
  $(".owl-carousel").owlCarousel({
    items: 1,     // 一屏看到的圖片數量
    loop: true,   // 迴圈滾動
    autoplay: true,   // 自動播放
    autoplayTimeout: 3000,   // 時間間隔
    autoplayHoverPause: true    //滑鼠放在圖片上暫停滾動
  });
});

當然現在滾動效果就已經完成了。不過還有一個問題,當螢幕尺寸放大或縮小時,始終都是480尺寸的圖片,看起來就是不爽,那麼如何能實現讓圖片在不同裝置下自動切換成我們想要的尺寸呢?那麼下面就需要用到響應式圖片~

響應式圖片

js和服務端控制

提前在圖片庫準備三張480、800、1600尺寸的圖片。

$(function(){
    function makeImageResponsive(){
        var img = $('.cotent img');
        var width = $(window).width();
        if(width <= 480){
            img.attr('src', '480.png');
        }else if(width <= 800){
            img.attr('src', '800.png');
        }else{
            img.attr('src', '1600.png');
        }
    }
$(window).on('resize load', makeImageResponsive);
})

srcset屬性

通過 srcset 指定給 標籤所有圖片源的資訊。然後使用逗號分隔列出一個從小到大的圖片源列表。每個圖片源後可以跟w描述符或者x描述符

<img src="img/480.png" srcset="img/480.png 480w,img/800.png 800w, img/1600.png 1600w alt="">

如果瀏覽器支援 srcset 則會根據螢幕寬度採用最佳的圖片,否則直接下載 src 屬性內的影象。

picture屬性

picture是html5新屬性,可以放置多個source標籤,以指定不同的影象檔名,進而根據不同的條件進行載入。
由於現在很多瀏覽器對於picture這個標籤還不支援,所以我們需要引用picturefill.js來解決。

 <div class="owl-carousel owl-theme">
    <div class="item">
        <picture>
            <source srcset="img/ad001-l.png" media="(min-width: 50em)">
            <source srcset="img/ad001-m.png" media="(min-width: 30em)">
            <img srcset="img/ad001.png" alt="">
        </picture>
    </div>
    <div class="item">
        <picture>
            <source srcset="img/ad002-l.png" media="(min-width: 50em)">
            <source srcset="img/ad002-m.png" media="(min-width: 30em)">
            <img srcset="img/ad002.png" alt="">
        </picture>
    </div>
   <div class="item">
        <picture>
            <source srcset="img/ad003-l.png" media="(min-width: 50em)">
            <source srcset="img/ad003-m.png" media="(min-width: 30em)">
            <img srcset="img/ad003.png" alt="">
        </picture>
    </div>
</div>


<!-- 在 body 末尾引入-->
<script src="js/vendor/picturefill.min.js"></script>

在大於800px的時候,展示ad00x-l這個large圖片。在大於480px的時候,展示ad00x-m這個medium圖片。否則,展示ad00x小圖片。完美解決圖片響應式問題,極力推薦這種方法。

打包釋出

當所有的程式碼完成之後,我們的網站就可以釋出了,在釋出之前我們還可以對程式碼進行優化:
- 壓縮
- 合併
- 增加版本號

工具打包:

  • Grunt:自動化構建工具
  • Gulp:自動化構建工具
  • Webpack:靜態資源打包工具

3個主流工具我就不詳細一 一介紹了。這裡,主要使用 gulp 來打包釋出,首先來安裝gulp。

第一步:安裝Nodejs

保持預設設定即可,一路Next,安裝很快就結束了。

然後開啟命令提示符,輸入 node -vnpm -v,出現版本號則說明 Node.js 環境配置成功,第一步完成!!!

第二步:安裝Git

安裝完成後,桌面右鍵,開啟 Git Bush Here,輸入 git --version,出現版本號則說明 Git 環境配置成功,第二步完成!!!

第三步:安裝Gulp(全域性)

桌面右鍵,開啟 Git Bush Here,輸入npm install gulp -g

安裝完成後,同樣輸入 gulp -v,出現版本號則說明,則說明安裝成功。

第四步:作為專案的開發依賴(devDependencies)安裝

$ npm install --save-dev gulp

第五步:在專案根目錄下建立一個名為 gulpfile.js 的檔案,並且新建一個 dist 資料夾,用於存放壓縮後的檔案

var gulp = require('gulp');
var rev = require('gulp-rev');
var revReplace = require('gulp-rev-replace');
var useref = require('gulp-useref');
var filter = require('gulp-filter');
var uglify = require('gulp-uglify');
var csso = require('gulp-csso');


gulp.task('default', function() {
    var jsFilter = filter('**/*.js', {restore: true});
    var cssFilter = filter('**/*.css', {restore: true});
    var indexHtmlFilter = filter(['**/*', '!**/index.html'], {restore: true});


    return gulp.src('src/index.html')
        .pipe(useref())
        .pipe(jsFilter)
        .pipe(uglify())
        .pipe(jsFilter.restore)
        .pipe(cssFilter)
        .pipe(csso())
        .pipe(cssFilter.restore)
        .pipe(indexHtmlFilter)
        .pipe(rev())
        .pipe(indexHtmlFilter.restore)
        .pipe(revReplace())
        .pipe(gulp.dest('dist'));
});

第六步:安裝以上需要的gulp外掛:

$ npm install gulp gulp-rev gulp-rev-replace gulp-useref gulp-filter gulp-filter gulp-uglify  gulp-csso --save-dev

第七步:將 htlm 中需要打包合併的檔案添加註釋

<!-- build:css css/combined.css -->
    <link rel="stylesheet" href="css/normalize.css">
    <link rel="stylesheet" href="js/vendor/OwlCarousel2/assets/owl.carousel.min.css">
    <link rel="stylesheet" href="js/vendor/OwlCarousel2/assets/owl.theme.default.min.css">
    <link rel="stylesheet" href="css/main.css">
<!-- endbuild -->




<!-- build:js js/combined.js -->
<script src="js/jquery-3.2.1.min.js"></script>
<script src="js/vendor/OwlCarousel2/owl.carousel.min.js"></script>
<script src="js/vendor/picturefill.min.js"></script>
<script src="js/main.js"></script>
<!-- endbuild -->

第八步:執行gulp

$ gulp

執行gulp之後,你會在新建的 dist 資料夾中看到打包生成的檔案,目錄如下:

dist/
├── css/
│   ├──combined-3f8e363e08.css   //  打包合併後的css檔案
│   └──combined-56ca943019.css
├── img/
├── js/
│   └── combined-7762fa2c22.js   //  打包合併後的js檔案
└── index.html

這時候 css, js 檔案都被壓縮合併成了一個檔案,看起來更加輕量。如果你修改了原始碼中的內容,只需再次執行gulp ,則會生成另一個心得css或js檔案,版本號會更新,不會覆蓋之前的檔案。如上面生成新的 combined-56ca943019.css 檔案,也保留之前的 combined-3f8e363e08.css

總結

本篇文章包含了響應式網站開發中常見的問題及解決方案,希望對熱愛前端開發的同學有所幫助,能讓你們在以後的響應式開發中少走彎路。