Iconista首頁背后的故事

Preface

上次的預告這次到來,今天就來扒一扒Iconista的頁面企蹭。本文篇幅不長白筹,精力投入不多,權當水貼一篇谅摄,內容簡短徒河,適合飯后閱讀。

Iconista 首頁

http://urinx.github.io/app/iconista/ 送漠,地址放出虚青,歡迎來踩。

Dock

由于Iconista的性質決定了其不過是一個簡單的Mac美化主題工具螺男,所以頁面必須要一眼就能突出其特性棒厘。

于是乎纵穿,最后決定了選擇這個Launchpad樣式,既能展現給大家其作用奢人,又能直觀的演示出最后的效果谓媒,并且給人一種耳目一新的感覺。

Launchpad

當方案拍定后何乎,立馬就開干句惯。既然是百分百將launchpad復制到瀏覽器中,總不能直接全部弄張圖片就了事支救,這是絕不能馬虎抢野,哥要的就是逼真,高仿各墨。

第一步指孤,就是高仿最具有象征性的Dock。

<div class="dock">
    <div class="dock-container">
        <a class="dock-item" href="#">
            <span class="bubble">Finder</span>
            <img src="res/apps/finder.png" />
        </a>
        ...
    </div>
</div>

這里用的是一個jQuery插件

        $('.dock').Fisheye(
            {
                maxWidth: 50,
                items: 'a',
                itemsText: 'span',
                container: '.dock-container',
                itemWidth: 60,
                proximity: 80,
                alignment : 'left',
                valign: 'bottom',
                halign : 'center'
            }
        );

然后修改其樣式贬堵,使之成為Yosemite風格——白色磨砂透明的Dock欄恃轩。

.dock{
    width: 100%;
    height: 10%;
    position: absolute;
    bottom: 0;
    opacity: 0;
    -webkit-transition: all 3s ease;
       -moz-transition: all 3s ease;
        -ms-transition: all 3s ease;
         -o-transition: all 3s ease;
            transition: all 3s ease;
}
.dock-container {
    position: absolute;
    height: 100%;
    background: rgba(255,255,255,0.3);
    padding-left: 20px;
    border-radius: 8px 8px 0 0;

    -moz-transform: translateX(-10px);
    -webkit-transform: translateX(-10px);
    -o-transform: translateX(-10px);
    -ms-transform: translateX(-10px);
    transform: translateX(-10px);
}
a.dock-item {
    display: block; 
    font: 12px Arial, Helvetica, sans-serif;
    width: 60px;
    bottom: 0px;
    position: absolute;
    text-align: center;
    text-decoration: none;
}
.dock-item span {
    display: none;
    margin-left: 20px;
    color: black;
}
.dock-item img {
    border: none;
    margin: 5px 10px 0px;
    width: 100%;
}
.bubble{
    display: block;
    background: rgba(255,255,255,0.8);
    border-radius: 3px;
    padding: 5px;
}
.bubble:before{
    content: ' ';
    position: absolute;
    top: 24px;
    left: 55px;
    width: 0;
    height: 0;
    border: 10px solid;
    border-color: rgba(255,255,255,0.8) transparent transparent transparent;
}

就連小氣泡我們也要加上,絕不含糊黎做,有圖有真相叉跛!

Dock

Loading

由于頁面上的圖標太多,再加上一個炫酷的大背景蒸殿,在網絡情況不好的時候的確很尷尬筷厘。本來不想搞個什么鬼loading動畫,只想讓每個icon 圖標依次加載然后慢慢墜落下來宏所,就像iPhone解鎖屏幕后App墜落的那個動畫效果敞掘。奈何嫌麻煩,于是就干脆用個loading楣铁,等圖標全部下載完成后再顯示出來玖雁。

好吧,我能說連loading畫面都不是自己寫的盖腕,在這里感謝codepen赫冬,在codepen上隨手一搜找了個——Battlefield 3 Loading Indicator

Battlefield 3 Loading Indicator

一個純CSS3寫的Loading溃列,直接塞進去就行了劲厌。

...
<link rel="stylesheet" type="text/css" href="css/loading.css">
...
<div class="wrap">
    <div class="bg">
        <div class="loading">
            <span class="title">loading</span>
            <span class="text">tehran highway</span>
        </div>
    </div>
</div>

我們用js在后面加載圖片,這個是加載圖片的函數:

function loadimg(arr,funLoading,funOnLoad,funOnError){
    var numLoaded=0,
    numError=0,
    isObject=Object.prototype.toString.call(arr)==="[object Object]" ? true : false;
 
    var arr=isObject ? arr.get() : arr;
    for(a in arr){
        var src=isObject ? $(arr[a]).attr("data-src") : arr[a];
        preload(src,arr[a]);
    }
 
    function preload(src,obj){
        var img=new Image();
        img.onload=function(){
            numLoaded++;
            funLoading && funLoading(numLoaded,arr.length,src,obj);
            funOnLoad && numLoaded==arr.length && funOnLoad(numError);
        };
        img.onerror=function(){
            numLoaded++;
            numError++;
            funOnError && funOnError(numLoaded,arr.length,src,obj);
        }
        img.src=src;
    }
 
}

