Google LOGO的CSS Sprite

css-sprite

為紀(jì)念美國現(xiàn)代舞舞蹈家瑪莎·葛蘭姆誕辰,Google Doodle推出了一款極其炫酷的LOGO葫掉,整個(gè)LOGO使用CSS Sprite技術(shù)赤屋,利用一個(gè)初始圖片和一張畫滿各個(gè)動(dòng)作的拼接圖片碍岔,實(shí)現(xiàn)了動(dòng)畫畏线,而非傳統(tǒng)的GIF動(dòng)畫圖像。

效果

原文查看效果

CSS Sprite簡(jiǎn)介

CSS Sprites(css精靈)方篮,是一種網(wǎng)頁圖片應(yīng)用處理方式名秀。它允許你將一個(gè)頁面涉及到的所有零星圖片都包含到一張大圖中去,這樣一來藕溅,當(dāng)訪問該頁面時(shí)匕得,載入的圖片就不會(huì)像以前那樣一幅一幅地慢慢顯示出來了。
限制:不高于200KB的單張圖片

整合處理圖片的目的是減少請(qǐng)求次數(shù)巾表,如果每一張圖片都向服務(wù)器發(fā)送請(qǐng)求汁掠,即影響服務(wù)器負(fù)載也影響頁面性能。

CSS Sprite原理

CSS Sprites的原理就是把網(wǎng)頁中用到的小圖標(biāo)集币、圖片類集中整合到一張圖片中考阱。
再利用CSS中的背景屬性

  • background-image
  • background-repeat
  • background-position

當(dāng)需要顯示指定圖片時(shí),定位到圖片相應(yīng)位置即可

Google粘土動(dòng)畫

實(shí)現(xiàn)步驟:
1鞠苟、準(zhǔn)備素材乞榨,設(shè)計(jì)動(dòng)畫的每一幀圖片并整合成一張圖片
2、監(jiān)聽點(diǎn)擊事件執(zhí)行動(dòng)畫
3当娱、根據(jù)延遲時(shí)間設(shè)置圖片背景位置以顯示下一幀圖片

素材

HTML

<div>
    <div style="display:flex;align-items:flex-end;">
        <div style="width:135px;height:156px;background:url(/images/css-sprite/blockheads.png) 0 0;" id="blockheads"></div>
        <div style="width:65px;height:102px;background:url(/images/css-sprite/prickle.png) 0 0;" id="prickle"></div>
        <div style="width:67px;height:144px;background:url(/images/css-sprite/goo.png) 0 0;" id="goo"></div>
        <div style="width:98px;height:156px;background:url(/images/css-sprite/gumby.png) 0 0;" id="gumby"></div>
        <div style="width:75px;height:108px;background:url(/images/css-sprite/pokey.png) 0 0;" id="pokey"></div>
    </div>
</div>

JS

<script>
    class Sprite {
        constructor(opt) {
            this.element = document.getElementById(opt.element);
            this.url = opt.url;
            this.delay = 1000 / (opt.speed || 20);
            this.defaultBackground = this.element.style.background;
            this.defalutUrl = this.element.style.backgroundImage;
            this.step = 0;
            this.width = this.element.clientWidth;
            this.height = this.element.clientHeight;
            let img = new Image();
            img.onload = () => {
                this.cols = parseInt(img.width / this.width);
                this.rows = parseInt(img.height / this.height);
                this.frames = this.cols * this.rows;
                this.element.onclick = () => {
                    this.play();
                };
            };

            img.src = this.url;
        }

        play() {
            if (this.playing) {
                return;
            }
            this.playing = true;
            this.next();
        }

        next() {
            this.step++;
            if (this.step > this.frames) {
                this.stop();
                return;
            }
            let x = this.step % this.cols;
            let y = parseInt(this.step / this.rows);
            if (this.step % this.rows > 0) {
                y++;
            }
            var position = "-" + (x - 1) * this.width + "px -" + (y - 1) * this.height + "px";
            this.element.style.background = "url(" + this.url + ") " + position;
            setTimeout(() => {
                this.next();
            }, this.delay);
        }

        stop() {
            this.step = 0;
            this.playing = false;
            this.element.style.background = this.defaultBackground;
        }
    }

    window.addEventListener('load', () => {
        new Sprite({
            element: 'blockheads',
            url:'/images/css-sprite/blockheads.png'
        });
        new Sprite({
            element: 'prickle',
            url:'/images/css-sprite/prickle.png'
        });
        new Sprite({
            element: 'goo',
            url:'/images/css-sprite/goo.png'
        });
        new Sprite({
            element: 'gumby',
            url:'/images/css-sprite/gumby.png'
        });
        new Sprite({
            element: 'pokey',
            url:'/images/css-sprite/pokey.png'
        });
    });
</script>

Google舞蹈者

實(shí)現(xiàn)步驟:
1吃既、準(zhǔn)備素材,收集舞蹈者每一個(gè)動(dòng)作集成到一張圖片
2跨细、初始化每一個(gè)動(dòng)作的位置
3鹦倚、定時(shí)動(dòng)態(tài)創(chuàng)建div元素設(shè)置背景位置和元素位置

