前言

我們之前曾經介紹過 如何使用 CSS3 Animation,也不小心在該篇文章中說要另文跟大家介紹如何使用 CSS3 Transition,拖稿了近一年,今天終於要來實現諾言了~雖然大家可能根本就不在意,但哥就是真性情的人他媽的當真了啊!

在這個浮誇的時代,如果網頁上沒有酷炫的功能或特效,似乎就遜掉了(幹!開場跟如何使用 CSS3 Animation 這篇文章一模一樣,可以再混一點啊),好啦,不說廢話,總之就是網頁有使用到 CSS3 Transition 馬上就會讓你的網站帥十倍啦!很爽吧!(請注意:本人並不會因此帥十倍)

就讓我們一起來看看 CSS3 Transition 大法怎麼練吧!

CSS3 Transition 第一級

第一級讓我們先由簡單的範例從做中學,現在讓我們想像一個情境,我們希望滑鼠 hover 至某個 div 元素時,讓這個 div 元素改變背景色,若沒有用轉場(Transition)效果,我們就會看到 div 元素硬生生的改變顏色,一點都不溫柔,這樣橫衝直撞會讓 TA 很不舒服,所以我們才會需要 CSS3 Transition 來讓 TA 舒服一點。

div.example-no-transition {
    width: 580px;
    padding: 9px 15px;
    background-color: #FF5050;
    color: white;
    margin-bottom: 20px;
    margin-top: 20px;
    border-radius: 5px;
}
div.example-no-transition:hover {
    background-color: #6666FF;
}

這段 CSS 語法就是代表當滑鼠 hover 至 div.example-no-transition 元素時,背景顏色會變成 #6666FF,但就是很生硬的變過去,但當我們加入 transition 那就不一樣了。

div.example-with-transition {
    width: 580px;
    padding: 9px 15px;
    background-color: #FF5050;
    color: white;
    border-radius: 5px;
    -webkit-transition: background-color 1s;
    -moz-transition: background-color 1s;
    -o-transition: background-color 1s;
    -ms-transition: background-color 1s;
    transition: background-color 1s;
}
div.example-with-transition:hover {
    background-color: #6666FF;
}

這段 CSS 語法 transition 的部分就是說 div 元素要如何轉場,background-color 1s 的意思就是說 background-color 會在 1 秒的時間變化成 hover 所指定的背景色。

就是這麼簡單!

特別注意有 -webkit- 這個前綴的 CSS 語法是為了支援 webkit 核心的瀏覽器,例如:Chrome、Safari、Opera 等等。

CSS3 Transition 第一級展示

CSS3 Transition 第二級

CSS3 Transition 第一級使用的只是預設的轉場效果,總感覺缺少了點什麼,通常龜毛的人不會滿足於預設的效果,所以在 CSS3 Transition 第二級我們會學到如何調整 CSS3 Transition 的轉場效果。

<div id="example-transition">
  <div class="ease">ease</div>
  <div class="linear">linear</div>
  <div class="easein">ease-in</div>
  <div class="easeout">ease-out</div>
  <div class="easeinout">ease-in-out</div>
</div>
#example-transition {
  width: 520px;
}
#example-transition div {
  width: 100px;
  margin: 5px 0;
  padding: 5px;
  color: white;
  background-color: #FF5050;
  text-align: right;
  border-radius: 5px;
}
#example-transition:hover div {
  width: 500px;
}
#example-transition div.ease {
  -webkit-transition: 3s ease;
  -moz-transition: 3s ease;
  -o-transition: 3s ease;
  -ms-transition: 3s ease;
  transition: 3s ease;
}
#example-transition div.linear {
  -webkit-transition: 3s linear;
  -moz-transition: 3s linear;
  -o-transition: 3s linear;
  -ms-transition: 3s linear;
  transition: 3s linear;
}
#example-transition div.easein {
  -webkit-transition: 3s ease-in;
  -moz-transition: 3s ease-in;
  -o-transition: 3s ease-in;
  -ms-transition: 3s ease-in;
  transition: 3s ease-in;
}
#example-transition div.easeout {
  -webkit-transition: 3s ease-out;
  -moz-transition: 3s ease-out;
  -o-transition: 3s ease-out;
  -ms-transition: 3s ease-out;
  transition: 3s ease-out;
}
#example-transition div.easeinout {
  -webkit-transition: 3s ease-in-out;
  -moz-transition: 3s ease-in-out;
  -o-transition: 3s ease-in-out;
  -ms-transition: 3s ease-in-out;
  transition: 3s ease-in-out;
}