我們把要加載的圖片路徑全塞進一個數組里听隐,當所有數組里圖片全部加載完成后隱藏loading畫面补鼻,然后給要顯示的頁面一個淡出的效果(透明度從零到一):

        // ==== Preload images =====
        var imgSrcArr=[
        'res/bg.jpg',
        'res/apps/Safari.app.png',
        'res/apps/Mail.app.png',
        'res/apps/Contacts.app.png',
        'res/apps/Calendar.app.png',
        'res/apps/Reminders.app.png',
        'res/apps/Notes.app.png',
        'res/apps/Maps.app.png',
        'res/apps/Messages.app.png',
        'res/apps/FaceTime.app.png',
        'res/apps/Photo Booth.app.png',
        'res/apps/iTunes.app.png',
        'res/apps/iBooks.app.png',
        'res/apps/App Store.app.png',
        'res/apps/Game Center.app.png',
        'res/apps/Preview.app.png',
        'res/apps/Dictionary.app.png',
        'res/apps/Calculator.app.png',
        'res/apps/Dashboard.app.png',
        'res/apps/iPhoto.app.png',
        'res/apps/GarageBand.app.png',
        'res/apps/iMovie.app.png',
        'res/apps/Numbers.app.png',
        'res/apps/Keynote.app.png',
        'res/apps/Pages.app.png',
        'res/apps/Photos.app.png',
        'res/apps/Mission Control.app.png',
        'res/apps/System Preferences.app.png',
        'res/apps/VirtualBox.app.png',
        'res/apps/Xcode.app.png',
        'res/apps/Evernote.app.png',
        'res/apps/Pocket.app.png',
        'res/apps/feedly.app.png',
        'res/apps/Alfred 2.app.png',
        'res/apps/SystemPal.app.png',
        'res/apps/BetterTouchTool.app.png',
        'res/apps/Pushbullet.app.png',
        'res/apps/Tumblr.app.png',
        'res/apps/Shazam.app.png',
        'res/apps/MPlayerX.app.png',
        'res/apps/Sublime Text.app.png',
        'res/apps/Microsoft Remote Desktop.app.png',
        'res/apps/Google Chrome.app.png',
        'res/apps/VMware Fusion.app.png',
        'res/apps/OmniFocus.app.png',
        'res/apps/7zX.app.png',
        ];

        function setPage(el,a,b){
            var html=[];
            for (var i = a; i < b; i++) {
                var appItem='<a class="app-item" href="#">\
                                <img src="'+imgSrcArr[i]+'" />\
                                <span>'+imgSrcArr[i].replace('res/apps/','').replace('.app.png','')+'</span>\
                            </a>';
                html.push(appItem);
            }
            el.innerHTML=html.join('');
        }

        loadimg(imgSrcArr,null,function(){
            setPage($('.app-list')[0],1,28);
            setPage($('.app-list')[1],28,imgSrcArr.length);
            $('.wrap').css('display','none');
            $('body').css('background','url(res/bg.jpg) no-repeat');
            $('body').css('background-size','100% 100%');
            $('.app').css('opacity','1');
            $('.dock').css('opacity','1');
        },null);

至此,loading部分結束。

Download

話說最后這個簡介的部分也是構思了好久风范,如何用最少的字最大限度的表達出效果的確不容易咨跌。在追求簡潔這一點上,我們絕不妥協(xié)硼婿,這一點也讓我們十分痛苦锌半,不過最終我們還是做到了。

最后的效果就是下圖寇漫,我們刪繁就簡刊殉,追求極致。

總共就只有兩個按鈕州胳,一個提供下載记焊,直截了當,不留任何余地栓撞,直接戳中一部分人的痛點(老子就是過來下這個的遍膜,那么多文字給誰看啊)腐缤;剩下的另一部分人更多的則是對細節(jié)或是代碼感興趣,一個Github按鈕足矣肛响。詳細的使用說明都在README.md文檔寫的很清楚岭粤,主頁上寫那么多干嘛,他們更愿意看的是這個特笋。

Mobile

對于移動端我沒什么好說的剃浇,前面那些高仿Mac的效果本來就不是給你用手機看的,所以說也管不了那么多兼不兼容的問題猎物。

但是話又說回來虎囚,總不能讓手機不能看吧,那多么尷尬啊蔫磨,但又不能太麻煩淘讥,一切從簡出發(fā)。所以最后簡單粗暴的就直接加了一段:

<div class="mobile">
    <h1>Iconista</h1>
    <span>A super awesome cool icon tool, make your Mac OS X more cute!</span>
    <img src="res/head.jpg">
    <center>
        <a >Download</a>
        <a  target="_blank">Github</a>
    </center>
</div>

然后在css里用一個簡單的媒體查詢對是否是移動端做了一個判斷:

body::before {
    content: 'mobile';
    display: none;
}
@media only screen and (min-width: 770px) {
    body::before {
        content: 'desktop';
    }
}
...

并且為mobile類單獨寫了一套樣式:

.mobile{
    display: none
}
@media only screen and (max-width: 770px) {
    .dock, .search, .app{
        display: none;
    }
    .mobile{
        display: block;
        opacity: 0;
        width: 300px;
        height: 100%;
        margin: auto;

        -webkit-transition: all 3s ease;
        -moz-transition: all 3s ease;
        -ms-transition: all 3s ease;
        -o-transition: all 3s ease;
        transition: all 3s ease;
    }
}
.mobile a{
    ...
}
...

最后在js里也進行了一個判斷堤如,那些加載圖片的操作之類的在移動端就可以不用進行了(loading這個時候就沒有意義了蒲列,不過還是留下來了):

    var MQ = window.getComputedStyle(document.querySelector('body'), '::before').getPropertyValue('content').replace(/["']/g, "");

    if (MQ == 'mobile') {
        setTimeout(function(){
            $('.wrap').css('display','none');
            $('.mobile').css('opacity','1');
        },5000);
    }
    else {
        ...
    }

最后效果如圖:

手機端

Icon Vibratiton

最后這個純屬無聊蛋疼之舉,當然也是為了盡量逼真一下嘛——當你鼠標滑過icon圖標時搀罢,加了一個抖動的效果蝗岖,就是那個熟悉的每次你要刪除App時出現的抖動。

...
@-webkit-keyframes vibrate {
0% {
    -moz-transform: translate(2px,1px) rotate(5deg);
    -webkit-transform: translate(2px,1px) rotate(5deg);
    transform: translate(2px,1px) rotate(5deg);
}
25% {
    -moz-transform: translate(-2px,-1px) rotate(-5deg);
    -webkit-transform: translate(-2px,-1px) rotate(-5deg);
    transform: translate(-2px,-1px) rotate(-5deg);
}
50% {
    -moz-transform: translate(2px,1px) rotate(5deg);
    -webkit-transform: translate(2px,1px) rotate(5deg);
    transform: translate(2px,1px) rotate(5deg);
}
75% {
    -moz-transform: translate(-2px,-1px) rotate(-5deg);
    -webkit-transform: translate(-2px,-1px) rotate(-5deg);
    transform: translate(-2px,-1px) rotate(-5deg);
}
100% {
    -moz-transform: translate(2px,1px) rotate(5deg);
    -webkit-transform: translate(2px,1px) rotate(5deg);
    transform: translate(2px,1px) rotate(5deg);
}
}
...
Vibratiton

Last

最后的最后榔至,歡迎大家關注我的微信公眾號(urinx)抵赢,滿滿的干貨

如果你有什么建議和想法想和我交流,各種bug想要反饋,或者純屬想要交朋友铅鲤,這是我的微信(google-2)

wechat
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末划提,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子彩匕,更是在濱河造成了極大的恐慌腔剂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驼仪,死亡現場離奇詭異掸犬,居然都是意外死亡,警方通過查閱死者的電腦和手機绪爸,發(fā)現死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門湾碎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奠货,你說我怎么就攤上這事介褥。” “怎么了递惋?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵柔滔,是天一觀的道長。 經常有香客問我萍虽,道長睛廊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任杉编,我火速辦了婚禮超全,結果婚禮上,老公的妹妹穿的比我還像新娘邓馒。我一直安慰自己嘶朱,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布光酣。 她就那樣靜靜地躺著疏遏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪救军。 梳的紋絲不亂的頭發(fā)上改览,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音缤言,去河邊找鬼宝当。 笑死,一個胖子當著我的面吹牛胆萧,可吹牛的內容都是我干的庆揩。 我是一名探鬼主播俐东,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼订晌!你這毒婦竟也來了虏辫?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤锈拨,失蹤者是張志新(化名)和其女友劉穎砌庄,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體奕枢,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡娄昆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了缝彬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萌焰。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谷浅,靈堂內的尸體忽然破棺而出扒俯,到底是詐尸還是另有隱情,我是刑警寧澤一疯,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布撼玄,位于F島的核電站,受9級特大地震影響墩邀,放射性物質發(fā)生泄漏掌猛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一磕蒲、第九天 我趴在偏房一處隱蔽的房頂上張望留潦。 院中可真熱鬧只盹,春花似錦辣往、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孵稽,卻和暖如春许起,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菩鲜。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工园细, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人接校。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓猛频,卻偏偏與公主長得像狮崩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鹿寻,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評論 25 707
  • 發(fā)現 關注 消息 iOS 第三方庫睦柴、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,093評論 4 62
  • 今日觀點:你要是永遠只任用比自己水平差的人毡熏,那么我們的公司就會淪為侏儒坦敌,你要是敢于啟用比自己水平高的人,我們就會成...
    楊雪雪閱讀 191評論 0 1
  • Nginx介紹 Nginx這是一個在IT界很流行的名字 如果你聽說過Nginx那你就應該知道他是什么,干什么用的 ...
    數據革命閱讀 487評論 0 0
  • 在我們的生活中,或多或少都會遇到一切靈異事件疯暑,有時候我們并無察覺训柴,或是覺得自己在嚇唬自己,可是在一些特定的情境妇拯,特...
    惡童閱讀 1,212評論 2 8