素材

HTML

<div id="graham-logo" style="position:relative;height:150px;"></div>

JS

(function () {
    window.google={};
        if (!google.doodle) google.doodle = {};
        var d = [
                [307, 48, 88, 89],
                [307, 48, 89, 89],
                [307, 48, 91, 89],
                [305, 49, 93, 89],
                [305, 50, 93, 88],
                [305, 50, 93, 88],
                [306, 52, 92, 86],
                [305, 53, 93, 84],
                [305, 54, 94, 83],
                [306, 54, 93, 83],
                [307, 54, 92, 83],
                [307, 54, 92, 83],
                [308, 54, 90, 83],
                [308, 54, 90, 83],
                [306, 53, 91, 84],
                [306, 53, 91, 84],
                [308, 53, 90, 84],
                [308, 53, 90, 84],
                [305, 53, 92, 84],
                [305, 52, 92, 85],
                [306, 52, 91, 85],
                [308, 51, 88, 87, 1],
                [308, 50, 88, 88],
                [308, 49, 88, 88],
                [307, 49, 89, 88],
                [307, 50, 89, 87],
                [308, 51, 89, 86],
                [307, 54, 90, 83],
                [307, 57, 90, 80],
                [306, 58, 92, 79],
                [306, 58, 92, 79],
                [305, 60, 92, 77],
                [302, 61, 95, 76],
                [302, 63, 95, 74],
                [302, 51, 96, 86],
                [302, 66, 98, 71],
                [304, 67, 96, 69],
                [301, 63, 96, 74],
                [301, 58, 93, 79],
                [291, 52, 94, 85],
                [288, 50, 71, 88],
                [285, 43, 76, 95],
                [285, 37, 70, 101],
                [281, 29, 55, 109],
                [278, 20, 58, 119],
                [278, 20, 55, 119, 1],
                [277, 12, 121, 127],
                [271, 2, 122, 138],
                [267, 1, 126, 139],
                [264, 0, 136, 140],
                [260, 0, 141, 140],
                [255, 0, 148, 140],
                [252, 0, 151, 140],
                [249, 2, 121, 138],
                [247, 3, 123, 137],
                [246, 3, 123, 137],
                [246, 2, 124, 137],
                [258, 2, 112, 137],
                [263, 2, 106, 137],
                [263, 2, 106, 137],
                [262, 2, 103, 137],
                [260, 2, 104, 136],
                [260, 2, 104, 137, 1],
                [268, 2, 98, 137],
                [267, 2, 99, 137],
                [266, 2, 97, 137],
                [266, 3, 96, 136],
                [264, 3, 99, 136],
                [263, 3, 100, 136],
                [261, 3, 100, 136],
                [259, 2, 138, 137],
                [254, 2, 126, 137],
                [247, 2, 101, 136],
                [240, 2, 108, 136],
                [238, 1, 110, 137],
                [230, 1, 118, 138],
                [220, 15, 128, 124],
                [211, 18, 137, 121],
                [205, 43, 102, 96],
                [202, 45, 104, 93],
                [200, 38, 97, 101],
                [198, 38, 104, 101, 1],
                [197, 39, 107, 100],
                [197, 39, 112, 100],
                [213, 39, 94, 110],
                [212, 40, 95, 111],
                [211, 41, 97, 111],
                [209, 42, 99, 112],
                [209, 43, 98, 112],
                [213, 43, 87, 112],
                [213, 42, 83, 113],
                [211, 40, 86, 109],
                [211, 38, 86, 103],
                [211, 37, 88, 112],
                [211, 20, 186, 131],
                [213, 27, 167, 122],
                [212, 44, 87, 105],
                [210, 44, 88, 98],
                [195, 44, 106, 98],
                [189, 44, 110, 98],
                [182, 46, 117, 99],
                [173, 44, 118, 96, 1],
                [161, 43, 130, 99],
                [154, 42, 137, 97],
                [153, 42, 137, 97],
                [153, 42, 137, 97],
                [152, 41, 137, 98],
                [151, 41, 137, 97],
                [149, 41, 145, 97],
                [148, 25, 144, 114],
                [148, 13, 144, 126],
                [141, 12, 153, 127],
                [115, 11, 173, 128],
                [108, 7, 180, 133],
                [108, 4, 180, 136],
                [108, 3, 176, 137, 1],
                [108, 1, 161, 139],
                [105, 1, 235, 138],
                [103, 1, 295, 148],
                [103, 0, 277, 149],
                [108, 0, 234, 137],
                [101, 0, 232, 137],
                [99, 0, 135, 139],
                [95, 0, 244, 139],
                [81, 0, 152, 139],
                [69, 0, 164, 139, 1],
                [66, 0, 169, 139],
                [65, 0, 170, 139],
                [63, 0, 168, 138],
                [61, 0, 159, 138],
                [35, 0, 304, 139],
                [19, 0, 189, 140],
                [18, 11, 138, 129],
                [18, 11, 137, 129],
                [18, 11, 137, 128],
                [18, 6, 135, 133],
                [7, 4, 146, 136],
                [6, 4, 147, 136],
                [3, 4, 150, 136, 1],
                [3, 5, 150, 135],
                [3, 8, 150, 132],
                [4, 6, 394, 145],
                [12, 6, 388, 145],
                [11, 8, 389, 144],
                [11, 8, 387, 144],
                [11, 8, 387, 143, 1],
                [10, 8, 113, 131],
                [11, 8, 111, 131],
                [10, 9, 112, 130],
                [12, 9, 116, 130],
                [12, 9, 111, 130],
                [12, 9, 111, 130],
                [12, 9, 110, 131],
                [12, 34, 113, 106],
                [13, 35, 110, 104]
            ],
            e = d.length,
            f, g, h, i, j = -1,
            c = document.getElementById("graham-logo"),
            l = function () {
                var a = d[f];
                if (c && a[0]) {
                    var b = document.createElement("div");
                    b.id = "graham-logo" + f;
                    b.style.position = "absolute";
                    b.style.left = a[0] + "px";
                    b.style.top = a[1] + "px";
                    b.style.width = a[2] + "px";
                    b.style.height = a[3] + "px";
                    b.style.background = "url(/images/css-sprite/graham-sprite.png) no-repeat " + -g + "px " + -h + "px";
                    a[3] > i && (i = a[3]);
                    a[4] ? (g = 0, h += i, i = 0) : g += a[2];
                    c.appendChild(b);
                    ++f;
                    f < e && (j = window.setTimeout(l, 83))
                }
            },
            m = function () {
                google.doodle.a = !1;
                i = h = g = f = 0;
                j != -1 && (window.clearTimeout(j), j = -1);
                c.innerHTML = "";
                j = window.setTimeout(l, 83)
            };
            c.addEventListener ? c.addEventListener("click", m, !1) : c.attachEvent("onclick", m);
        if (!google.doodle.a) {
            google.doodle.a = !0;
            var n = document.createElement("img");
            n.addEventListener ? n.addEventListener("load", m, !1) : n.attachEvent("onload", m);
            n.src = "/images/css-sprite/graham-sprite.png"
        }
})();

