1. 程式人生 > >CSS系列——前端進階之路:初涉Less

CSS系列——前端進階之路:初涉Less

前言:最近幫一個朋友解決點問題,在檢視元件原始碼的時候涉及到了less語法,這可難倒博主了。沒辦法,既然用到就要學唄,誰讓咱是無所不能的程式猿呢!所以今天來學習下Less,算是筆記,也希望給初學less的園友提供參考,如果你是前端大神,此文就沒必要看了哈。算了,扯遠了哈,進入正題。

一、Less介紹

1、官方介紹

Less 是一門 CSS 預處理語言,它擴充了 CSS 語言,增加了諸如變數、混合(mixin)、函式等功能,讓 CSS 更易維護、方便製作主題、擴充。Less 可以執行在 Node 或瀏覽器端。

2、自己理解

Less是一門動態CSS語言,使得CSS樣式更加靈活地作用於Html標籤

。試想如果沒有Less,我們要對樣式做一些邏輯計算的時候只能依靠Js去實現,有了Less之後,可以方便地動態給Html標籤設定樣式。比如一個最常見的需求,在當前瀏覽器的寬度小於500px的時候,給某一個div設定一個樣式,使用less+css3就能很簡單的解決問題。當然,這只是其中一個場景,less裡面還能進行一些常見的條件和邏輯判斷。總的來說,Less賦予了CSS邏輯運算的能力。

除此之外,動態CSS語法還有一個重要的作用就是提高樣式程式碼的可維護性。比如一個最簡單的,我們可以定義一個全域性的顏色變數@aaa:#222,系統裡面所有的預設顏色用的@aaa來寫的,這個時候如果需要修改這個全域性顏色,我們只需要改下@aaa變數的值就好了,其他地方不用做任何修改,這點,作為程式設計人員應該很容易理解。

說一千道一萬,實踐才是王道,下面跟著博主一起來看看一些Less最基礎的用法吧。

3、Less、Sass、Stylus

說到Less,可能又有人不服了,可能有人要說:Less過時了,Sass是趨勢,你看bootstrap3用的是less,怎麼bootstrap4就改用sass了等等。博主想,它們三者作為Css的預處理技術,肯定都有自己的優勢吧。今天在這裡不想討論三者的優缺點,先來學習Less吧,想那麼多幹嘛!

二、Less使用入門

關於Less的入門教程,網上也是一搜一大把,基本都和Less中文網上面差不多。Less既可以執行在Node服務端,也可以執行在瀏覽器客戶端。博主對Node不熟,所以這篇還是看看其在瀏覽器端的使用,其實沒有關係,不管在哪裡使用,其基礎的用法都是一樣的。

一般來說,客戶端執行Less分為兩種情況:

  • 第一種方式是直接在html頁面引用.less檔案,然後藉助less.js去編譯less檔案動態生成css樣式而存在於當前頁面,這種方式適用於開發模式
  • 第二種方式是我們首先寫好.less檔案的語法,然後藉助工具生成對應的.css檔案,然後客戶端直接引用.css檔案即可。比如我們常用的bootstrap.css就是通過工具編譯而成,這種方式更適合執行環境

1、開發模式下使用Less

(1)首先我們在專案下面新建一個less檔案,命名為less.less,裡面寫入最簡單的語法

@base: #f938ab;

div{
    background-color:@base;
    padding:50px;
}

(2)然後在html頁面head裡面引用該less檔案

<link rel="stylesheet/less" type="text/css" href="~/Content/less.less" />

(3)去 less開源地址 下載less.js檔案,然後引入該檔案。

<script src="less.js" type="text/javascript"></script>

或者你如果不想去下載less.js檔案,也可以直接使用CDN的方式引用less.js,博主就是這麼做的。

<script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script>

需要說明的是,less.js的作用就是編譯less.less檔案,使它成為瀏覽器能讀懂的css樣式。

(4)在引用less.js之前,需要一個less變數,宣告編譯less的環境引數,所以最終所有引用檔案如下:

  <link rel="stylesheet/less" type="text/css" href="~/Content/less.less" />
    <script type="text/javascript">
    less = {
        env: "development",
        async: false,
        fileAsync: false,
        poll: 1000,
        functions: {},
        dumpLineNumbers: "comments",
        relativeUrls: false,
        rootpath: ":/a.com/"
    };
    </script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script>

