不一樣的前端手指操

看見題目可能有點(diǎn)好奇蜻直,不過看下去你就知道什么叫手指操了~

目錄

  • 寫在前面(特別注意)

在移動端上做動畫,一定不能用top,bottom,background-position等元素做動畫,不管是JS動畫還是CSS動畫照宝。主要是瀏覽器重排掰曾,重繪署海,合成等氛琢,只能用4個(需要加translateZ(0)開啟GPU加速):translate,scale,opacity,rotate产艾。
詳細(xì)資料參考:

<a name="intro"></a>

  • 引言

畢業(yè)季沒事做疤剑,一直都對視差滾動感興趣滑绒,感覺很新鮮(雖然現(xiàn)在已經(jīng)不火了)不過還是決定試試看,先看看效果隘膘。

第一部分

第二部分

第三部分

第四部分

<a name="thory"></a>

  • 原理

用了一點(diǎn)視差滾動的效果疑故,可能不明顯,關(guān)于視差滾動弯菊,與很多資料纵势,本質(zhì)是不同層的移動速度不同,比如坐火車時管钳,遠(yuǎn)處的物體移動得慢钦铁,近處的物體移動的很快,我們就人為的實(shí)現(xiàn)這種速度的差異參考demo才漆。

**參考資料: **

如果再結(jié)合一些動畫牛曹,就可以得到如下的比較cool的頁面:

參考demo:


<a name="lib"></a>

  • 核心庫

為了實(shí)現(xiàn)上述的效果,選擇了skrollr這個庫醇滥,使用這個庫躏仇,懂CSS就可以玩出這個效果了,用關(guān)鍵幀加CSS就可以了

<section class="scene1 fullpage" 
            data-6300="transform:translate3d(0,0%,0);display:block"  
            data-10000="transform:translate3d(0,-100%,0);display:block" 
            data-30000="transform:translate3d(0,-100%,0);display:block" 
            data-33000="transform:translate3d(0,-130%,0);display:none">
</section>

總的來說腺办,共使用了


<a name="impl"></a>

  • 實(shí)現(xiàn)
    <a name="keyframe"></a>
    • 關(guān)鍵幀/圖片調(diào)整
    skrollr初始化之前怀喉,需要對圖片進(jìn)行一些調(diào)整书妻,首先選好了圖片之 后,得保證顯示在手機(jī)上不變形躬拢,因而需要根據(jù)不同的手機(jī)屏幕大小調(diào)整 圖片的大小躲履,然后再根據(jù)所得的圖片設(shè)置一下結(jié)束的關(guān)鍵幀。

    background是設(shè)置結(jié)束關(guān)鍵幀
    ratio是設(shè)置背景圖片的比例

$.plug.background(true,".scene1-1",6700,$.plug.ratio(true,1080,1920,".scene1-1"));
$.plug.background(false,".scene2-1",18000,$.plug.ratio(false,4500,1667,".scene2-1"));
$.plug.background(false,".scene2-2",22000,$.plug.ratio(false,4500,1667,".scene2-2"));
$.plug.background(false,".scene3-1",42000,$.plug.ratio(false,3840,2160,".scene3-1"));
$.plug.background(false,".scene3-2",48000,$.plug.ratio(false,3840,2160,".scene3-2"));
$.plug.background(false,".scene4-1",58000,$.plug.ratio(false,2560,1496,".scene4-1"));
$.plug.background(false,".scene4-2",62000,$.plug.ratio(false,2560,1496,".scene4-2"));
$.plug.background(false,".scene5-1",76000,$.plug.ratio(false,2857,1216,".scene5-1"));
$.plug.background(false,".scene6-1",112000,$.plug.ratio(false,800,800,".scene6-1"));
$.plug.background(true,".scenev-1-1",94000,$.plug.ratio(true,600,1200,".scenev-1-1"));
$.plug.background(true,".scenev-1-2",98000,$.plug.ratio(true,600,1200,".scenev-1-2"));
$.plug.background(true,".scenev-1-3",102000,$.plug.ratio(true,600,1200,".scenev-1-3"));
 如下所示聊闯,對于橫向圖片工猜,以手機(jī)高度為準(zhǔn),先根據(jù)手機(jī)高度設(shè)置圖片高 度菱蔬,再根據(jù)圖片比例設(shè)置圖片的長度篷帅,對于縱向顯示的圖片,以屏幕寬度為準(zhǔn)拴泌,手法類似魏身,代碼非常簡單。    