CSS3 Transition 讓我們可以使用 timing function 這個參數來調整轉場效果,我們在例子中將所以的 timing function easelinearease-inease-outease-in-out 一字排開,讓大家可以看清楚各種 timing function 有何異同,至於要使用哪個 timing function 就要看各位施主的 sense 了~

其中請特別注意,我們在這個例子中並沒有在 transition 裡說明哪個 CSS property 要做轉場效果,所以會使用預設模式來做轉場效果,預設模式其實就是 all,也就是說所有可以做轉場效果的 property 都會一起做變化,很方便吧!

CSS3 Transition 第二級展示

CSS3 Transition 第三級

CSS3 Transition 還有一個 delay 的參數可以調整,第三級裡面我們將介紹如何使用 CSS3 Transition 的 delay,這樣可以讓我們的轉場效果有更多的變化。

<div id="example-transition">
  <div class="ease">ease</div>
  <div class="linear">linear</div>
  <div class="easein">ease-in</div>
  <div class="easeout">ease-out</div>
  <div class="easeinout">ease-in-out</div>
</div>
#example-transition {
  width: 520px;
}
#example-transition div {
  width: 100px;
  margin: 5px 0;
  padding: 5px;
  color: white;
  background-color: #FF5050;
  text-align: right;
  border-radius: 5px;
}
#example-transition:hover div {
  width: 500px;
}
#example-transition div.ease {
  -webkit-transition: 1s ease;
  -moz-transition: 1s ease;
  -o-transition: 1s ease;
  -ms-transition: 1s ease;
  transition: 1s ease;
}
#example-transition div.linear {
  -webkit-transition: 1s linear 1s;
  -moz-transition: 1s linear 1s;
  -o-transition: 1s linear 1s;
  -ms-transition: 1s linear 1s;
  transition: 1s linear 1s;
}
#example-transition div.easein {
  -webkit-transition: 1s ease-in 2s;
  -moz-transition: 1s ease-in 2s;
  -o-transition: 1s ease-in 2s;
  -ms-transition: 1s ease-in 2s;
  transition: 1s ease-in 2s;
}
#example-transition div.easeout {
  -webkit-transition: 1s ease-out 3s;
  -moz-transition: 1s ease-out 3s;
  -o-transition: 1s ease-out 3s;
  -ms-transition: 1s ease-out 3s;
  transition: 1s ease-out 3s;
}
#example-transition div.easeinout {
  -webkit-transition: 1s ease-in-out 4s;
  -moz-transition: 1s ease-in-out 4s;
  -o-transition: 1s ease-in-out 4s;
  -ms-transition: 1s ease-in-out 4s;
  transition: 1s ease-in-out 4s;
}

其實我們就只是在 timing function 後面加了一個 delay 秒數而已,就可以做到一層一層的轉場變化效果,學會 CSS3 Transition 第三級之後我們就可以隱約看出 CSS3 Transition 的語法:

transition: property duration timing-function delay;

第一個值是指定哪個 property 要變化,可以使用 all,第二個值 duration 是說轉場效果會多久完成,第三個值 timing-function 是說要使用什麼轉場效果有 easelinearease-inease-outease-in-out 五種,第四個值 delay 是說明要延遲多久才開始轉場效果。

CSS3 Transition 第三級展示

CSS3 Transition 第四級

剛剛有說到 CSS3 Transition 可以指定 all property 進行轉場變化,其實並不是所有的 property 都可以進行轉場變化,可以進行轉場變化的 property 我們列成下表供大家參考。