這裡要強調的是,less變數的宣告必須要在less.js的引用之前。

(5)除錯執行

我們直接執行專案,得到如下結果

 如果你的除錯環境不是Visual Studio,就不會有這個問題!對於上述問題,需要在web.config裡面配置如下節點

<system.webServer>
  <staticContent>
    <mimeMap fileExtension=".less" mimeType="text/css" />
  </staticContent >
</system.webServer>

然後再次執行,可以看到編譯生成的css如下

2、執行模式下使用Less

如果是執行環境,最好是將less.less編譯成.css檔案,然後直接引用生成的.css檔案即可,博主不熟悉Node的環境,這裡,博主介紹一款less生成css的工具:Koala。首先去官網下載安裝檔案,安裝執行之後得到如下介面:

然後將less所在的目錄拖到介面中間

點選Compile按鈕。將會在less.less的同級目錄下生成一個less.css檔案

然後直接引用這個css檔案即可。有了工具是不是很easy~~

三、常見用法示例

初初入門,我們還是從最基礎的開始吧!

1、從第一個Less變數開始

@base: #f938ab;

div{
    background-color:@base;
    padding:50px;
}

頁面html程式碼:

<body>
    <div>
        第一個Less樣式
    </div>
</body>

編譯之後的Css樣式如下:

效果預覽:

以上是一個最基礎的Less變數,在.less檔案裡面定義一個全域性的@base變數,那麼在該檔案裡面所有地方均可呼叫。

需要說明的是(1)Less裡面的變數都是以@作為變數的起始標識,變數名由字母、數字、_和-組成;(2)在一個檔案裡面定義的同名變數存在全域性變數和區域性變數的區別(後面介紹);

2、變數計算

@nice-blue: #f938ab;
@light-blue: @nice-blue + #333;

div {
  background-color: @light-blue;
}

編譯得到結果:

div {
  background-color: #ff6bde;
}

這說明,在Less裡面,變數可以動態計算。

3、變數混合

混合可以將一個定義好的class A輕鬆的引入到另一個class B中,從而簡單實現class B繼承class A中的所有屬性。我們還可以帶引數地呼叫,就像使用函式一樣。我們來看下面的例子:

.rounded-corners (@radius: 15px) {
  border-radius: @radius;
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
}

#div1 {
    padding:20px;
    width:200px;
    height:100px;
    border:2px solid red;
  .rounded-corners;
}
#div2 {
    padding:20px;
    width:200px;
    height:100px;
    border:2px solid green;
  .rounded-corners(30px);
}

編譯後的結果你是否猜到了呢:

#div1 {
  padding: 20px;
  width: 200px;
  height: 100px;
  border: 2px solid red;
  border-radius: 15px;
  -webkit-border-radius: 15px;
  -moz-border-radius: 15px;
}
#div2 {
  padding: 20px;
  width: 200px;
  height: 100px;
  border: 2px solid green;
  border-radius: 30px;
  -webkit-border-radius: 30px;
  -moz-border-radius: 30px;
}

原理解析:最上面的 @radius 變數可以理解為一個方法的引數,然後“15px”可以理解為引數的預設值。首先我們定義一個動態樣式 .rounded-corners ,這個樣式有一個動態的引數 @radius ,這個引數的預設值是“15px”。我們呼叫的時候如果不傳引數,那麼 @radius 就等於15px,如果我們傳了30px,那麼@radius就是我們傳的引數值。如果這樣理解是否會好一點呢,是不是有點類似我們程式設計裡面的“方法”的概念。如果按照面向物件的原理也很好理解,#div1和#div2繼承.rounded-corners這個樣式,所以可以直接使用,然後如果“子類”(#div2)有不同於“父類”的屬性,可以“重寫”,是不是一樣一樣的。

既然做了測試,我們還是來看看測試結果:

    <div id="div1">div1</div>
    <div id="div2">div2</div>

4、巢狀規則

在CSS裡面,我們也經常可以見到標籤樣式巢狀的寫法,那麼在Less裡面它是怎麼實現的呢?我們來下下面的Less程式碼

