輪播及其他插件

第26課
ps:輪播插件最后一張圖片與第一張圖片切換不自然,插件并不完美;代碼注重新手推敲過程,非新手可路過。


一些面試題

  • What does a doctype do?
    doctype 有什么作用

  • What's the difference between standards mode and quirks mode?
    瀏覽器的標(biāo)準(zhǔn)模式和怪異模式(以及兼容模式)

  • What's the difference between HTML and XHTML?
    HTML 和 XHTML 的區(qū)別是什么?

答案:解答

jQuery插件基礎(chǔ)

什么是jQuery插件

對 jQuery 的功能的擴(kuò)展
1.jQuery 不能操作 Cookie,你只能用 DOM API
2.jQuery 不能方便的生成輪播組件
3.其他 jQuery 沒有的功能……
我們可以通過給 jQuery 和 jQuery.fn 添加方法,來達(dá)到擴(kuò)展 jQuery 的目的

擴(kuò)展jQuery

  1. 給 jQuery 添加方法
    http://js.jirengu.com/qeruluqine/1/edit
    通過 jQuery.xxx 調(diào)用
  2. 給 jQuery.fn 添加方法
    jQuey.fn===jQuery.prototype
    http://js.jirengu.com/laq/1/edit?html,css,js,output
    通過 $node.xxx 調(diào)用

詳細(xì)原理會在進(jìn)階部分闡述
1. 為什么給 fn 添加方法就能在 $node 上調(diào)用?
2. 為什么 this 總在變?


插件一:回到頂部

結(jié)合 CSS 與 jQuery 知識

需求:點擊回到頂部按鈕,滾動到頂部

Demo 1 http://js.jirengu.com/kaw/9/edit?html,css,js,output
插件提供者幫助使用者準(zhǔn)備 HTML
Demo 2http://js.jirengu.com/suf/1/edit?html,css,js,output
使用者自備 HTML
提示:jQuery對象用jQuery再包一遍還是jQuery對象,但不是原內(nèi)存,不絕對相對。

可優(yōu)化點:
  1. 提供 template 選項
  2. 提供動畫選項
  3. 檢測 window scroll
  4. 還有很多可以優(yōu)化,等待你去發(fā)掘……
    Demo 3 http://js.jirengu.com/lujuxadigu/2/edit?html,css,js
    知識點:c=a||b =>if(a){c=a}else{c=b}

插件二:手風(fēng)琴

效果:

點擊任意 item,該 item 展開,其他 item 折疊

思路:
  1. CSS中隱藏img=>display:none;或者h(yuǎn)eigh:0;
  2. CSS中添加.selected:block;或者h(yuǎn)eigh:200px;
  3. JS中給被點擊的元素addClass('selected'),并移除兄弟元素siblings('.selected').removeClass('selected')
問題:多組手風(fēng)琴同一頁面,如何功能避免相互干擾?
答:1. 盡量通過this,做到由里往外找API
    2. 不要操作樣式,只操作className
技巧:如何知道this值?
答:1. console.log(this)
    2. 看jQuery源碼
    3. 看jQuery文檔
可優(yōu)化點:

插件三:輪播

重點:
  1. 對內(nèi)容結(jié)構(gòu)(HTML)進(jìn)行思考
  2. 對樣式(CSS)進(jìn)行思考
  3. 對行為(JS)進(jìn)行思考
思路:
  1. 一個列表滾來滾去
  2. 將消失的元素插入末尾
  3. 只顯示一個元素,其他元素隱藏

過程:

用戶需求:
  1. 用戶提供:html=>div.arts>div.pic*n
  2. 調(diào)用slides({width: ,height: ,auto:true})
插件提供者編寫過程:
  1. 定義$.fn.slides()方法。

$.fn.slides=function(){}

  1. 在方法中拿到arts。

var $arts=this.eq(0)

  1. 在div.pic外包一個div.list,并設(shè)置$pics的CSS屬性

$pics=$arts.children().wrapAll('<div class=list></>').css({float:'left'})

  1. 在div.list外包一個div.viewpoint,并編寫$list、$viewpoint的CSS屬性