Property Name Type
background-color color
background-image only gradients
background-position percentage, length
border-bottom-color color
border-bottom-width length
border-color color
border-left-color color
border-left-width length
border-right-color color
border-right-width length
border-spacing length
border-top-color color
border-top-width length
border-width length
bottom length, percentage
color color
crop rectangle
font-size length, percentage
font-weight number
grid-* various
height length, percentage
left length, percentage
letter-spacing length
line-height number, length, percentage
margin-bottom length
margin-left length
margin-right length
margin-top length
max-height length, percentage
max-width length, percentage
min-height length, percentage
min-width length, percentage
opacity number
outline-color color
outline-offset integer
outline-width length
padding-bottom length
padding-left length
padding-right length
padding-top length
right length, percentage
text-indent length, percentage
text-shadow shadow
top length, percentage
vertical-align keywords, length, percentage
visibility visibility
width length, percentage
word-spacing length, percentage
z-index integer
zoom number

比如我們現在希望 width 跟 backgournd-color 都可以進行轉場變化,就可以這樣寫:

<div id="example-transition">
  <div class="ease">ease</div>
  <div class="linear">linear</div>
  <div class="easein">ease-in</div>
  <div class="easeout">ease-out</div>
  <div class="easeinout">ease-in-out</div>
</div>
#example-transition {
  width: 520px;
}
#example-transition div {
  width: 100px;
  margin: 5px 0;
  padding: 5px;
  color: white;
  background-color: #FF5050;
  text-align: right;
  border-radius: 5px;
}
#example-transition:hover div {
  width: 500px;
  background-color: #000000;
}
#example-transition div.ease {
  -webkit-transition: 3s ease;
  -moz-transition: 3s ease;
  -o-transition: 3s ease;
  -ms-transition: 3s ease;
  transition: 3s ease;
}
#example-transition div.linear {
  -webkit-transition: 3s linear;
  -moz-transition: 3s linear;
  -o-transition: 3s linear;
  -ms-transition: 3s linear;
  transition: 3s linear;
}
#example-transition div.easein {
  -webkit-transition: 3s ease-in;
  -moz-transition: 3s ease-in;
  -o-transition: 3s ease-in;
  -ms-transition: 3s ease-in;
  transition: 3s ease-in;
}
#example-transition div.easeout {
  -webkit-transition: 3s ease-out;
  -moz-transition: 3s ease-out;
  -o-transition: 3s ease-out;
  -ms-transition: 3s ease-out;
  transition: 3s ease-out;
}
#example-transition div.easeinout {
  -webkit-transition: 3s ease-in-out;
  -moz-transition: 3s ease-in-out;
  -o-transition: 3s ease-in-out;
  -ms-transition: 3s ease-in-out;
  transition: 3s ease-in-out;
}

我們在 hover 時有兩個 property 不一樣,一個是 width: 500px;、一個是 background-color: #000000;,這兩個 property 都是屬於可以進行轉場效果的,因此這樣寫就會一起變化,很簡單吧!

CSS3 Transition 第四級展示

結語

我們已經練完了 CSS3 Transition 大法的前四級,其實只要學會這些技巧,大概就能做出不錯的特效,只是動畫如何安排才會吸引人就要看個人的 Sense 了,像我就沒有什麼 Sense~

或許可以去請教對動畫最有 Sense 的 Rice Tseng 公主!

結果跟 CSS3 Animation 那篇文章完全一模一樣!真的好混啊!哈哈哈!!!

前言

在這個浮誇的時代,如果網頁上沒有酷炫的功能或特效,似乎就遜掉了;如何讓網頁變得酷炫呢?其中一個方法就是使用 CSS3 Animation!只要使用了 CSS3 Animation 就可以讓網頁中的元素動起來,立馬讓你的網頁酷炫度超越世界上 80% 的網頁!

而我個人身為一個全端工程師,稍微研究一下 CSS3 Animation 也是合理的,而且只要會一點點就可以拿來唬唬人,何樂而不為?很可惜這個技能就是唬不了正妹,哎,誰叫正妹只喜歡魔術呢~