#div1 {
    h1 {
        font-size: 26px;
        font-weight: bold;
    }
    span {
        font-size: 12px;
        a {
            text-decoration: none;
            &:hover {
                border-width: 1px;
            }
        }
    }
}

編譯後的CSS:

#div1 h1 {
  font-size: 26px;
  font-weight: bold;
}
#div1 span {
  font-size: 12px;
}
#div1 span a {
  text-decoration: none;
}
#div1 span a:hover {
  border-width: 1px;
}

Less的這種寫法好處是顯而易見,標籤層級結構清晰可見,並且能減少css程式碼量。但博主猜想肯定有人會不習慣這種寫法,就是因為這種結構層級深,所以在閱讀上面還是會有人不習慣,不管怎麼樣,且用且珍惜吧。

5、函式的使用

在Less裡面函式的概念還是比較容易理解的。比如我們有這麼一段定義:

.mixin (dark, @color) {
  color: darken(@color, 10%);
}
.mixin (light, @color) {
  color: lighten(@color, 10%);
}
.mixin (@_, @color) {
  display: block;
}

然後有這麼一句呼叫

@switch: light;

.class {
  .mixin(@switch, #888);
}

編譯得到

.class {
  color: #a2a2a2;
  display: block;
}

以上不難理解,就是一個簡單的邏輯判斷。

6、條件判斷

 在上述“函式的使用”裡面,我們看到Less支援“等於”的匹配方式,除此之外,Less裡面還支援大於、小於等條件判斷的語法,此之所謂“導引混合”。先來看看它的語法:

首先定義幾個條件判斷的“方法”

.mixin (@a) when (lightness(@a) >= 50%) {
  background-color: black;
}
.mixin (@a) when (lightness(@a) < 50%) {
  background-color: white;
}
.mixin (@a) {
  color: @a;
}

然後呼叫該“方法”

.class1 { .mixin(#ddd) }
.class2 { .mixin(#555) }

你猜結果是什麼?編譯結果如下:

.class1 {
  background-color: black;
  color: #ddd;
}
.class2 {
  background-color: white;
  color: #555;
}

原理解析:不知道你有沒有猜對結果,反正最開始博主是猜錯了的。when的語法不難理解,就是一個條件判斷,關鍵是下面的color從哪裡來的。原來在Less裡面是一種混合呼叫的方式,也就是說,如果定義了三個函式mixin,分別對應有三個不同的條件,那麼我們呼叫mixin函式的時候如果三個的條件都滿足,那麼它三個的結果都會得到。這就是為什麼我們class1和class2得到如上結果。在Less裡面所有的運算子有: >、 >=、 =、 =<、 <,除了這5個運算子,Less還提供了基於值型別進行判斷的方法:iscolor()、isnumber()、isstring()、iskeyword()、isurl()等。用法如下:

.mixin (@a, @b: 0) when (isnumber(@b)) { ... }
.mixin (@a, @b: black) when (iscolor(@b)) { ... }

除了上述條件表示式以外,Less還提供了and、not等邏輯表示式。基礎用法如:

.mixin (@b) when not (@b > 0) {
       background-color:blue;
 }

7、變數作用域

Less的作用域很好理解,就是我們常說的全域性變數和區域性變數的區別,記住Less裡面變數名可以重複。

@aaa: red;

#div1 {
  @aaa: green;
  #header {
    color: @aaa; 
  }
}

#div2 {
  color: @aaa;   
}

相信你已經猜到結果了吧。編譯之後

#div1 #header {
  color: green;
}
#div2 {
  color: red;
}

8、不得不說的import指令

less裡面使用import將外部的less引入到本地less檔案裡面來。比如A.less裡面定義了一個變數@aaa:red,而B.less檔案裡面也需要使用@aaa這個變數,這個時候怎麼辦呢?import派上用場了。

A.less內容如下:

@aaa:red;

B.less內容如下:

@import 'A.less';

div{
    color:@aaa;
}

然後再html頁面引入B.less檔案,編譯最終可以得到如下結果

div{
    color:@aaa;
}

有人可能要說,不就是引用其他less檔案裡面的變數嗎,沒啥用。可是你想過沒有,由於專案裡面模組很多,每個模組都有自己的less檔案,如果沒有import,怎麼去統一排程呢。這點從bootstrap就可以看出來,當我們下載bootstrap3的原始碼,你會發現有很多的less檔案,放在less資料夾裡面,這些less檔案分別對應著各個模組的樣式。形如