橫向圖片
 (function($){
    function ratio(iswidth,width,height,dom,scale,isback){
        var ratioo=scale||1;
        var ratio=width/height;
        if(iswidth){        
            var wi=window.innerWidth*ratioo;
            var numb=Math.round(wi/ratio);
            var _pxheight=numb+"px";
            document.querySelector(dom).style.height=_pxheight;
            return numb;
        }
        else{
            var he=window.innerHeight*ratioo;
            var numb=Math.round(he*ratio);
            var _pxwidth=numb+"px"; 
            document.querySelector(dom).style.width=_pxwidth;
            return numb;
        }       
}
     if(!$.plug)$.plug={};
     $.plug.ratio=ratio;        
 })($)

一開始確定好容器大小蚪腐,初始化一些白色的小型div,再通過CSS3動畫讓他們不停旋轉(zhuǎn)箭昵,即是星星的感覺。
再根據(jù)前景和背景的運(yùn)動速度不同回季,造成視差滾動家制。
對于動畫正林,大多使用transform:translate3d,且以百分比做動畫颤殴,
以百分比做動畫意味著是以自身元素為參照觅廓,不是父級元素,因而為了避免有些小型元素移動100%的距離只相當(dāng)于移動了它自身大小的問題诅病,將所有的元素都套在一個fullpage的div中:

.fullpage{
    width: 100%;
    height: 100%;   
    position: absolute;
    left: 0;
    top:0
}

對這個嵌套元素進(jìn)行移動,下面是各背景與前景粥烁,使他們以不同速度移動贤笆,可以通過設(shè)置不同的data-number值實(shí)現(xiàn)。

前景
背景
前景
背景

<a name="spritesheet"></a>
  • spritesheet

對游戲制作的同學(xué)不會肯定不會陌生

行走

這樣的代碼一大堆讨阻,我貼個自己實(shí)現(xiàn)的芥永,簡單再說一下
對于這個5793*158的spritesheet,如果在手機(jī)上顯示高度為100px钝吮,則寬度為5793/1.58=3666px埋涧,則每次spritesheet移動的距離為3666px/36(動畫一共有36幀)=102px,對應(yīng)下面的JS代碼中的interval參數(shù)奇瘦,同時為了停止有個緩沖棘催,加了個停止幀stopframe參數(shù)。

(function($){
        function animate(totaltime,dom,parts,interval,stopframe){
                var temp=0;
                var stop_flag=false;
                var timer=null;
                    var num=temp*(interval);
                    $(dom).css({"background-position-x":num+"px"});
                    temp++;
                    if(stop_flag&&temp===stopframe){
                        clearInterval(timer),timer=null
                        stop_flag=false;
                    }
                    if(temp===parts)temp=0;
                
                return {
                    animating:function(){return timer!==null?true:false},
                    stop:function(va){
                        stop_flag=true;
                        //clearInterval(timer),timer=null
                    },
                    resume:function(){
                            if(timer!==null)return
                            var str=$(dom).css("background-position-x");
                            var matched=str.match(/-?[0-9]+/);
                            var num=parseInt(matched[0]);
                            temp=num/interval;
                            timer=setInterval(function(){
                            var num=temp*(interval);
                            $(dom).css({"background-position-x":num+"px"});
                            temp++;
                            if(stop_flag&&temp===stopframe){
                                clearInterval(timer),timer=null
                                stop_flag=false;
                            }
                            if(temp===parts)temp=0
                        },totaltime/parts);
                    }
                    
                }
                //$(dom)
            }       
            if(!$.plug)$.plug={};
            $.plug.animate=animate;
    
   })($)