總結(jié)

希望大家可以通過本文的Google動(dòng)畫實(shí)現(xiàn)了解到一些CSS Sprite技術(shù),CSS Sprite是前端優(yōu)化的一部分冀惭,合理的利用好可以提高網(wǎng)頁的性能震叙,也可以豐富網(wǎng)頁內(nèi)容掀鹅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市媒楼,隨后出現(xiàn)的幾起案子乐尊,更是在濱河造成了極大的恐慌,老刑警劉巖匣砖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件科吭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猴鲫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門谣殊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拂共,“玉大人,你說我怎么就攤上這事姻几∫撕” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蛇捌,是天一觀的道長抚恒。 經(jīng)常有香客問我,道長络拌,這世上最難降的妖魔是什么俭驮? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮春贸,結(jié)果婚禮上混萝,老公的妹妹穿的比我還像新娘。我一直安慰自己萍恕,他們只是感情好逸嘀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著允粤,像睡著了一般崭倘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上类垫,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天司光,我揣著相機(jī)與錄音,去河邊找鬼阔挠。 笑死飘庄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的购撼。 我是一名探鬼主播跪削,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谴仙,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了碾盐?” 一聲冷哼從身側(cè)響起晃跺,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毫玖,沒想到半個(gè)月后掀虎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡付枫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烹玉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阐滩。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡二打,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掂榔,到底是詐尸還是另有隱情继效,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布装获,位于F島的核電站瑞信,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏穴豫。R本人自食惡果不足惜凡简,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绩郎。 院中可真熱鬧潘鲫,春花似錦、人聲如沸肋杖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽状植。三九已至浊竟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間津畸,已是汗流浹背振定。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肉拓,地道東北人后频。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卑惜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膏执,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • [css sprite原理優(yōu)缺點(diǎn)及使用] CSS Sprites在國內(nèi)很多人叫css精靈,是一種網(wǎng)頁圖片應(yīng)用處理方...
    LabRaDor2079閱讀 1,543評(píng)論 0 3
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,117評(píng)論 25 707
  • 這是一首歌的歌詞露久,寫的真好更米!越長大越孤單,已經(jīng)是大齡青年的我越來越不想長大毫痕!可是我還是悄無聲息地長到了27歲征峦,...
    石小心2016閱讀 224評(píng)論 0 1
  • 《永不抵達(dá)的列車》是趙涵漠的成名作。說起來消请,趙涵漠不是中青冰點(diǎn)第一個(gè)寫特稿的記者栏笆,自始至終,這個(gè)欄目的稿件都延續(xù)了...
    Elaine_Liu閱讀 299評(píng)論 0 0
  • 三位建筑師RCR建筑事務(wù)所臊泰,在他們近30年的職業(yè)生涯中竖伯,通過作品說明了“對(duì)場(chǎng)地的一種堅(jiān)強(qiáng)隱忍的敘述性”。通過協(xié)調(diào)運(yùn)...
    孟yueling閱讀 1,105評(píng)論 1 4