各個模組的樣式寫完後,會有一個bootstrap.less檔案,將其他所有的less檔案都import進來,其內容如下:

// Core variables and mixins
@import "variables.less";
@import "mixins.less";

// Reset and dependencies
@import "normalize.less";
@import "print.less";
@import "glyphicons.less";

// Core CSS
@import "scaffolding.less";
@import "type.less";
@import "code.less";
@import "grid.less";
@import "tables.less";
@import "forms.less";
@import "buttons.less";

// Components
@import "component-animations.less";
@import "dropdowns.less";
@import "button-groups.less";
@import "input-groups.less";
@import "navs.less";
@import "navbar.less";
@import "breadcrumbs.less";
@import "pagination.less";
@import "pager.less";
@import "labels.less";
@import "badges.less";
@import "jumbotron.less";
@import "thumbnails.less";
@import "alerts.less";
@import "progress-bars.less";
@import "media.less";
@import "list-group.less";
@import "panels.less";
@import "responsive-embed.less";
@import "wells.less";
@import "close.less";

// Components w/ JavaScript
@import "modals.less";
@import "tooltip.less";
@import "popovers.less";
@import "carousel.less";

// Utility classes
@import "utilities.less";
@import "responsive-utilities.less";

然後我們編譯bootstrap.less,就能將所有模組的less檔案引入進來。

為了證明這點,我們來測試一把,在A.less裡面加入如下內容:

@aaa:red;
@widthtest:200px;

.class2{
    background-color:green;
    border:5px solid red;
}

B.less內容如下:

@import 'A.less';

div{
    color:@aaa;
    width:@widthtest;
    height:50px;
}

然後編譯B.less得到的B.css檔案內容如下:

.class2 {
  background-color: green;
  border: 5px solid red;
}
div {
  color: #ff0000;
  width: 200px;
  height: 50px;
}

另外,import指令還包含了多種引數型別:

1. @import (reference) "檔案路徑";  將引入的檔案作為樣式庫使用,因此檔案中樣式不會被直接編譯為css樣式規則。當前樣式檔案通過extendmixins的方式引用樣式庫的內容。

2. @import (inline) "檔案路徑";   用於引入與less不相容的css檔案,通過inline配置告知編譯器不對引入的檔案進行編譯處理,直接輸出到最終輸出。

3. @import (less) "檔案路徑";   預設使用該配置項,表示引入的檔案為less檔案。

4. @import (css) "檔案路徑";   表示當前操作為CSS中的@import操作。當前檔案會輸出一個樣式檔案,而被引入的檔案自身為一個獨立的樣式檔案

5. @import (once) "檔案路徑";   預設使用該配置項,表示對同一個資源僅引入一次。

6. @import (multiple) "檔案路徑";   表示對同一資源可引入多次。

9、綜合例項

對於上文提到的螢幕變化的時候動態去設定樣式的問題,使用less結合css3的@media就能輕鬆處理,比如有下面一段less程式碼:

@base: #f938ab;

div{
    background-color:@base;
    padding:50px;
}

.divcolor {
  @media (max-width: 400px) {
    background-color: green;
  }
  @media (min-width: 400px) and (max-width: 800px) {
    background-color: red;
  }
  @media (min-width: 800px) {
    background-color: #f938ab;
  }
}

介面html如下:

<body>
    <div id="div1" class="divcolor">div1</div>
    <div id="div2">div2</div>
</body>

使用這種巢狀的寫法就能實現多個條件的預設樣式,所以最終編譯得到的css如下:

/* line 4, http://localhost:34512/Content/less.less */
div {
  background-color: #f938ab;
  padding: 50px;
}
@media (max-width: 400px) {
  .divcolor {
    background-color: green;
  }
}
@media (min-width: 400px) and (max-width: 800px) {
  .divcolor {
    background-color: red;
  }
}
@media (min-width: 800px) {
  .divcolor {
    background-color: #f938ab;
  }
}

表示當前文件的寬度小於400的時候,背景色為green;大於400小於800時背景色為red;大約800時背景色為#f938ab。來看看是不是這樣:

這裡只是一個簡單的測試,實際應用中肯定不可能只是設定一個簡單的背景色。對於響應式佈局的情況,這種寫法非常多。