<a name="progressbar"></a>

  • progressbar
    progressbar的實(shí)現(xiàn)使用了2個半圓的形式
    利用border-radius:50%做一個圓耳标,再利用clip: rect(0,auto,auto,50px)裁切為半圓醇坝。

右半圓旋轉(zhuǎn)
之后再從垂直正中開始裁切clip: rect(0,auto,auto,50px);
clip裁切

左半圓類似:
左半圓旋轉(zhuǎn)

clip裁切

將2個區(qū)域合并:
餅圖效果

加一個背景色相同的mask覆蓋在中間,這樣的好處是圓環(huán)寬度可以方便調(diào)整:
加個背景顏色相同的覆蓋在中間

 之后就可以通過代碼設(shè)置其百分比:
 ```js
          (function($){
              function circleprogress(dom,value){                                    
                $(dom).each(function(index, el) {
                var num = value * 3.6;
                num=Math.round(num);
                if (num<=180) {
                    $(this).find('.right').css('-webkit-transform', "rotate(" + num + "deg) translateZ(0px)");
                    $(this).find('.right').css('transform', "rotate(" + num + "deg) translateZ(0px)");
                    $(this).find('.left').css('-webkit-transform', "rotate("+0+ "deg) translateZ(0px)");
                    $(this).find('.left').css('transform', "rotate("+0+ "deg) translateZ(0px)");
                } else {
                    $(this).find('.right').css('-webkit-transform', "rotate(180deg) translateZ(0px)");
                    $(this).find('.left').css('-webkit-transform', "rotate(" + (num - 180) + "deg) translateZ(0px)");
                    $(this).find('.right').css('transform', "rotate(180deg) translateZ(0px)");
                    $(this).find('.left').css('transform', "rotate(" + (num - 180) + "deg) translateZ(0px)");
                };
            });
        }       
        if(!$.plug)$.plug={};
        $.plug.circleprogress=circleprogress;

})($)
    在滑動的過程中次坡,配置好滑動的區(qū)間即可:
    ```js
                    if(data.curTop>=20000 && data.curTop<25000){
                            var num=Math.round((data.curTop-20000)/55);
                            $('.circle-1').find('span.value').text(num);
                            $.plug.circleprogress('.circle-1',num);
                        }   
    ```
* * *
   
<a name="problem"></a>
* ##### 可能會遇到的問題
     對于配置稍低的手機(jī)呼猪,比如我的4S,在場景越來越多砸琅,圖片越來越多的情況下宋距,不管是在微信中打開還是原生瀏覽器中打開,都會把微信和瀏覽器弄崩潰症脂。谚赎。期間嘗試了各種優(yōu)化,把所有關(guān)于**layout**和**paint**的動畫部分都替換诱篷,情況稍微好一些沸版,但是還是有崩潰的現(xiàn)象。最后發(fā)現(xiàn)網(wǎng)頁加載時要對所有的場景進(jìn)行渲染兴蒸,即便這些場景一開始并不需要出現(xiàn)视粮。所以根據(jù)動畫情況,將需要出現(xiàn)的場景動態(tài)顯示橙凳,且在css中加入下面的語句,讓所有場景及信息一開始都不渲染蕾殴。
```css
      .scene1,.scene2,.scene3,.scene4,.scene5,.scene6,.infomation{
        display: none;
        }

最后根據(jù)skrollr的值來選擇顯示的場景笑撞。

通過這樣的做,我的4s終于再也不崩潰了钓觉,即便在有些低配手機(jī)還是有點(diǎn)卡。


<a name="tool"></a>

  • 相關(guān)工具

再貼幾個圖像處理工具,都是在線的荧缘,相當(dāng)不錯