$list=$arts.children().wrapAll('<div class=viewpoint>/div>') .css({position:'relative',left:0,overflow:'hidden',width:$pics.length*options.width})
$viewpoint=$list.parent().css({width:options.width})

  1. 添加按鈕,并實現(xiàn)其功能。構(gòu)造prev()/next()函數(shù)

var $prev=$('<button>prev</button>').appendTo($arts) $prev.on('click',function(){$list.animate({left:'+='+options.width})}) 同理得“next”按鈕 var prev=function({$list.animate({left:'+='+options.width})} $prev.on('click',function(){prev()})

  1. 聲明current=0,表示第幾張。聲明timer,表示自動播放功能,聲明hover=false,表示圖片被懸停狀態(tài)。修改prev()。

var current=0;var timer;var hover=false; var prev=function(){var left=-(current-1)*options.width; $list.animate({left:left},function(){current-=1})}

  1. 構(gòu)造go()函數(shù),注意:animate()中回調(diào)函數(shù)function(){current=index}

`var go=function(index){var left=-index*options.width;

$list.animate({left:left},function(){current=index})}
var prev=function(){go(current-1)}`

  1. 控制邊界張數(shù),go()函數(shù)中添加if語句,判斷index<0和index>$pics.length-1

var go=function(){ if(index<0){index=$pics.length-1}; if(index>$pics.length-1){index=0};...}

  1. 自動播放功能,setInterval(function(){},2000)

if(auto===true){timer=setInterval(function(){next()},2000)}

  1. 懸停功能,構(gòu)造autoplay()函數(shù)

var autoplay=function(){timer=setInterval(function(){next()},2000)} $pics.on('mouseenter',function(){window.clearInterval(timer);hover=true}) $pics.on('mouseleave',function(){autoplay();hover=false})

  1. 按鈕與自動播放功能斷點問題,hover狀態(tài)判斷autoplay(),在go()函數(shù)中添加if語句判斷;思考:在autoplay()函數(shù)中判斷斷點問題的可行性?

var go=function(){ if(timer){window.clearInterval(timer)}; if(!hover){autoplay()};...}

  1. stop(true,true).animate(...),處理多組arts問題

var $arts=this $arts.each(function(){ var $art=$(this) 將上述代碼放入,并修改其中$arts=>$art })

輪播代碼
面向?qū)ο筝啿ゲ寮?/a>


思考

  1. 如果傳給插件的 jQuery 對象包含不止一個元素,怎么辦?
  2. 插件的返回值是什么?
  3. 組件化:頁面上可以存在插件的實例,它們之間互不影響
答案
  1. $node.each 遍歷
  2. 返回當(dāng)前 jQuery 對象,以實現(xiàn)鏈?zhǔn)秸{(diào)用

作業(yè):slides.html

自己實現(xiàn)輪播插件(盡量從不同的思路來考慮)

相關(guān)閱讀更多精彩內(nèi)容

  • 通過jQuery,您可以選?。ú樵?,query)HTML元素,并對它們執(zhí)行“操作”(actions)。 jQuer...
    枇杷樹8824閱讀 732評論 0 3
  • 1. tab列表折疊效果 html: 能源系統(tǒng)事業(yè)部 崗位名稱: 工作地點 崗位名...
    lilyping閱讀 2,015評論 0 1
  • 請參看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon閱讀 7,791評論 2 19
  • 人生就是一場坎坷的冒險 韓裕平 這個夏天,我打著赤腳,右手提著鞋子,順著花橋河一直往上走。岸邊,熱浪滾滾,水里,冰...
    秭歸秀才9條命兒閱讀 335評論 0 0
  • 初嘗寫作,很是心酸,人生就難于邁出那一步,現(xiàn)在的普遍年輕人亦是如此,有拖延癥,對未來沒有憧憬,不知道此刻應(yīng)...
    浮影v閱讀 278評論 0 1

友情鏈接更多精彩內(nèi)容