摘要:初次體驗之后,體驗一下強大之處,做一個簡單的輪播,實現圖片切換。點擊按鈕切換輪播頁面上面有三個標簽用兩個便簽包裹好,是用來布局的,一般不在布局的標簽上面做任何操作,是用來做輪播窗口的。是一個整數,指示元素的位置,以為基數。
初次體驗jQuery 之后,體驗一下jQuery強大之處,做一個簡單的輪播,實現圖片切換。
點擊按鈕切換輪播頁面上面有三個img標簽用兩個div便簽包裹好,class=images是用來布局的,一般不在布局的標簽上面做任何操作,class=window是用來做輪播窗口的。三個button按鈕,用于切換圖片。
首先把圖片一次排開,用class=images做布局,給它加上display:flex就可以實現浮動,如果圖片浮動起來變形厲害,可以給它加上align-items:flex-start;
class=window是輪播用的可視窗口,設置為圖片的寬度;并加上overflow:hidden,隱藏超出可視窗口部分;
用JS 來控制CSS來實現圖片切換,當我點擊按鈕,出現對應圖片,當我點擊第1張按鈕按鈕時,觸發.on事件后執行后面的函數,把圖片向左移動到指定位置,其余兩個按鈕也是做類似效果;
這樣做你會發現切換圖片太生硬了,這事我們可以加上一點動畫過渡transtion:transform 0.5s,讓它切換時平緩一點。
//jQuery 文件
jQuery API 用法
.on()語法:.on( events, handler(eventObject) )
events類型是String,一個或多個空格分隔的事件,比如click、keydown.myPlugin
handler(eventObject)類型是Function,事件被出發時執行函數
.css()用法:獲取匹配元素集合中的第一個元素的樣式屬性的值設置每個匹配元素的一個或多個CSS屬性
CSS樣式:
display:flex; flex布局
align-items:flex-stare; 往側軸起點靠
transition:transform 0.5s 動畫過渡
用上面的方法,有一個問題就是HTML 和CSS 分離了,但是CSS 和JS 沒有分離,但是為什么img標簽會有圖片的寬度呢?
其實img是一個可替換元素,在img里面的下載下來之前,瀏覽器不知道img長什么樣,所以需要先做一個占位符來占位,等圖片下載下來時替換掉占位符,一旦頁面下載錯了就會看到占位符;如果不用這個占位符,瀏覽器就會隨便找個占位符來占位,等圖片下載下來后在替換這個占位符,在替換的過程中,后面的內容要讓位置,這就是重排的過程,特別消耗CPU,所以圖片的寬高很重要,知道圖片寬高就要寫上去。
如果做成CSS 和JS 分離,可以像下面這樣寫,就可以做到行為和樣式分離:
但是這有一個問題,如果你頁面有很多圖片時,removeClass就會有很多,代碼就沒有那么整潔了,這個時候就最好還是用行為控制樣式,因為沒有辦法部把所有的狀態都寫到JS 里面,所以只有用JS 動態生成CSS,所以不到萬不得已最好不要用。
重復代碼優化用JS 控制樣式的代碼,可以改寫一下,變得更簡潔。
在button標簽外面在包裹一層div,如果用DOM 獲取里面的button的順序該怎么做呢?
var n; //n存儲的是:p3是第幾個元素 var allButtons = p3.parentNode.children; //先獲取到p3的所有兄弟元素 for(var i = 0; i < allButton.length; i++){ //遍歷這個數組 if(allButtons[i] === p3){ //如果這數組中的第i個等于p3,那么i 的值就是p3的位置 n = i+1; //因為i 取值是0,1,2 所以需要加上1才能得到最后的結果 break; //找到就跳出if循環; } }
如果不用jQuery,用DOM 提供的API 是要用6行代碼才能實現。
那看看有jQuery 怎么做呢
jQuery API語法:
event.traget用戶點擊的那個按鈕
event.currentTarget監聽的那個按鈕
index()從匹配的元素中搜索給定元素的索引值,從0開始計數。用上面方法就可以把代碼變的更簡潔。
自動輪播下面來看下,如果我要做成自動播放應該怎弄呢?
先來做一個數數的過程,每1s加1var n = 0; console.log(n); setInteral(() => { n+=1; console.log(n); },1000)那如果我要實現0、1、2循環數數呢?
var n = 0; console.log(n%3); //用取余就可以 setInterval(()=>{ n+=1; console.log(n%3); },1000)用它來做元素循環時不也很簡單
循環播放var n = 0; var size = allButtons.length; //有多少個按鈕可以這樣獲取 allButton.eq(n%size).trigger("clcik"); //用DOM API 可以這樣寫parentNode.children[n%size],如果用jQuery 的話allButton[n%size]還是DOM 對象,這樣的還要在封裝,jQuery 提供了一個.eq()的方法 setInterval(()=>{ n+=1; allButton.eq(n%size).trigger("clcik"); },1000)jQuery API語法:
.eq(index)index是一個整數,指示元素的位置,以0為基數。
.trigger(eventType [, extraParameters ]) eventType類型是String,包含JS事件的字符串,比如click或submit。這樣就可以實現自動輪播了,美中不足的是按鈕變化我們看不見,那把按鈕添加class看看
var n = 0; var size = allButtons.length; allButtons.eq(n%size).trigger("click").addClass("red"); var timerId = setInterval(function(){ n+=1; allButtons.eq(n%size).trigger("click").addClass("red").siblings(".red").removeClass("red"); //siblings(".red").removeClass("red")獲取當前元素的兄弟元素,刪除它的class })jQuery API語法:
.siblings( [selector ] )類型是Selector,可以獲取每個元素的兄弟元素現在可以看到每張圖片輪流播放,按鈕顏色也隨著改變。
進入或離開輪播窗口也能播放但是現在有一個問題,當我鼠標進入輪播頁面,它不能停止播放,那下面來看看怎么實現
$(".window").on("mouseenter",function(){ window.clearsetInterval(timerId) //當鼠標進入"class=window"窗口時,觸發清除延時執行函數 }) $(".window").on("mouseleave",function(){ timerId = setInterval(function(){ allButtons.eq(n%size).trigger("click").addClass("red").siblings(".red").removerClass("red"); //當鼠標離開"class=window"窗口時,繼續執行上面的延時執行函數 },1000) }).mouseenter( handler(eventObject) )類型是Function,當鼠標進入觸發函數
修復一個小bug
.mouseleave( handler(eventObject) )類型是Function,當鼠標離開進入觸發函數這里面有一個小bug,輪播的 trigger("click")時間和.on("click")產生了沖突。在for循環中.on("click")的最后加上
n = index; allButtons.eq(n).addClass("red").siblings(".red").removeClass("red");如下:
var allButtons = $("#buttons > button"); for(var i = 0; i < allButtons.length; i++){ $(allButtons[i]).on("click",function(x){ var index = $(x.currentTarget).index(); var p = index * -279; $(images1).css({ transform:"translate("+ p + "px)" }); n = index; allButtons.eq(n).addClass("red").siblings(".red").removeClass("red"); }) }整理代碼整理下剛剛寫的自動輪播的代碼
//jQuery 文件優化代碼剛剛寫的自動輪播部分,有很多重復的代碼,將它們優化一下
//jQuery 文件用到的jQuery API最后整理下這里面用到的jQuery API
.on()語法:.on( events, handler(eventObject) )
events類型是String,一個或多個空格分隔的事件,比如click、keydown.myPlugin
handler(eventObject)類型是Function,事件被出發時執行函數
.css()用法:獲取匹配元素集合中的第一個元素的樣式屬性的值設置每個匹配元素的一個或多個CSS屬性
event.traget用戶點擊的那個按
event.currentTarget監聽的那個按鈕
index()從匹配的元素中搜索給定元素的索引值,從0開始計數。
.eq(index)index是一個整數,指示元素的位置,以0為基數。
.trigger(eventType [, extraParameters ]) eventType類型是String,包含JS事件的字符串,比如click或submit。
.siblings( [selector ] )類型是Selector,可以獲取每個元素的兄弟元素
總結輪播所用的圖片一字排開,通過移動位置,把相應的圖片呈現在視窗上。
自動輪播的關鍵是循環,只要會自然計數方法就能掌握其中的道理。文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95114.html
摘要:并不是所有人寫的代碼或者插件都適合小白使用,比如這是一個的滾動插件,大多數人使用了之后發現滾動不了,去作者提,其實是他們并不懂滾動的原理。 最近在這里看了一篇關于面試的文章《回顧自己三次失敗的面試經歷》,作者三次倒在了輪播圖上。囧,所以我也寫個輪播圖看看。這次是用jQuery寫的,因為最近一直在研究jQuery插件的寫法,所以用jQuery寫的,而且我發現,我vue用太多,完全不熟悉d...
摘要:站在這個時間點上,我對自己之前三次失敗的面試經歷做了一次深度回顧。關于我第三次面試失敗的經歷,依然是與輪播圖有關。當然,這次思特奇面試之旅,最后也是以失敗告終,這也是我離進大廠最近的一次。 showImg(https://segmentfault.com/img/bVYQuP?w=528&h=513); 前言 時間的齒輪已經來到了2017年的11月份,距離2018年僅僅還剩下不到兩...
摘要:站在這個時間點上,我對自己之前三次失敗的面試經歷做了一次深度回顧。關于我第三次面試失敗的經歷,依然是與輪播圖有關。當然,這次思特奇面試之旅,最后也是以失敗告終,這也是我離進大廠最近的一次。 showImg(https://segmentfault.com/img/bVYQuP?w=528&h=513); 前言 時間的齒輪已經來到了2017年的11月份,距離2018年僅僅還剩下不到兩...
摘要:輪播圖插件的任務已經接近尾聲,在書寫輪播圖期間確實有一些小的感觸的。 輪播圖插件的任務已經接近尾聲,在書寫輪播圖期間確實有一些小的感觸的。感興趣的可以訪問我的輪播圖的線上地址:輪播圖 首先,輪播圖插件其實并不是我第一次寫,之前也寫過,不過那時候是按照別人的思路寫下來的,算起來大概有一年了,這次又一次開始輪播圖是因為拜讀了《單頁面Web應用 JavaScript從前端到后端》的這本書的1...
閱讀 856·2023-04-25 21:21
閱讀 3237·2021-11-24 09:39
閱讀 3082·2021-09-02 15:41
閱讀 2009·2021-08-26 14:13
閱讀 1840·2019-08-30 11:18
閱讀 2791·2019-08-29 16:25
閱讀 517·2019-08-28 18:27
閱讀 1590·2019-08-28 18:17