對於條件判斷,less支援巢狀的寫法,比如:

@base: #f938ab;

div{
    background-color:@base;
    padding:50px;
}

.class1{
    width:550px;
    margin:10px;
}

.class2{
    width:150px;
    margin:auto;
    display:block;
}

.divcolor {
  @media (max-width: 800px) {
     background-color: green;
     .class1;
     @media (min-width: 400px){
        background-color: red;
        .class2
     }
  }
}

編譯得到的css如下:

div {
  background-color: #f938ab;
  padding: 50px;
}

.class1 {
  width: 550px;
  margin: 10px;
}
.class2 {
  width: 150px;
  margin: auto;
  display: block;
}
@media (max-width: 800px) {
  .divcolor {
    background-color: green;
    width: 550px;
    margin: 10px;
  }
}
@media (max-width: 800px) and (min-width: 400px) {
  .divcolor {
    background-color: red;
    width: 150px;
    margin: auto;
    display: block;
  }
}

四、總結

 一些基礎的用法暫時先介紹這麼多,更多高階用法還有待研究再發出。由於博主接觸less語法的時間並不長,如果有理解有誤之處,還望園友們指出。

如果你覺得本文能夠幫助你,可以右邊隨意 打賞 博主,也可以 推薦 進行精神鼓勵。你的支援是博主繼續堅持的不懈動力。

歡迎各位轉載,但是未經作者本人同意,轉載文章之後必須在文章頁面明顯位置給出作者和原文連線,否則保留追究法律責任的權利

相關推薦

CSS系列——前端初涉Less

前言:最近幫一個朋友解決點問題,在檢視元件原始碼的時候涉及到了less語法,這可難倒博主了。沒辦法,既然用到就要學唄,誰讓咱是無所不能的程式猿呢!所以今天來學習下Less,算是筆記,也希望給初學less的園友提供參考,如果你是前端大神,此文就沒必要看了哈。算了,扯遠了哈,進入正題。 一、Less介紹

翻譯(六)——T-SQL的超過基礎的2級水平寫子查詢

相關 完整 圖像 reg 想要 試驗 releases 驗證 不用 T-SQL的進階之路:超過基礎的2級水平:寫子查詢 格雷戈裏·拉森(Gregory Larsen),2016/01/01(第一次出版:2014/01/29) 該系列 這篇文章是樓梯系列的

開發者的用語法樹來實現預編譯

能夠 項目 未來 部分 領域 編譯器 提高 cfb ima 如何在保證安全性的前提下,提升開發過程的效率,是每個開發者都在不斷探索的問題。借助語法樹,開發者能夠更好地展現和修改源程序代碼,優化開發環節,提高安全系數,還能進一步實現安卓預編譯。 本文基於個推高級研發工程師李健

薦書 | Netty跟著案例學Netty

內容精選自 1000 多個一線業務實際案例真正從原理到實踐全景式講解 Netty 專案實踐快速領

前端

一、開發工具 1. atom Atom 程式碼編輯器支援 Windows、Mac、Linux 三大桌面平臺,完全免費,並且已經在 GitHub 上開放了全部的原始碼。在經過一段長時間的迭代開發和不斷改進後,Atom 終於從早期的測試版達到了 1.0 正式版了

財會小白如何在數字化財務時代成為行業大牛?

包括 alt mark 應該 設備 批量 認知 人員 活動 隨著雲技術、流程機器人、認知計算等創新型技術向財務領域不斷的深入,其在帶來組織架構、人員及管理變革的同時,也不禁引起了財會、稅務、審計等人員的困惑,在以機器人技術為牽引的數字化財務時代下,財會人員該如何獲得核心競爭

web前端

一、開發工具 1. atom Atom 程式碼編輯器支援 Windows、Mac、Linux 三大桌面平臺,完全免費,並且已經在 GitHub 上開放了全部的原始碼。在經過一段長時間的迭代開發和不斷改進後,Atom 終於從早期的測試版達到了 1.0 正式版了!相比之前

前端工程師做事的三重境界我的