不過請特別注意 CSS3 的 Animation 與 Transition 並不相同喔!雖然都可以做到相似的效果,有時看起來也真的很像,但實際上 Animation 與 Transition 依操作的程度不同所以適合使用的地方也會有所不同,或許我之後會再寫一篇文章介紹 Transition。(吧?)

就讓我們一起來看看 CSS3 Animation 大法怎麼練吧!

CSS3 Animation 第一級

假設我們要在一個 div 元素上加上動畫特效:

Step 1:定義要使用哪個關鍵影格(keyframe)來執行動畫

div {
    width: 100px;
    height: 100px;
    background: red;
    position: relative;
    -webkit-animation: animation-keyframe-name 5s; /* Chrome, Safari, Opera */
    -webkit-animation-iteration-count: infinite;
    animation: animation-keyframe-name 5s;
    animation-iteration-count: infinite;
}

這段 CSS 語法就是代表 div 元素要用哪個關鍵影格來執行動畫,詳細的動畫動作都會寫在關鍵影格裡面,在這邊的意思就是要使用一個名稱叫 animation-keyframe-name 的關鍵影格來進行動畫,後面的 5s 就代表這個動畫執行的時間會是 5 秒鐘。而 animation-iteration-count: infinite 則代表這個關鍵影格動畫會不斷重複執行。

特別注意有 -webkit- 這個前綴的 CSS 語法是為了支援 webkit 核心的瀏覽器,例如:Chrome、Safari、Opera 等等。

所以這段語法翻譯成白話文就是:div 這個元素要使用一個叫做 animation-keyframe-name 的關鍵影格來進行動畫,動畫執行的時間長度為 5 秒鐘,且動畫會不斷重複執行。

keyframe 的名稱如果不想要叫 animation-keyframe-name,也可以改成其他的,比如:fadein-keyframefadeout-keyframe 等等。

Step 2:定義關鍵影格(keyframe)中動畫如何變化

/* Chrome, Safari, Opera */
@-webkit-keyframes animation-keyframe-name {
    from {background: red;}
    to {background: yellow;}
}

/* Standard syntax */
@keyframes animation-keyframe-name {
    from {background: red;}
    to {background: yellow;}
}

這段 CSS 語法就定義了 animation-keyframe-name 這個關鍵影格的動畫變化,它會在 5 秒之內從原本背景色紅色(from {background: red;})變為背景色黃色(to {background: yellow;}),就這樣我們就可以寫好 CSS3 動畫了,超簡單 der!

CSS3 Animation 第一級展示

CSS3 Animation 第二級

CSS3 Animation 第一級只有 from to 這兩種狀態可以指定動畫的變化,總感覺缺少了點什麼,如果好死不死動畫想要指定三種狀態變化怎麼辦?這時就要使用 CSS3 Animation 第二級了!在 CSS3 Animation 第二級我們可以使用動畫執行時間百分比來指定動畫變化的狀態。

/* Chrome, Safari, Opera */
@-webkit-keyframes animation-keyframe-name {
    0%   {background: red; left:0px; top:0px;}
    25%  {background: yellow; left:200px; top:0px;}
    50%  {background: blue; left:200px; top:200px;}
    75%  {background: green; left:0px; top:200px;}
    100% {background: red; left:0px; top:0px;}
}

/* Standard syntax */
@keyframes animation-keyframe-name {
    0%   {background: red; left:0px; top:0px;}
    25%  {background: yellow; left:200px; top:0px;}
    50%  {background: blue; left:200px; top:200px;}
    75%  {background: green; left:0px; top:200px;}
    100% {background: red; left:0px; top:0px;}
}

這段 CSS 語法將動畫的變化分成五個狀態,在動畫執行時間 0% 的時候是背景紅色的狀態(0% {background: red;}),在動畫執行時間 25% 的時候是背景黃色的狀態(25% {background: yellow;}),在動畫執行時間 50% 的時候是背景藍色的狀態(50% {background: blue;}),在動畫執行時間 75% 的時候是背景綠色的狀態(75% {background: green;}),在動畫執行時間 100% 的時候是背景變回紅色的狀態(100% {background: red;}),在我們這個例子裡動畫執行時間 100% 也就是動畫執行時間在第五秒的時候。如此我們就可以做更多細緻的動畫了。