這些圖像處理網(wǎng)站后臺可能用的的是[imagemagick](http://www.imagemagick.org/script/index.php)(瞎猜的)
  • 作為一個程序員如何找圖片及配色
    • 圖片:

都是免費(fèi)無水印,但是還是自己用就好了

  • 配色:

本人喜歡flat扁平化的風(fēng)格珊蟀,所以都是相關(guān)的顏色

先在上面的網(wǎng)站找些喜歡的顏色 然后再去下面的網(wǎng)站生成相關(guān)的互補(bǔ)色等
colorhexa:顏色分析左痢,輸入一個顏 色,分析其各屬性
paletton:相當(dāng) 好用的選色工具系洛,還可以看效果


<a name="visit"></a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俊性,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子描扯,更是在濱河造成了極大的恐慌定页,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绽诚,死亡現(xiàn)場離奇詭異典徊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恩够,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門卒落,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜂桶,你說我怎么就攤上這事儡毕。” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵腰湾,是天一觀的道長雷恃。 經(jīng)常有香客問我,道長费坊,這世上最難降的妖魔是什么倒槐? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮附井,結(jié)果婚禮上讨越,老公的妹妹穿的比我還像新娘。我一直安慰自己永毅,他們只是感情好把跨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卷雕,像睡著了一般节猿。 火紅的嫁衣襯著肌膚如雪票从。 梳的紋絲不亂的頭發(fā)上峰鄙,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天吟榴,我揣著相機(jī)與錄音兜看,去河邊找鬼狭瞎。 笑死,一個胖子當(dāng)著我的面吹牛弧轧,可吹牛的內(nèi)容都是我干的精绎。 我是一名探鬼主播代乃,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼襟己,長吁一口氣:“原來是場噩夢啊……” “哼擎浴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贝室,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滑频,失蹤者是張志新(化名)和其女友劉穎峡迷,沒想到半個月后绘搞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夯辖,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒿褂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了也祠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桂肌。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡崎场,死狀恐怖谭跨,靈堂內(nèi)的尸體忽然破棺而出螃宙,到底是詐尸還是另有隱情谆扎,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布闲先,位于F島的核電站伺糠,受9級特大地震影響训桶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舵揭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一琉朽、第九天 我趴在偏房一處隱蔽的房頂上張望稚铣。 院中可真熱鬧惕医,春花似錦抬伺、人聲如沸灾梦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膏燕,卻和暖如春坝辫,著一層夾襖步出監(jiān)牢的瞬間近忙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工永品, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鼎姐,地道東北人炕桨。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓献宫,卻偏偏與公主長得像姊途,于是被迫代替她去往敵國和親捷兰。 傳聞我的和親對象是個殘疾皇子负敏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

  • 1. tab列表折疊效果 html: 能源系統(tǒng)事業(yè)部 崗位名稱: 工作地點(diǎn) 崗位名...
    lilyping閱讀 1,862評論 0 1
  • <a name='html'>HTML</a> Doctype作用顶考?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)驹沿、<...
    clark124閱讀 3,478評論 1 19
  • 前幾天上荷醺海回來一個牧師在教會講道,我調(diào)休了兩三天就去了斑举。坐在我左邊的是一個老奶奶病涨,聽的很是認(rèn)真,邊聽邊記筆記既穆。不知...
    叫我松哥閱讀 315評論 0 1
  • 聽了宇彤老師講的胸腹式聯(lián)合呼吸法才發(fā)現(xiàn)励两,無論以前自己怎么努力都沒有成效是因?yàn)闆]有找到專業(yè)的方法当悔,真是方法不對努...
    瑗澤媽媽閱讀 183評論 0 0
  • 世界上只有一種真正的英雄主義盲憎,那就是在認(rèn)清生活的真相后依然熱愛生活饼疙。 那日從同衡出來慕爬,趕上了高峰期的北京地鐵。 爆...
    兔子王粥粥閱讀 220評論 0 0