JS實(shí)現(xiàn)輪播圖案例
本文實(shí)例為大家分享了JS實(shí)現(xiàn)輪播圖案例的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)功能:
1、自動(dòng)輪播:鼠標(biāo)停留在輪播圖上時(shí)不切換圖片,鼠標(biāo)離開(kāi)后自動(dòng)輪播。
2、點(diǎn)擊左右按鈕切換圖片。
3、點(diǎn)擊下方按鈕切換到對(duì)應(yīng)的圖片。
4、輪播圖大小自適應(yīng):
可以放入到執(zhí)行的父容器中展示。
不指定父容器時(shí),默認(rèn)放入body標(biāo)簽。占滿一屏的寬度,當(dāng)改變?yōu)g覽器窗口大小時(shí),輪播圖大小成比例改變。
可以指定輪播圖的寬高。
實(shí)現(xiàn)方式:用面向?qū)ο蟮姆绞綄?shí)現(xiàn),使用時(shí)傳入圖片和圖片對(duì)應(yīng)的數(shù)據(jù),再創(chuàng)建實(shí)例。
import Carousel from './js/Carousel.js'; ? var itemList1 = [{ ? ? ? ? ? ? ? ? day: 26, ? ? ? ? ? ? ? ? date: "/Oct.2020", ? ? ? ? ? ? ? ? title: "秘境之藍(lán) 無(wú)阿里不西藏 自駕阿里小北線", ? ? ? ? ? ? ? ? src: "./carousel_img/a.jpg", ? ? ? ? ? ? }, ? ? ? ? ? ? { ? ? ? ? ? ? ? ? day: 25, ? ? ? ? ? ? ? ? date: "/Oct.2020", ? ? ? ? ? ? ? ? title: "這是一個(gè)什么樣的國(guó)家?", ? ? ? ? ? ? ? ? src: "./carousel_img/b.jpg", ? ? ? ? ? ? }, ? ? ? ? ? ? { ? ? ? ? ? ? ? ? day: 24, ? ? ? ? ? ? ? ? date: "/Oct.2020", ? ? ? ? ? ? ? ? title: "在徽州,給秋天寫了8封信", ? ? ? ? ? ? ? ? src: "./carousel_img/c.jpg", ? ? ? ? ? ? }, ? ? ? ? ? ? { ? ? ? ? ? ? ? ? day: 23, ? ? ? ? ? ? ? ? date: "/Oct.2020", ? ? ? ? ? ? ? ? title: "「穿過(guò)狂野的風(fēng)」趕赴內(nèi)蒙的追羊計(jì)劃", ? ? ? ? ? ? ? ? src: "./carousel_img/d.jpg", ? ? ? ? ? ? }, ? ? ? ? ? ? { ? ? ? ? ? ? ? ? day: 22, ? ? ? ? ? ? ? ? date: "/Oct.2020", ? ? ? ? ? ? ? ? title: "愛(ài)讓我們無(wú)所不能|南極大冒險(xiǎn)", ? ? ? ? ? ? ? ? src: "./carousel_img/e.jpg", ? ? ? ? ? ? }, ? ? ? ? ]; ? ? ? ? let carousel1 = new Carousel(itemList1); ? ? ? ? carousel1.appendTo(".div1"); ? ? ? ? animation(); ? ? ? ? function animation(){ ? ? ? ? ? ? requestAnimationFrame(animation); ? ? ? ? ? ? carousel1.update(); ? ? ? ? ? ? // carousel2.update(); }
代碼:
import Component from './Component.js'; ? export default class Carousel extends Component{ ? ?? ? ? imgList; ? ? bnList; ? ? imgCon; ? ? dot; ? ? dotList=[]; ? ? data; ? ? direction; ? ? pos=0; ? ? x=0; ? ? speedX=1; ? ? bool=false; ? ? time=200; ? ? autoBool=true; ? ? ? // WIDTH=13.66; ? ? // HEIGHT=4.55; ? ? WIDTH; ? ? HEIGHT; ? ?? ? ? constructor(_data,_width,_height){ ? ? ? ? super("div"); ? ? ? ? this.data=_data; ? ? ? ? this.width = _width; ? ? ? ? this.height = _height; ? ? ? ? this.elem.className = "carousel"; ? ? ? ? // Object.assign(this.elem.style,{ ? ? ? ? // ? ? width:this.WIDTH+"rem", ? ? ? ? // ? ? height:this.HEIGHT+"rem", ? ? ? ? // ? ? position:"relative", ? ? ? ? // ? ? overflow:"hidden", ? ? ? ? // }); ? ? ? ? let arr = ["./carousel_img/left.png","./carousel_img/right.png"]; ? ? ? ? let _imgList = this.data.reduce((value,item)=>{ ? ? ? ? ? ? if(item.src) value.push(item.src); ? ? ? ? ? ? return value ? ? ? ? },arr); ? ? ? ? this.loadImg(_imgList,this.createCarousel); ? ? ? ? // window.addEventListener("resize",e=>this.resizeHandler(e)); ? ? } ? ? ? createCarousel(imgList){ ? ? ? ? ? Object.assign(this.elem.style,{ ? ? ? ? ? ? width:this.WIDTH+"rem", ? ? ? ? ? ? height:this.HEIGHT+"rem", ? ? ? ? ? ? position:"relative", ? ? ? ? ? ? overflow:"hidden", ? ? ? ? }); ? ? ? ? ? this.imgList = imgList; ? ? ? ? this.bnList = this.imgList.splice(0,2); ? ? ? ? ? imgList.forEach(item=>{ ? ? ? ? ? ? Object.assign(item.style,{ ? ? ? ? ? ? ? ? width:this.WIDTH+"rem", ? ? ? ? ? ? ? ? height:this.HEIGHT+"rem", ? ? ? ? ? ? }) ? ? ? ? }) ? ? ? ? ? this.createimgCon(); ? ? ? ? this.createDotList(); ? ? ? ? this.createBn(); ? ? ? ? // 動(dòng)畫一般在外面做,類里面只需要寫狀態(tài)更新即可。 ? ? ? ? // this.animation(); ? ? ? ? ? // 鼠標(biāo)停留在輪播圖上時(shí)不進(jìn)行自動(dòng)輪播。 ? ? ? ? this.elem.addEventListener("mouseenter",e=>this.mouseHandler(e)); ? ? ? ? this.elem.addEventListener("mouseleave",e=>this.mouseHandler(e)); ? ? } ? ? createimgCon(){ ? ? ? ? this.imgCon = document.createElement("div"); ? ? ? ? Object.assign(this.imgCon.style,{ ? ? ? ? ? ? width:this.WIDTH*2+"rem", ? ? ? ? ? ? height:this.HEIGHT+"rem", ? ? ? ? ? ? position:"absolute", ? ? ? ? }); ? ? ? ? let item = this.createItem(this.imgList[0],this.data[0]); ? ? ? ? this.imgCon.appendChild(item); ? ? ? ? this.elem.appendChild(this.imgCon); ? ? } ? ? createItem(img,obj){ ? ? ? ? ? ? let item = document.createElement("div"); ? ? ? ? Object.assign(item.style,{ ? ? ? ? ? ? width:this.WIDTH+"rem", ? ? ? ? ? ? height:this.HEIGHT+"rem", ? ? ? ? ? ? position:"relative", ? ? ? ? ? ? float:"left", ? ? ? ? }); ? ? ? ? let title = document.createElement("div"); ? ? ? ? Object.assign(title.style,{ ? ? ? ? ? ? position:"absolute", ? ? ? ? ? ? left:"15%", ? ? ? ? ? ? top:"0.3rem", ? ? ? ? ? ? fontSize:"0.3rem", ? ? ? ? ? ? color:"#ffffff", ? ? ? ? ? ? textShadow:"0.02rem 0.02rem 0.02rem #000000", ? ? ? ? ? ? width:"8rem", ? ? ? ? ? ? lineHeight:"0.5rem", ? ? ? ? }) ? ? ? ? let head1=document.createElement("div"); ? ? ? ? Object.assign(head1.style,{ ? ? ? ? ? ? height:"0.5rem", ? ? ? ? }) ? ? ? ? head1.textContent = obj.date; ? ? ? ? let span = document.createElement("span"); ? ? ? ? Object.assign(span.style,{ ? ? ? ? ? ? fontSize:"0.4rem", ? ? ? ? }); ? ? ? ? span.textContent = obj.day; ? ? ? ? let head2 = document.createElement("div"); ? ? ? ? Object.assign(head2.style,{ ? ? ? ? ? ? height:"0.5rem", ? ? ? ? }) ? ? ? ? head2.textContent = obj.title; ? ? ? ? head1.insertBefore(span,head1.firstChild); ? ? ? ? title.appendChild(head1); ? ? ? ? title.appendChild(head2); ? ? ? ? item.appendChild(title); ? ? ? ? item.appendChild(img); ? ? ? ? ? return item; ? ? } ? ? createDotList(){ ? ? ? ? this.dot = document.createElement("ul"); ? ? ? ? Object.assign(this.dot.style,{ ? ? ? ? ? ? listStyle:"none", ? ? ? ? ? ? margin:0, ? ? ? ? ? ? padding:0, ? ? ? ? ? ? position:"absolute", ? ? ? ? ? ? left:(this.WIDTH-1.8)/2+"rem", ? ? ? ? ? ? bottom:"0.3rem", ? ? ? ? ? ? ? ? ? ? }) ? ? ? ? for(let i=0;i<this.imgList.length;i++){ ? ? ? ? ? ? let li = document.createElement("li"); ? ? ? ? ? ? Object.assign(li.style,{ ? ? ? ? ? ? ? ? width:"0.18rem", ? ? ? ? ? ? ? ? height:"0.18rem", ? ? ? ? ? ? ? ? borderRadius:"0.2rem", ? ? ? ? ? ? ? ? marginLeft:i===0?"0px":"0.2rem", ? ? ? ? ? ? ? ? border:"0.02rem solid red", ? ? ? ? ? ? ? ? float:"left", ? ? ? ? ? ? }) ? ? ? ? ? ? this.dot.appendChild(li); ? ? ? ? ? ? this.dotList.push(li); ? ? ? ? } ? ? ? ? this.dot.addEventListener("click",e=>this.dotClickHandler(e)); ? ? ? ? this.elem.appendChild(this.dot); ? ? } ? ? createBn(){ ? ? ? ? for(let i=0;i<this.bnList.length;i++){ ? ? ? ? ? ? Object.assign(this.bnList[i].style,{ ? ? ? ? ? ? ? ? position:"absolute", ? ? ? ? ? ? ? ? top:(this.HEIGHT*100-this.bnList[i].height)/2/100+"rem", ? ? ? ? ? ? }) ? ? ? ? ? ? if(i===0){ ? ? ? ? ? ? ? ? this.bnList[i].style.left = "0.5rem"; ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? this.bnList[i].style.right = "0.5rem"; ? ? ? ? ? ? } ? ? ? ? ? ? this.bnList[i].addEventListener("click",e=>this.bnClickHandler(e)); ? ? ? ? ? ? this.elem.appendChild(this.bnList[i]); ? ? ? ? } ? ? } ? ? bnClickHandler(e){ ? ? ? ? if(this.bool) return ? ? ? ? if(e.target===this.bnList[0]){ ? ? ? ? ? ? this.direction="left"; ? ? ? ? ? ? this.pos++; ? ? ? ? ? ? if(this.pos>this.imgList.length-1) this.pos = 0; ? ? ? ? }else{ ? ? ? ? ? ? this.direction="right"; ? ? ? ? ? ? this.pos--; ? ? ? ? ? ? if(this.pos<0) this.pos=this.imgList.length-1; ? ? ? ? } ? ? ? ? this.bool=true; ? ? ? ? this.createNextItem(); ? ? } ? ? dotClickHandler(e){ ? ? ? ? if(e.target.constructor!==HTMLLIElement) return ? ?//這里因?yàn)槭菍?duì)父元素進(jìn)行偵聽(tīng),因此要先判斷點(diǎn)擊的是不是li,如果點(diǎn)擊的不是小圓點(diǎn)就不能改變開(kāi)關(guān),直接return。不能先改變開(kāi)關(guān)。 ? ? ? ? if(this.bool)return ? ? ? ? for(let i=0;i<this.dotList.length;i++){ ? ? ? ? ? ? if(e.target===this.dotList[i]){ ? ? ? ? ? ? ? ? if(this.pos===i) return ? ? ? ? ? ? ? ? this.direction=i<this.pos?"right":"left"; ? ? ? ? ? ? ? ? this.pos=i; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? this.bool=true; ? ? ? ? this.createNextItem(); ? ? } ? ? createNextItem(){ ? ? ? ? let nextItem=this.createItem(this.imgList[this.pos],this.data[this.pos]); ? ? ? ? if(this.direction==="left"){ ? ? ? ? ? ? this.imgCon.appendChild(nextItem); ? ? ? ? ? ? this.x=0; ? ? ? ? }else{ ? ? ? ? ? ? this.imgCon.insertBefore(nextItem,this.imgCon.firstChild); ? ? ? ? ? ? this.x=-this.WIDTH; ? ? ? ? } ? ? ? ? this.imgCon.style.left=this.x+"rem"; ? ? } ? ? update(){ ? ? ? ? this.imgMove(); ? ? ? ? this.autoPlay(); ? ? } ? ? // 這里只需要做一個(gè)狀態(tài)更新即可。 ? ? // 動(dòng)畫在外面做。 ? ? // animation(){ ? ? // ? ? requestAnimationFrame(this.animation); ? ? // ? ? if(!this.bool) return ? ? // ? ? this.imgMove(); ? ? // } ? ? imgMove(){ ? ? ? ? if(!this.bool) return ? ? ? ? if(this.direction==="left"){ ? ? ? ? ? ? this.x-=this.speedX; ? ? ? ? ? ? if(this.x<-this.WIDTH){ ? ? ? ? ? ? ? ? this.imgCon.firstElementChild.remove(); ? ? ? ? ? ? ? ? this.x=0; ? ? ? ? ? ? ? ? this.bool=false; ? ? ? ? ? ? } ? ? ? ? }else{ ? ? ? ? ? ? this.x+=this.speedX; ? ? ? ? ? ? if(this.x>0){ ? ? ? ? ? ? ? ? this.imgCon.lastElementChild.remove(); ? ? ? ? ? ? ? ? this.x=0; ? ? ? ? ? ? ? ? this.bool=false; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? this.imgCon.style.left=this.x+"rem"; ? ? } ? ? autoPlay(){ ? ? ? ? if(!this.autoBool) return ? ? ? ? this.time--; ? ?//增加防抖 ? ? ? ? if(this.time===0){ ?? ? ? ? ? ? ? let evt = new Event("click"); ? ? ? ? ? ? this.bnList[0].dispatchEvent(evt); ? ? ? ? ? ? this.time=200; ? ? ? ? } ? ? } ? ? resizeHandler(e){ ? ? ? ? document.documentElement.style.fontSize=document.documentElement.clientWidth/(this.WIDTH*100)*100+"px"; ? ? } ? ? appendTo(parent){ ? ? ? ? if(typeof parent==="string") parent = document.querySelector(parent); ? ? ? ? parent.appendChild(this.elem); ? ? ? ? if(!isNaN(this.WIDTH) && !isNaN(this.HEIGHT)) return ? ? ? ? if(parent===document.body){ ? ? ? ? ? ? this.WIDTH = 13.66; ? ? ? ? ? ? this.HEIGHT = 4.55; ? ? ? ? }else{ ? ? ? ? ? ? let rect = parent.getBoundingClientRect(); ? ? ? ? ? ? this.WIDTH=rect.width/100; ? ? ? ? ? ? this.HEIGHT=rect.height/100; ? ? ? ? } ? ? } ? ? mouseHandler(e){ ? ? ? ? if(e.type==="mouseenter"){ ? ? ? ? ? ? this.autoBool=false; ? ? ? ? }else{ ? ? ? ? ? ? this.autoBool=true; ? ? ? ? } ? ? } ? ? ? // 圖片預(yù)加載 ? ? loadImg(_imgList,_callBack){ ? ? ? ? let img = new Image(); ? ? ? ? img.i=0; ? ? ? ? img.arr=[]; ? ? ? ? img.imgList=_imgList; ? ? ? ? // img.callBack=_callBack; ? ? ? ? img.src=_imgList[img.i]; ? ? ? ? img.addEventListener("load",e=>this.imgLoadFinishHandler(e)); ? ? } ? ? imgLoadFinishHandler(e){ ? ? ? ? // console.log(e.currentTarget); ? ? ? ? e.currentTarget.arr.push(e.currentTarget.cloneNode()); ? ? ? ? e.currentTarget.i++; ? ? ? ? if(e.currentTarget.i<e.currentTarget.imgList.length){ ? ? ? ? ? ? e.currentTarget.src = e.currentTarget.imgList[e.currentTarget.i]; ? ? ? ? }else{ ? ? ? ? ? ? // e.currentTarget.callBack(e.currentTarget.arr); ? ? ? ? ? ? this.createCarousel(e.currentTarget.arr); ? ? ? ? } ? ? } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 原生js實(shí)現(xiàn)輪播圖的示例代碼
- js實(shí)現(xiàn)輪播圖的完整代碼
- js實(shí)現(xiàn)支持手機(jī)滑動(dòng)切換的輪播圖片效果實(shí)例
- JS輪播圖實(shí)現(xiàn)簡(jiǎn)單代碼
- js實(shí)現(xiàn)點(diǎn)擊左右按鈕輪播圖片效果實(shí)例
- 使用html+js+css 實(shí)現(xiàn)頁(yè)面輪播圖效果(實(shí)例講解)
- JS實(shí)現(xiàn)自動(dòng)輪播圖效果(自適應(yīng)屏幕寬度+手機(jī)觸屏滑動(dòng))
- js實(shí)現(xiàn)從左向右滑動(dòng)式輪播圖效果
- 原生js實(shí)現(xiàn)無(wú)限循環(huán)輪播圖效果
- JS實(shí)現(xiàn)左右無(wú)縫輪播圖代碼
相關(guān)文章
contenteditable可編輯區(qū)域設(shè)置換行實(shí)現(xiàn)技巧實(shí)例
這篇文章主要為大家介紹了contenteditable可編輯區(qū)域設(shè)置換行實(shí)現(xiàn)技巧實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01js+canvas實(shí)現(xiàn)轉(zhuǎn)盤效果(兩個(gè)版本)
這篇文章主要為大家詳細(xì)介紹了兩個(gè)版本的js+canvas實(shí)現(xiàn)轉(zhuǎn)盤效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09Javascript Request獲取請(qǐng)求參數(shù)如何實(shí)現(xiàn)
使用Javascript Request獲取參數(shù)的時(shí)候總是提示出錯(cuò),本文為此問(wèn)題提供詳細(xì)的解決方案,需要了解的朋友可以參考下2012-11-11Js如何判斷客戶端是PC還是手持設(shè)備簡(jiǎn)單分析
在工作過(guò)程中,許多朋友會(huì)經(jīng)常用到j(luò)s判斷客戶端是PC還是手持設(shè)備,今天將提供以下方法,需要的朋友可以參考下2012-11-11原生js實(shí)現(xiàn)查詢天氣小應(yīng)用
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)查詢天氣的小應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12