CSS3 Animation 第二級展示

CSS3 Animation 第三級

在 CSS3 Animation 第三級我們可以使用更多屬性(property)來讓動畫有更多調整的空間,這些 animation 相關的 property 列表如下:

CSS 屬性 說明
animation-delay 設定元素在被載入之後到開始執行動畫之間的延遲時間
animation-direction 設定元素在動畫執行完之後,是否要以相反方向的方式播放,或是從頭開始以原來的方向重複播放。
animation-duration 設定整個動畫執行一次的時間長度
animation-iteration-count 設定動畫執行的次數,若要不斷重複執行,則可設為 infinite
animation-play-state 可用來暫停或繼續動畫播放
animation-fill-mode 設定元素在動畫執行前後如何套用 CSS 的樣式
animation-timing-function 設定動畫執行的時間函數

我們將所有動畫相關的屬性都使用看看:

div {
    width: 100px;
    height: 100px;
    background: red;
    position: relative;
    /* Chrome, Safari, Opera */
    -webkit-animation-name: animation-keyframe-name;
    -webkit-animation-duration: 5s;
    -webkit-animation-timing-function: linear;
    -webkit-animation-delay: 2s;
    -webkit-animation-iteration-count: infinite;
    -webkit-animation-direction: alternate;
    -webkit-animation-play-state: running;
    /* Standard syntax */
    animation-name: animation-keyframe-name;
    animation-duration: 5s;
    animation-timing-function: linear;
    animation-delay: 2s;
    animation-iteration-count: infinite;
    animation-direction: alternate;
    animation-play-state: running;
}

CSS3 Animation 第三級展示

感覺越來越強了!

CSS3 Animation 第四級

在 CSS3 Animation 第三級我們學會使用更多動畫相關屬性了,但 CSS 的語法卻變得很冗長,這時就要使出 CSS3 Animation 第四級,這樣就可以寫出更精簡的 CSS3 Animation 語法了!

上面例子的:

animation-name: animation-keyframe-name;
animation-duration: 5s;
animation-timing-function: linear;
animation-delay: 2s;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-play-state: running;

可以改寫成:

animation: animation-keyframe-name 5s linear 2s infinite alternate;

所以就會變成:

div {
    -webkit-animation: animation-keyframe-name 5s linear 2s infinite alternate; /* Chrome, Safari, Opera */
    animation: animation-keyframe-name 5s linear 2s infinite alternate; /* Standard syntax */
}

CSS3 Animation 大法大功告成!

CSS3 Animation 第四級展示

結語

我們已經練完了 CSS3 Animation 大法的前四級,其實只要學會這些技巧,大概就能做出不錯的特效,只是動畫如何安排才會吸引人就要看個人的 Sense 了,像我就沒有什麼 Sense~

或許可以去請教對動畫最有 Sense 的 Rice Tseng 公主!

前言

最近為了 training 新人,我在 iNDIEVOX 主持了每兩週會舉行一次的技術分享會,每位與會人員都需要準備一個分享講題,講題可以是任何開發技術相關的主題,甚至是相關產業新聞。

不過最近有些忙碌,加上世界杯熬夜的影響,我自己得準備的分享講題眼看就要開天窗了,只好拿出去年在 HappyDesigner Mini 分享會 #3 的講題來充充場面,剛好也可以逼自己整理成 blog!

那麼…… 究竟要如何做出網頁版 iTunes 11 的封面背景特效呢?在哪裡才能買得到呢?

… … 我們這邊會直接說明如何實作,所以是買不到的喔!

觀察分析

首先讓我們觀察分析一下 iTunes 11 的封面特效:

透過我們精準的觀察與分析之後,我們可以將 iTunes 11 的封面特效歸納成以下三點:

  1. 專輯資訊字體顏色配色與專輯封面配色相似
  2. 專輯資訊區塊背景色與專輯封面背景色相似
  3. 專輯資訊區塊背景色形成一個模糊遮罩蓋在專輯封面上

也就是說我們只要做到以上三點,大概就可以做到類似 iTunes 11 的封面特效了!

實作

Step 1:實作蓋在專輯封面上模糊遮罩

首先我們先不管顏色,看看是否能用 CSS 3 來實作蓋在專輯封面上模糊遮罩,研究一番之後發現並不難實作,CSS 3 的語法如下:

.mask {
    box-shadow: rgb(9, 8, 9) 14px 17px 25px inset,
                rgb(9, 8, 9) -1px -1px 170px inset;
}

我們使用 CSS 3 中的 box-shadow 這個 property 來實做陰影效果,將這個陰影蓋在封面上便可以形成一個模糊遮罩,其中 rgb(9, 8, 8) 表示陰影的顏色,inset 表示陰影是往區塊內部長,14px 17px 25px 分別表示陰影向水平方向長的長度、陰影向垂直方向長的長度、陰影模糊的長度,由於陰影是向區塊內長,分別就表示水平方向由左向內長 14px 的陰影、垂直方向由上向內長 17px、然後都長 25px 的模糊程度。

同理類推,底下的 rgb(9, 8, 9) -1px -1px 170px inset 就表示水平方向由右向內長 1px 的陰影、垂直方向由下向內長 1px、然後都長 170px 的模糊程度。

這個語法會形成像這樣的效果:

太棒了!小小的一段 CSS 3 語法居然帶給我們這麼大的成就感,聰明的我們把這個遮罩蓋在封面像就會形成這樣的效果:

如此我們就可以暫時使用黑色背景、白色字體、黑色遮罩來完成第一版的 iTunes 11 封面背景效果。

第一版成品展示

Step 2:萃取出專輯封面主要顏色,讓背景色、字體顏色、模糊遮罩配色與專輯封面配色相似

實作完模糊遮罩之後,剛剛第一步我們先擱在一邊的顏色就是接下來的重點了,所謂「萃取出專輯封面主要顏色」究竟是怎麼一回事呢?感覺好像需要用到演算法?沒有錯!要取出專輯封面的主要顏色確實需要借助演算法這個高深的技巧!

我們可以以人類最直觀的想法來猜猜演算法應該會怎麼實作:首先每張圖片都是由若干像素組合而成,而每個像素都有一個顏色,我們可以用數數的方式找出最多相同顏色的像素取出成為一個代表色,若要找出多個代表色,那就可以用同的想法類推,讓顏色接近的像素聚集在一起,分成一堆一堆的,若要取十個顏色,就分成十堆,讓每一堆的像素數都相同,然後將這十個顏色堆的顏色取平均色,我們就可以萃取出圖片的十個代表色了!

類似想法的演算法其實已經有許多人想出來、也實作好程式了,其中一個最有名的演算法就叫做 Color Quantization,它的核心精神就像我們上述的做法一樣把圖片的顏色像切豆腐一樣去分堆,去找出代表色,各種不同的演算法其實就只是在於切法的不同而已!

其實這樣的演算法最早是用來壓縮圖像使用的,我們希望儘量用較少的顏色來重畫原來的圖片,又不希望重畫的圖片與原來的圖片差太多,因此就要找出圖片的主要代表色來重畫原圖,這樣重畫的壓縮圖片就不會與原來的圖片差太多,又能達到壓縮效果!

詳細演算法可以寫成好幾篇部落格,因此我就不在這邊贅述,有興趣詳細了解的可以參考這個網站

我們現在已經知道要取出圖片的主要代表色就要使用 Color Quantization 演算法,那接下來要自己實做演算法嗎?哈哈哈!當然不必啊!像這種有名的演算法一定有一大堆已經寫好的開源碼可以使用!

這邊我們使用 Color Thief 來取出圖片的主要代表色,首先引入函式庫到網頁中:

<script type="text/javascript" src="/path/to/color-thief.min.js">
</script>

然後用以下語法來得到圖片的主要代表色:

myImage = $('#myImage');
var colorThief = new ColorThief();
colorThief.getPalette(myImage, 8);

其中的 8 就是表示要取出圖片八個主要代表色,同理你要取出十個主要代表色,就改成 colorThief.getPalette(myImage, 10) 就可以了!很簡單吧!!

如此我們就可以使用 Color Thief 取出的第一個主要顏色來畫背景及遮罩、第二個主要顏色畫字體完成第二版的 iTunes 11 封面背景效果,這樣的效果就已經很不錯了!

第二版成品展示

Step 3:調整、調整、再調整

從第二版的 iTunes 11 封面背景效果展示中,其實我們已經得到了不錯的效果,但我們會發現有些地方會怪怪的,比如:

這個封面中,Color Thief 取出的第一個代表色是灰色,所以造成了我們不想要的結果,但其實又不能說是 Color Thief 或是 Color Quantization 演算法的錯,因為這張封面確實有蠻多像素是屬於灰色系列的。

我們認為較好的結果就是讓專輯資訊區塊的背景色及遮罩能和封面的背景色是類似的,在這個例子裡我們希望得到的是米分糸工色的!我們開怎麼辦呢?

我們可以做的就是去調整演算法,讓 Color Thief 取出代表色時只算封面中屬於背景部份的像素!感覺很直觀嘛!

問題在於…

請翻譯翻譯他媽的要怎麼告訴程式只算封面背景部份的像素啊啊啊啊!!!!

其實找出圖片中屬於背景的部份這個問題我們並不是第一個遇到的,這個問題也已經探討很久了,目前也有許多方法被研發出來,有很多方法甚至牽涉到機器學習領域的研究,我們這邊當然也可以用這些方法來解,但我就不引用這些方法了,我們可以利用一個更直觀的方法來完成!

我們可以再觀察一下 iTunes 11 的封面特效,我們可以發現背景色的遮罩效果會與封面的上半部及左半部溶在一起,那我們可不可以動一些手腳來讓 Color Thief 只計算封面上半部及左半部的像素呢?當然可以啊!

所以我們就以這樣的想法對 Color Thief 做了一點 Hack,修改的語法大致如下:

for (var i = 0; i<image_data.length; i=i+4) {
    r = image_data[i + 0];
    g = image_data[i + 1];
    b = image_data[i + 2];
    a = image_data[i + 3];

    if ( i<(image_data.length*0.30) || (i%(image.width*4))<(image.width*0.30) ) {
        bg_image_data_array.push([r, g, b]);
    }

}

var bg_cmap = MMCQ.quantize(bg_image_data_array, 5);
var bg_palette = bg_cmap.palette();

其中 i<(image_data.length*0.30) 就代表圖片中上面 30% 部分的像素資料,(i%(image.width*4))<(image.width*0.30) 就代表圖片中左邊 30% 部分的像素資料,這樣就可以讓 Color Thief 只計算封面上半部及左半部的像素了!

像這樣的方法在學術上就稱為 Heuristic Algorithm,以最直觀的方式來設計演算法,雖然可能不會得到最佳解,但常常能得到一些不錯的效果!

如此我們就可以使用 Hack 調整過後的 Color Thief 取出的第一個主要顏色來畫背景及遮罩、第二個主要顏色畫字體來完成完全體的 iTunes 11 封面背景效果,感覺一切都對了啊!!!

完全體成品展示

結語

關於這個主題,我有製作 HappyDesigner Mini 分享會 #3 時使用的投影片,投影片連結在此,有興趣的人可以參考看看。

我們這邊完整說明了如何做出網頁版 iTunes 11 的封面背景特效,使用了許多第三方的函式庫來幫助實作,也可以在這樣的練習中學習如何一步一步的完成我們最終想完成的目標。