本文轉載於:猿2048網站前端工程師做事的三重境界:我的進階之路 ![v2-fd52450adf6c98b518618bdc74

CSS

模式 ant 表格 weight mil 比較 標題 根據 amp 下面主要引用http://www.cnblogs.com/wangfupeng1988/tag/css知多少/ CSS進階筆記: 一、學習CSS的三個突破點 1.瀏覽器如何加載和解析CSS——CSS的5個來

一個年薪100萬的程序員技術

iOS開發 ios逆向開發 移動架構 安全攻防 人工智能 剛進入的公司已經成為一名初級開發工程師。我們如何在這一技術路線上變得野蠻? 這一技術的路徑是一個Pilar Meade,少人去了。 多年來,爸爸一直在IT領域接觸大量的大型咖啡技術,其成長道路可能如下: 1。夯實夯實基礎 無論你是

前端工程師的

有時 exp === 框架設計 例子 最好 接口 概念 產品需求 這篇文章收藏在筆記裏面有幾年了,原文作者無從考究了,侵刪! 最近再翻出來看,依然覺得受益匪淺。這次整理分享出來,希望對大家有所啟示。 背景 如果你是剛進入WEB前端研發領域,想試試這潭水有多深,看這篇文章

從0到1,從無到有八年阿里Python開發工程師的

如果你只能選讀一門程式語言,那麼除了 Python,還是 Python。     小編有個在阿里工作的朋友,這兩天和他在聊Python的發展,其實Python已經在不知不覺中發生了非常大的改變。Python這門語言十分高效,只要是和自動化有關係的,它可以發揮出巨

推薦書單2.0測試工程師

18年年初,寫過一篇部落格:推薦書單1.0:測試工程師成長之路。裡面包含了軟體測試基礎方法論、UI自動化測試、效能測試、python、協議、資料庫、中介軟體、泛產品經理相關的一些書單。 今年我也算看了一些書,型別比較雜,散文小說、雞湯、邏輯思維、社科等等型別,技術類的大概佔比一半左右,其中中介軟體和後臺相關

前端工程師開發

var str="www.baidu.com/?page"; // 1、字串剪裁 str.substring(0, str.indexof("?page")); // 2、正則表示式 str.replace(/?page/, ""); // 3、字串分拆、合併 str.split("?page").join(

指尖上行--移動前端開發(讀書筆記)----1.1頁面佈局

chapter 1 移動頁面開發 頁面佈局 頁面除錯 常用庫和框架 1.1 頁面佈局 1.1.1 Vieport(視口,檢視視窗) 裝置畫素 物理畫素:螢幕解析度; 裝置獨立畫素:CSS畫素(eg:IPhone5 CSS畫素是320*568p

Linux(一)部署

經過長期的開發工作,在專案中經常會需要將打包好的專案部署到Linux伺服器上,不過,在此之前需要掌握一些Linux常用命令比如ls、ll、ps -ef|grep java 、cp、tail 等等,詳細的可以百度查一下,還是很多的。接下來,就說一下關於專案的部署。 首先需要一個遠端訪問Linu

Pandas使用DataFrame進行資料分析比賽(二)日期資料處理按日期篩選、顯示及統計資料

首先,表格的資料格式如下: 1、獲取某年某月資料 data_train = pd.read_csv('data/train.csv') # 將資料型別轉換為日期型別 data_train[

專訪任玉剛從菜鳥到資深工程師的

任玉剛,百度公司Android資深工程師,《Android開發藝術探索》作者,熱愛分享和開源,常年活躍在CSDN和Github。除此之外,他還是CSDN部落格專家,2014十大部落格之星。從一名菜鳥演變為資深工程師,在他看來,也有自己的辛酸歷程,儘管他已成為一名資深工程師

指尖上行--移動前端開發(讀書筆記)----2.1動畫形式

chapter 2 技術創意形式 動畫形式 移動裝置 Web API 詳解 WebVR 創意點 2.1 動畫形式 2.1.1 CSS3 CSS3 Cascading Style Sheets 層疊樣式表。 CSS3是CSS技術的一個升級版本,

指尖上行--移動前端開發(讀書筆記)----1.3常用庫和框架

chapter 1 移動頁面開發 頁面佈局 頁面除錯 常用庫和框架 1.3 常用庫和框架 1.3.1 jQuery Mobile jQuery Mobile是jQuery 框架的一個元件(而非jquery的移動版本)。這個框架已經很老了,本人