摘要:在網(wǎng)上討論看來,與相比于功能更為豐富,但對于學(xué)習(xí)成本以及適應(yīng)時間,稍勝一籌,這也是我選擇的原因。如果你也是的使用者,還需要配合進行處理,具體可見我的這篇文章飛行手冊,里面詳細說明了的處理方式。
原文鏈接
前言 CSS的短板????作為前端學(xué)習(xí)者的我們 或多或少都要學(xué)些 CSS ,它作為前端開發(fā)的三大基石之一,時刻引領(lǐng)著 Web 的發(fā)展潮向。 而 CSS 作為一門標(biāo)記性語言,可能 給初學(xué)者第一印象 就是簡單易懂,毫無邏輯,不像編程該有的樣子。在語法更新時,每當(dāng)新屬性提出,瀏覽器的兼容又會馬上變成絆腳石,可以說 CSS 短板不容忽視。
????問題的誕生往往伴隨著技術(shù)的興起, 在 Web 發(fā)展的這幾年, 為了讓 CSS 富有邏輯性,短板不那么嚴重,涌現(xiàn)出了 一些神奇的預(yù)處理語言。 它們讓 CSS 徹底變成一門 可以使用 變量 、循環(huán) 、繼承 、自定義方法等多種特性的標(biāo)記語言,邏輯性得以大大增強。
預(yù)處理語言的誕生其中 就我所知的有三門語言:Sass、Less 、Stylus 。
Sass 誕生于 2007 年,Ruby 編寫,其語法功能都十分全面,可以說 它完全把 CSS 變成了一門編程語言。另外 在國內(nèi)外都很受歡迎,并且它的項目團隊很是強大 ,是一款十分優(yōu)秀的預(yù)處理語言。
Stylus 誕生于 2010 年,來自 Node.js 社區(qū),語法功能也和 Sass 不相伯仲,是一門十分獨特的創(chuàng)新型語言。
Less 誕生于 2009 年,受Sass的影響創(chuàng)建的一個開源項目。 它擴充了 CSS 語言,增加了諸如變量、混合(mixin)、函數(shù)等功能,讓 CSS 更易維護、方便制作主題、擴充(引用于官網(wǎng))。
選擇預(yù)處理語言這是一個十分糾結(jié)的問題。
在我看來,這就好比 找女朋友,有人喜歡 賢惠安靜的,就有人喜歡 活潑愛鬧的,各有各的愛好,可晚上閉燈后 其實都差不多,所以你不用太過糾結(jié)。當(dāng)然了 ,首先 你要有女朋友。
在網(wǎng)上討論看來,Sass 與 Stylus 相比于 Less 功能更為豐富,但對于學(xué)習(xí)成本以及適應(yīng)時間 ,Less 稍勝一籌,這也是我選擇 Less 的原因。
Less 沒有去掉任何 CSS 的功能,而是在現(xiàn)有的語法上,增添了許多額外的功能特性,所以學(xué)習(xí) Less 是一件非常舒服的事情。
如果你之前沒有接觸過預(yù)處理語言,糾結(jié)應(yīng)該學(xué)哪一個,不如先看看 下面 Less 的介紹,我相信你會愛上它的。
使用 Less 的前奏使用 Less 有兩種方式
在頁面中 引入 Less.js
可在官網(wǎng)下載
或使用CDN
需要注意的是,link 標(biāo)簽一定要在 Less.js 之前引入,并且 link 標(biāo)簽的 rel 屬性要設(shè)置為stylesheet/less。
在命令行 使用npm安裝
npm install -g less
具體使用命令
$ lessc styles.less > styles.css
假如還有問題,官網(wǎng)已經(jīng)有了明確的步驟。
如果你也是 Webpack 的使用者,還需要配合 less-loader 進行處理,具體可見我的這篇文章:Webpack飛行手冊,里面詳細說明了 less 的處理方式。
如果你在本地環(huán)境,可以使用第一種方式,非常簡單;但在生產(chǎn)環(huán)境中,性能非常重要,最好使用第二種方式。
正文下面我將簡介 Less 的功能特性。
變量我們常常在 CSS 中 看到同一個值重復(fù)多次,這樣難易于代碼維護。
理想狀態(tài),應(yīng)是下面這樣:
const bgColor="skyblue"; $(".post-content").css("background-color",bgColor); $("#wrap").css("background-color",bgColor); $(".arctive").css("background-color",bgColor);
只要我們修改 bgColor這一個變量, 整個頁面的背景顏色都會隨之改變。
而 Less 中的變量十分強大,可化萬物,值得一提的是,其變量是常量 ,所以只能定義一次,不能重復(fù)使用。
值變量
/* Less */ @color: #999; @bgColor: skyblue;//不要添加引號 @width: 50%; #wrap { color: @color; width: @width; } /* 生成后的 CSS */ #wrap { color: #999; width: 50%; }
以 @ 開頭 定義變量,并且使用時 直接 鍵入 @名稱。
在平時工作中,我們就可以把 常用的變量 封裝到一個文件中,這樣利于代碼組織維護。
@lightPrimaryColor: #c5cae9; @textPrimaryColor: #fff; @accentColor: rgb(99, 137, 185); @primaryTextColor: #646464; @secondaryTextColor: #000; @dividerColor: #b6b6b6; @borderColor: #dadada;
選擇器變量
讓 選擇器 變成 動態(tài)
/* Less */ @mySelector: #wrap; @Wrap: wrap; @{mySelector}{ //變量名 必須使用大括號包裹 color: #999; width: 50%; } .@{Wrap}{ color:#ccc; } #@{Wrap}{ color:#666; } /* 生成的 CSS */ #wrap{ color: #999; width: 50%; } .wrap{ color:#ccc; } #wrap{ color:#666; }
屬性變量
可減少代碼書寫量
/* Less */ @borderStyle: border-style; @Soild:solid; #wrap{ @{borderStyle}: @Soild;//變量名 必須使用大括號包裹 } /* 生成的 CSS */ #wrap{ border-style:solid; }
url 變量
項目結(jié)構(gòu)改變時,修改其變量即可。
/* Less */ @images: "../img";//需要加引號 body { background: url("@{images}/dog.png");//變量名 必須使用大括號包裹 } /* 生成的 CSS */ body { background: url("../img/dog.png"); }
聲明變量
有點類似于 下面的 混合方法
- 結(jié)構(gòu): @name: { 屬性: 值 ;}; - 使用:@name();
/* Less */ @background: {background:red;}; #main{ @background(); } @Rules:{ width: 200px; height: 200px; border: solid 1px red; }; #con{ @Rules(); } /* 生成的 CSS */ #main{ background:red; } #con{ width: 200px; height: 200px; border: solid 1px red; }
變量運算
不得不提的是,Less 的變量運算完全超出我的期望,十分強大。
- 加減法時 以第一個數(shù)據(jù)的單位為基準 - 乘除法時 注意單位一定要統(tǒng)一
/* Less */ @width:300px; @color:#222; #wrap{ width:@width-20; height:@width-20*5; margin:(@width-20)*5; color:@color*2; background-color:@color + #111; } /* 生成的 CSS */ #wrap{ width:280px; height:200px; margin:1400px; color:#444; background-color:#333; }
變量作用域
一句話理解就是:就近原則,不要跟我提閉包。
借助官網(wǎng)的Demo
/* Less */ @var: @a; @a: 100%; #wrap { width: @var; @a: 9%; } /* 生成的 CSS */ #wrap { width: 9%; }
用變量去定義變量
/* Less */ @fnord: "I am fnord."; @var: "fnord"; #wrap::after{ content: @@var; //將@var替換為其值 content:@fnord; } /* 生成的 CSS */ #wrap::after{ content: "I am fnord."; }嵌套
& 的妙用
& :代表的上一層選擇器的名字,此例便是header。
/* Less */ #header{ &:after{ content:"Less is more!"; } .title{ font-weight:bold; } &_content{//理解方式:直接把 & 替換成 #header margin:20px; } } /* 生成的 CSS */ #header::after{ content:"Less is more!"; } #header .title{ //嵌套了 font-weight:bold; } #header_content{//沒有嵌套! margin:20px; }
媒體查詢
在以往的工作中,我們使用 媒體查詢,都要把一個元素 分開寫
#wrap{ width:500px; } @media screen and (max-width:768px){ #wrap{ width:100px; } }
Less 提供了一個十分便捷的方式
/* Less */ #main{ //something... @media screen{ @media (max-width:768px){ width:100px; } } @media tv { width:2000px; } } /* 生成的 CSS */ @media screen and (maxwidth:768px){ #main{ width:100px; } } @media tv{ #main{ width:2000px; } }
唯一的缺點就是 每一個元素都會編譯出自己 @media 聲明,并不會合并。
實戰(zhàn)技巧
可以借助 Less 在元素中,去定義自己的私有樣式。
/* Less */ #main{ // something.. &.show{ display:block; } } .show{ display:none; }
const main = document.getElementById("main"); main.classList.add("show");
結(jié)果:
#main.show{ display:block; } .show{ display:none; //會被覆蓋。 }混合方法
無參數(shù)方法
方法猶如 聲明的集合,使用時 直接鍵入名稱即可。
/* Less */ .card { // 等價于 .card() background: #f6f6f6; -webkit-box-shadow: 0 1px 2px rgba(151, 151, 151, .58); box-shadow: 0 1px 2px rgba(151, 151, 151, .58); } #wrap{ .card;//等價于.card(); } /* 生成的 CSS */ #wrap{ background: #f6f6f6; -webkit-box-shadow: 0 1px 2px rgba(151, 151, 151, .58); box-shadow: 0 1px 2px rgba(151, 151, 151, .58); }
其中 .card 與 .card() 是等價的。
個人建議,為了避免 代碼混淆,應(yīng)寫成 :
.card(){ //something... } #wrap{ .card(); }
要點: `.` 與 `#` 皆可作為 方法前綴。 方法后寫不寫 `()` 看個人習(xí)慣。
默認參數(shù)方法
Less 可以使用默認參數(shù),如果 沒有傳參數(shù),那么將使用默認參數(shù)。
@arguments 猶如 JS 中的 arguments 指代的是 全部參數(shù)。
傳的參數(shù)中 必須帶著單位。
/* Less */ .border(@a:10px,@b:50px,@c:30px,@color:#000){ border:solid 1px @color; box-shadow: @arguments;//指代的是 全部參數(shù) } #main{ .border(0px,5px,30px,red);//必須帶著單位 } #wrap{ .border(0px); } #content{ .border;//等價于 .border() } /* 生成的 CSS */ #main{ border:solid 1px red; box-shadow:0px,5px,30px,red; } #wrap{ border:solid 1px #000; box-shadow: 0px 50px 30px #000; } #content{ border:solid 1px #000; box-shadow: 10px 50px 30px #000; }
方法的匹配模式
與 面向?qū)ο笾械亩鄳B(tài) 很相似
/* Less */ .triangle(top,@width:20px,@color:#000){ border-color:transparent transparent @color transparent ; } .triangle(right,@width:20px,@color:#000){ border-color:transparent @color transparent transparent ; } .triangle(bottom,@width:20px,@color:#000){ border-color:@color transparent transparent transparent ; } .triangle(left,@width:20px,@color:#000){ border-color:transparent transparent transparent @color; } .triangle(@_,@width:20px,@color:#000){ border-style: solid; border-width: @width; } #main{ .triangle(left, 50px, #999) } /* 生成的 CSS */ #main{ border-color:transparent transparent transparent #999; border-style: solid; border-width: 50px; }
要點
- 第一個參數(shù) `left` 要會找到方法中匹配程度最高的,如果匹配程度相同,將全部選擇,并存在著樣式覆蓋替換。 - 如果匹配的參數(shù) 是變量,則將會匹配,如 `@_` 。
方法的命名空間
讓方法更加規(guī)范
/* Less */ #card(){ background: #723232; .d(@w:300px){ width: @w; #a(@h:300px){ height: @h;//可以使用上一層傳進來的方法 width: @w; } } } #wrap{ #card > .d > #a(100px); // 父元素不能加 括號 } #main{ #card .d(); } #con{ //不得多帶帶使用命名空間的方法 //.d() 如果前面沒有引入命名空間 #card ,將會報錯 #card; // 等價于 #card(); .d(20px); //必須先引入 #card } /* 生成的 CSS */ #wrap{ height:100px; width:300px; } #main{ width:300px; } #con{ width:20px; }
要點
- 在 CSS 中`>` 選擇器,選擇的是 兒子元素,就是 必須與父元素 有直接血源的元素。 - 在引入命令空間時,如使用 `>` 選擇器,父元素不能加 括號。 - 不得多帶帶使用命名空間的方法 必須先引入命名空間,才能使用 其中方法。 - 子方法 可以使用上一層傳進來的方法
方法的條件篩選
Less 沒有 if else,可是它有 when
/* Less */ #card{ // and 運算符 ,相當(dāng)于 與運算 &&,必須條件全部符合才會執(zhí)行 .border(@width,@color,@style) when (@width>100px) and(@color=#999){ border:@style @color @width; } // not 運算符,相當(dāng)于 非運算 !,條件為 不符合才會執(zhí)行 .background(@color) when not (@color>=#222){ background:@color; } // , 逗號分隔符:相當(dāng)于 或運算 ||,只要有一個符合條件就會執(zhí)行 .font(@size:20px) when (@size>50px) , (@size<100px){ font-size: @size; } } #main{ #card>.border(200px,#999,solid); #card .background(#111); #card > .font(40px); } /* 生成后的 CSS */ #main{ border:solid #999 200px; background:#111; font-size:40px; }
要點
- 比較運算有: > >= = =< <。 - = 代表的是等于 - 除去關(guān)鍵字 true 以外的值都被視為 false:
數(shù)量不定的參數(shù)
如果你希望你的方法接受數(shù)量不定的參數(shù),你可以使用... ,猶如 ES6 的擴展運算符。
/* Less */ .boxShadow(...){ box-shadow: @arguments; } .textShadow(@a,...){ text-shadow: @arguments; } #main{ .boxShadow(1px,4px,30px,red); .textShadow(1px,4px,30px,red); } /* 生成后的 CSS */ #main{ box-shadow: 1px 4px 30px red; text-shadow: 1px 4px 30px red; }
方法使用important!
使用方法 非常簡單,在方法名后 加上關(guān)鍵字即可。
/* Less */ .border{ border: solid 1px red; margin: 50px; } #main{ .border() !important; } /* 生成后的 CSS */ #main { border: solid 1px red !important; margin: 50px !important; }
循環(huán)方法
Less 并沒有提供 for 循環(huán)功能,但這也難不倒 聰明的程序員,使用遞歸去實現(xiàn)。
下面是官網(wǎng)中的一個 Demo,模擬了生成柵格系統(tǒng)。
/* Less */ .generate-columns(4); .generate-columns(@n, @i: 1) when (@i =< @n) { .column-@{i} { width: (@i * 100% / @n); } .generate-columns(@n, (@i + 1)); } /* 生成后的 CSS */ .column-1 { width: 25%; } .column-2 { width: 50%; } .column-3 { width: 75%; } .column-4 { width: 100%; }
屬性拼接方法
+_ 代表的是 空格;+ 代表的是 逗號。
- 逗號
/* Less */ .boxShadow() { box-shadow+: inset 0 0 10px #555; } .main { .boxShadow(); box-shadow+: 0 0 20px black; } /* 生成后的 CSS */ .main { box-shadow: inset 0 0 10px #555, 0 0 20px black; }
- 空格
/* Less */ .Animation() { transform+_: scale(2); } .main { .Animation(); transform+_: rotate(15deg); } /* 生成的 CSS */ .main { transform: scale(2) rotate(15deg); }
實戰(zhàn)技巧
下面是官網(wǎng)中的一個非常贊的 Demo
/* Less */ .average(@x, @y) { @average: ((@x + @y) / 2); } div { .average(16px, 50px); // 調(diào)用 方法 padding: @average; // 使用返回值 } /* 生成的 CSS */ div { padding: 33px; }
可以說 Less 是一門優(yōu)雅編程語言。
繼承extend 是 Less 的一個偽類。它可繼承 所匹配聲明中的全部樣式。
extend 關(guān)鍵字的使用
/* Less */ .animation{ transition: all .3s ease-out; .hide{ transform:scale(0); } } #main{ &:extend(.animation); } #con{ &:extend(.animation .hide); } /* 生成后的 CSS */ .animation,#main{ transition: all .3s ease-out; } .animation .hide , #con{ transform:scale(0); }
all 全局搜索替換
使用選擇器匹配到的 全部聲明。
/* Less */ #main{ width: 200px; } #main { &:after { content:"Less is good!"; } } #wrap:extend(#main all) {} /* 生成的 CSS */ #main,#wrap{ width: 200px; } #main:after, #wrap:after { content: "Less is good!"; }
減少代碼的重復(fù)性
從表面 看來,extend 與 方法 最大的差別,就是 extend 是同個選擇器共用同一個聲明,而 方法 是使用自己的聲明,這無疑 增加了代碼的重復(fù)性。
方法示例 與上面的 extend 進行對比:
/* Less */ .Method{ width: 200px; &:after { content:"Less is good!"; } } #main{ .Method; } #wrap{ .Method; } /* 生成的 CSS */ #main{ width: 200px; &:after{ content:"Less is good!"; } } #wrap{ width: 200px; &:after{ content:"Less is good!"; } }
要點
翻譯官網(wǎng)
選擇器和擴展之間 是允許有空格的:pre:hover :extend(div pre).
可以有多個擴展: pre:hover:extend(div pre):extend(.bucket tr) - 注意這與 pre:hover:extend(div pre, .bucket tr)一樣。
這是不可以的,擴展必須在最后 : pre:hover:extend(div pre).nth-child(odd)。
如果一個規(guī)則集包含多個選擇器,所有選擇器都可以使用extend關(guān)鍵字。
導(dǎo)入
導(dǎo)入 less 文件 可省略后綴
import "main"; //等價于 import "main.less";
@import 的位置可隨意放置
#main{ font-size:15px; } @import "style";
reference
Less 中 最強大的特性
使用 引入的 Less 文件,但不會 編譯它。
/* Less */ @import (reference) "bootstrap.less"; #wrap:extend(.navbar all){}
翻譯官網(wǎng): > 使用@import (reference)導(dǎo)入外部文件,但不會添加 把導(dǎo)入的文件 編譯到最終輸出中,只引用。
once
@import語句的默認行為。這表明相同的文件只會被導(dǎo)入一次,而隨后的導(dǎo)入文件的重復(fù)代碼都不會解析。
@import (once) "foo.less"; @import (once) "foo.less"; // this statement will be ignored
multiple
使用@import (multiple)允許導(dǎo)入多個同名文件。
/* Less */ // file: foo.less .a { color: green; } // file: main.less @import (multiple) "foo.less"; @import (multiple) "foo.less"; /* 生成后的 CSS */ .a { color: green; } .a { color: green; }函數(shù)
判斷類型
isnumber
判斷給定的值 是否 是一個數(shù)字。 ```less isnumber(#ff0); // false isnumber(blue); // false isnumber("string"); // false isnumber(1234); // true isnumber(56px); // true isnumber(7.8%); // true isnumber(keyword); // false isnumber(url(...)); // false ```
iscolor
> 判斷給定的值 是否 是一個顏色。
isurl
> 判斷給定的值 是否 是一個 url 。
顏色操作
saturate
> 增加一定數(shù)值的顏色飽和度。
lighten
> 增加一定數(shù)值的顏色亮度。
darken
> 降低一定數(shù)值的顏色亮度。
fade
> 給顏色設(shè)定一定數(shù)值的透明度。
mix
> 根據(jù)比例混合兩種顏色。
數(shù)學(xué)函數(shù)
ceil
> 向上取整。
floor
> 向下取整。
percentage
> 將浮點數(shù)轉(zhuǎn)換為百分比字符串。
round
> 四舍五入。
sqrt
> 計算一個數(shù)的平方根。
abs
> 計算數(shù)字的絕對值,原樣保持單位。
pow
> 計算一個數(shù)的乘方。
由于 文章 篇幅有限,所以 只能介紹一些 使用效率高的函數(shù)。
如果你想了解更多,可以去官網(wǎng)的函數(shù)鏈接
其他
注釋
/* */ CSS原生注釋,會被編譯在 CSS 文件中。
/???/ Less提供的一種注釋,不會被編譯在 CSS 文件中。
避免編譯
/* Less */ #main{ width:~"calc(300px-30px)"; } /* 生成后的 CSS */ #main{ width:calc(300px-30px); }
結(jié)構(gòu): `~" 值 "`
使用 JS
因為 Less 是由 JS 編寫,所以 Less 有一得天獨厚的特性:代碼中使用 Javascript 。
/* Less */ @content:`"aaa".toUpperCase()`; #randomColor{ @randomColor: ~"rgb(`Math.round(Math.random() * 256)`,`Math.round(Math.random() * 256)`,`Math.round(Math.random() * 256)`)"; } #wrap{ width: ~"`Math.round(Math.random() * 100)`px"; &:after{ content:@content; } height: ~"`window.innerHeight`px"; alert:~"`alert(1)`"; #randomColor(); background-color: @randomColor; } /* 生成后的 CSS */ // 彈出 1 #wrap{ width: 隨機值(0~100)px; height: 743px;//由電腦而異 background: 隨機顏色; } #wrap::after{ content:"AAA"; }
????前幾個月 , 有個 CSS in JS 的概念非?;?,現(xiàn)在 看來 JS in CSS 也未曾不可。
我覺得完全可以根據(jù) Less 這個特性來造個輪子,JS來控制 CSS ,形成 動態(tài)屬性,如果成功 很可能會改變 現(xiàn)在前端的打開姿勢。
原文鏈接
(完)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/112846.html
摘要:手動創(chuàng)建執(zhí)行線程存在以上問題,而線程池就是用來解決這些問題的。線程池詳解上面我們已經(jīng)知道了線程池的作用,而對于這樣一個好用,重要的工具,當(dāng)然已經(jīng)為我們提供了實現(xiàn),這也是本篇文章的重點。,線程池一旦空閑超過時間,線程都將被回收。 showImg(https://segmentfault.com/img/remote/1460000018476903); 本文原創(chuàng)地址,我的博客:https...
摘要:注解在類上為類提供一個全參的構(gòu)造方法,加了這個注解后,類中不提供默認構(gòu)造方法了。這個注解用在類上,使用類中所有帶有注解的或者帶有修飾的成員變量生成對應(yīng)的構(gòu)造方法。 轉(zhuǎn)載請注明原創(chuàng)地址:http://www.54tianzhisheng.cn/2018/01/07/lombok/ showImg(http://ohfk1r827.bkt.clouddn.com/blog/180107/7...
摘要:如果遇到非常的復(fù)雜的匹配,正則表達式的優(yōu)勢就更加明顯了。關(guān)于正則表達式書寫規(guī)則,可查看,上面說的很清楚了,我就不貼出來了。替換與正則表達式匹配的子串,并返回替換后的字符串。結(jié)語正則表達式并不難,懂了其中的套路之后,一切都變得簡單了。 前言 在正文開始前,先說說正則表達式是什么,為什么要用正則表達式?正則表達式在我個人看來就是一個瀏覽器可以識別的規(guī)則,有了這個規(guī)則,瀏覽器就可以幫我們判斷...
摘要:從入門到放棄是什么,黑歷史,不講,自己百度去。類你沒有看錯,這里面的就沒有問題的。之前我們用過,和有了,再也不用這兩個貨了。一個函數(shù),可以遍歷狀態(tài)感覺就是狀態(tài)機,好吧不說了再說就懵逼了。 ES6從入門到放棄 1.ES6是什么,黑歷史,不講,自己百度去。 2.在瀏覽器中如何使用? 1.babel babeljs.io在線編譯 2.traceur-----Google出的編譯器,把E...
摘要:動態(tài)地代理,可以猜測一下它的含義,在運行時動態(tài)地對某些東西代理,代理它做了其他事情。所以動態(tài)代理的內(nèi)容重點就是這個。所以下一篇我們來細致了解下的到底是怎么使用動態(tài)代理的。 之前講了《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》,本來打算下一篇講講Srping的AOP的,但是其中會涉及到Java的動態(tài)代理,所以先單獨一篇來了解下Java的動態(tài)代理到底是什么,Java是怎么實現(xiàn)它的。 ...
閱讀 2887·2019-08-30 15:44
閱讀 1924·2019-08-29 13:59
閱讀 2854·2019-08-29 12:29
閱讀 1103·2019-08-26 13:57
閱讀 3215·2019-08-26 13:45
閱讀 3344·2019-08-26 10:28
閱讀 864·2019-08-26 10:18
閱讀 1707·2019-08-23 16:52