其中也發現了許多可以精進的地方,例如取得主要顏色的演算法、機器學習自動偵測圖片背景部份這樣的問題,若要取得更好的結果,就是要更深入去研究相關演算法來得到更令人滿意的結果,而演算法這個領域其實如同偉大航道的新世界一樣充滿驚奇啊!未來有機會更深入研究的話希望也能跟大家分享~

前一陣子大家非常瘋 Parallax Scrolling 網頁,主要是利用人們瀏覽網頁時最習慣的動作「滾動」來做一些特效,讓使用者透過簡易的滾動就能瀏覽完整個網頁。

Parallax Scrolling 中文翻成視差滾動,wiki 上的定義上說明這是電腦圖學中一種特別的滑動特效技巧,原理是把背景圖片的移動速度放慢,讓前景圖片移動較快,因而在2D畫面上產生多層次的佈景深度。

但說了這麼多,不如還是透過實際的例子來感受一下什麼是 Parallax Scrolling,20 Best Websites with Parallax Scrolling of 2013 中就有許多有趣的例子!

如果仔細去研究這些例子的原始碼就會發現,要做這樣的網頁實在很費工,如果可以的話當然想找找有什麼方法可以快速的做好一個 Parallax Scrolling 網頁,於是就在 github 上找到了 skrollr

skrollr 的使用方法真的非常簡單,步驟如下:

Step1:引入函式庫到網頁中:

<script type="text/javascript" src="/path/to/skrollr.min.js">
</script>

Step2:在網頁底端初始化 skrollr

<script type="text/javascript">
    var skrollr_obj = skrollr.init();
</script>

Step3:利用以下語法來安排網頁中元素的轉場

<div data-0="background-color:rgb(0,0,255);" data-500="background-color:rgb(255,0,0);">
    WOOOT
</div>

上面語法的意義就是使用者滾動位置從 0 滾動到 500 時 div 的 CSS 樣式變化,也就是說使用者滾動位置到 500 時,div 的背景色會從原來的藍色慢慢變為紅色。

如果要做淡出功能可以這樣寫:

<div data-2100="opacity: 1;" data-2400="opacity: 0;">
    <img src="/public/image/show-case/skrollr-demo/cell.png">
</div>

如果要做漸漸模糊功能可以這樣寫:

<div data-2100="-webkit-filter: blur(0px);" data-2400="-webkit-filter: blur(5px);">
    <img src="/public/image/show-case/skrollr-demo/cell.png">
</div>

以此類推,當然我們也可以寫 data-100 至 data-1000 的 CSS 樣式變化,因此我們可以很方便的安排網頁中元素的轉場,做出簡易的 Parallax Scrolling 網頁。

這麼簡易好用,應該所有剛接觸網頁設計的人都會用吧!所以我就現學現賣做了一個 天下第一武道大會 網頁!小時候的回憶湧上心頭啊!

會踩雷的地方請特別注意

撰寫 CSS 轉場變化時要特別注意,每一個階段的 CSS 樣式一定要一致,舉個例子來說,當某個階段的 CSS 樣式有 opacity: 0;-webkit-filter: blur(0px);,其他階段的 CSS 樣式也一定要有 opacity: *;-webkit-filter: blur(*px);,否則會得到非預期的結果。

例如這樣是錯的寫法(在 data-2400 少寫了 opacity 的樣式):

<div data-2100="opacity: 1;-webkit-filter: blur(0px);" data-2400="-webkit-filter: blur(5px);">
    <img src="/public/image/show-case/skrollr-demo/cell.png">
</div>

這樣才是正確的寫法(data-2100 有寫到 opacity, -webkit-filter,data-2400 就要寫到 opacity, -webkit-filter):

<div data-2100="opacity: 1;-webkit-filter: blur(0px);" data-2400="opacity: 0;-webkit-filter: blur(5px);">
    <img src="/public/image/show-case/skrollr-demo/cell.png">
</div>

Fukuball

我是林志傑,網路上常用的名字是 Fukuball。我使用 PHP 及 Python,對機器學習及區塊鏈技術感到興趣。 https://www.fukuball.com

Co-Founder / Head of Engineering at OurSong

Taipei, Taiwan