輪播的簡(jiǎn)單實(shí)現(xiàn)方法
1.閃現(xiàn)方式的輪播
不論述,實(shí)現(xiàn)比較簡(jiǎn)單,效果也比較好
2.滑動(dòng)輪播
以下面的html代碼為例(向左滑動(dòng))
<div class="example" style="overflow: hidden; width: 266px;"> <ul style="width: 798px; float: left; height: 216px; margin-left: 0px;"> <li style="width: 266px; float: left; height: 216px;"></li> <li style="width: 266px; float: left; height: 216px;"></li> <li style="width: 266px; float: left; height: 216px;"></li> </ul> </div>
插件源碼:實(shí)現(xiàn)向左和向上輪播,手動(dòng)切換也是向左和向上切換(手動(dòng)切換關(guān)鍵源碼)
var all = $panel.find('>li'),
prevAll = new Array();
prevAll[0] = all.eq(0);
//將目標(biāo)節(jié)點(diǎn)前的所有節(jié)點(diǎn)都保存到prevAll中,動(dòng)畫結(jié)束后將這些節(jié)點(diǎn)一一按順序加到容器的后面
for(var i = 1; i < len; i++){
all.eq(i).css({display: 'none'});
prevAll[i] = all.eq(i);
}
...
$panel.animate({ 'marginLeft': -options.width + 'px' }, options.duration, function() {
for(var i = 0; i < prevAll.length; i++){
$panel.append($(prevAll[i]).css({display: 'block'})); //將當(dāng)前展示節(jié)點(diǎn)前的所有節(jié)點(diǎn)都加載到最后
}
$panel.css({ marginLeft: 0 });
})
滑動(dòng)輪播的實(shí)現(xiàn)方式主要有兩種
1)切換父元素margin-left,將第一個(gè)子元素不斷添加到父容器結(jié)尾
簡(jiǎn)單實(shí)現(xiàn)
var $panel = $('example');
var scrollTimer = setInterval(function() {
scrollNews($panel);
}, 3000);
function $scrollNews(){
$panel.animate({ 'marginLeft': '-266px' }, 500, function() {
$panel.css({ marginLeft: 0 }).find('>li:first').appendTo($panel);
})
}
這種方式有一個(gè)問題就是在老IE上可能存在兼容問題。
2) 累計(jì)方式設(shè)置父元素margin-left
不過在margin-left設(shè)置到最小的時(shí)候(滑動(dòng)到最后一個(gè)元素),將第一個(gè)子元素的位置設(shè)置為最后一個(gè)子元素的后面,當(dāng)最后一個(gè)元素滾動(dòng)到第一個(gè)元素后,父元素margin-left置為0且第一個(gè)子元素的位置歸位。舉個(gè)簡(jiǎn)單代碼例子
var $panel = $('.example'),
index = 0;
var scrollTimer = setInterval(function() {
scrollNews($panel);
}, 3000);
function scrollNews(){
if(++index >= 2){
$panel.css({
'paddingLeft': 266 + 'px'
})
$panel.find('>li:first').css({
'position': 'absolute',
'left': 266*index + 'px'
});
}
$panel.animate({ 'marginLeft': -266*index + 'px' }, 500, function() {
if(++index > 3){
$panel.css({ marginLeft: 0 });
}
if(index >= 3){
index = 0;
$panel.css({
marginLeft: 0,
'paddingLeft': 0
});
$panel.find('>li:first').css({
'position': 'static',
'left': 'auto'
});
}
})
}
更復(fù)雜的滾動(dòng)插件需要支持水平和垂直方向的滾動(dòng)(四個(gè)方向)、可以手動(dòng)切換焦點(diǎn)、可以翻上一個(gè)下一個(gè)。附上本人寫完整的插件源碼
插件源碼jquery.nfdscroll.js:支持水平和垂直方向(四個(gè)方向)滾動(dòng),手動(dòng)切換會(huì)隨切換方向滾動(dòng)
/**
* @author '陳樺'
* @date '2016-5-10'
* @description 滑動(dòng)輪播插件,支持水平和垂直方向滑動(dòng)輪播
*
* @example
html:
<div class="nfdnews_topnews example">
<!-- 滾動(dòng)內(nèi)容ul -->
<ul>
<li><a href="xxx" target="_blank" title="xxx"></a></li>
<li><a href="xxx" target="_blank" title="xxx"></a></li>
<li><a href="xxx" target="_blank" title="xxx"></a></li>
<li><a href="xxx" target="_blank" title="xxx"></a></li>
</ul>
<!-- 焦點(diǎn)列表,可選 -->
<ol>
<li class=""></li>
<li class=""></li>
<li class=""></li>
<li class=""></li>
</ol>
<!-- 上一個(gè)和下一個(gè),可選 -->
<div>
<a class="nfdscroll-prev" href="javascript:void(0);"></a>
<a class="nfdscroll-next" href="javascript:void(0);"></a>
</div>
</div>
js:
$('.example').nfdscroll({
startIndex:0,
width:'266',
height:'216',
interval:2000,
selected:'circle',
prevText:'',
nextText:'',
deriction:'left',
callback: function(index,$currentNode){
console.log(index)
}
});
* @param startIndex {Number} 默認(rèn)從第幾個(gè)滾動(dòng)體開始滾動(dòng),可選(0-n,0表示第一個(gè),默認(rèn)為0)
* @param width {Number} 滾動(dòng)體寬度,可選(當(dāng)寬度為0時(shí)表示不設(shè)置寬度)
* @param height {Number} 滾動(dòng)體高度,可選(當(dāng)高度為0時(shí)表示不設(shè)置高度)
* @param interval {Number} 間隔時(shí)間,單位毫秒, 當(dāng)值為負(fù)時(shí)表示不進(jìn)行自動(dòng)滾動(dòng)
* @param duration {Number} 動(dòng)畫持續(xù)時(shí)間
* @param selected {String} 滾動(dòng)切換小圖標(biāo)(焦點(diǎn)列表)當(dāng)前class
* @param deriction {String} 滾動(dòng)方向,支持left/right和top/bottom
* @param callback {Function} 滑動(dòng)動(dòng)畫結(jié)束時(shí)觸發(fā)的回調(diào),參數(shù)(index,$currentNode),index:輪播結(jié)束后展示的節(jié)點(diǎn)的索引;currentNode:輪播結(jié)束后當(dāng)前展示的節(jié)點(diǎn)的jquery對(duì)象
* @param prevText {String} 上一個(gè)按鈕的文本,默認(rèn)是"上一個(gè)"
* @param nextText {String} 下一個(gè)按鈕的文本,默認(rèn)是"下一個(gè)"
*/
jQuery.fn.extend({nfdscroll: function(options) {
var defaultOpt = {
startIndex: 0,
width: 0,//滾動(dòng)體寬度,可選(當(dāng)寬度為0時(shí)表示不設(shè)置寬度)
height: 0,//滾動(dòng)體高度,可選(當(dāng)高度為0時(shí)表示不設(shè)置高度度)
interval: 1000,//間隔時(shí)間毫秒
duration: 400,//動(dòng)畫持續(xù)時(shí)間
selected:'selected',//滾動(dòng)切換小圖標(biāo)當(dāng)前class
prevText:'上一個(gè)',
nextText:'下一個(gè)',
deriction:'left',//滾動(dòng)方向
callback: function(index,$currentNode){//每次滾動(dòng)到新節(jié)點(diǎn)后馬上觸發(fā),currentNode是當(dāng)前展示的節(jié)點(diǎn)的jquery對(duì)象
}
},
$this = this,
$panel = $this.find('>ul'),//滾動(dòng)容器
$panelList = $panel.find('>li'),
$selectList = $this.find('>ol>li'),//選擇容器
options = jQuery.extend(defaultOpt,options),
animateFn,//滾動(dòng)動(dòng)畫
max = $panel.find(">li").length,//要滾動(dòng)的節(jié)點(diǎn)的數(shù)量
focusIndex = 0,//當(dāng)前展示的節(jié)點(diǎn)的索引
nfdscrollTimer = 0,//計(jì)時(shí)器
inAnimation = false,//動(dòng)畫過程中不再響應(yīng)其他動(dòng)畫
isWaitting = false,//是否有未執(zhí)行的等待動(dòng)畫
waittingIndex;//未執(zhí)行的等待動(dòng)畫的目標(biāo)index
$('.nfdscroll-prev').text(options.prevText);
$('.nfdscroll-next').text(options.nextText);
//只有一個(gè)展示,不需要輪播
if($panelList.length <= 1){
return;
}
//當(dāng)前動(dòng)畫沒有做完但是焦點(diǎn)已經(jīng)切換到下一個(gè)地方,這個(gè)函數(shù)就是用來執(zhí)行保障當(dāng)前顯示的頁(yè)面和鼠標(biāo)指定的目標(biāo)一致的處理
function doWaitting(){
if(isWaitting){
startScroll(waittingIndex);
}
}
//開始輪播
function startScroll(toIndex){
stopScroll();
if(inAnimation) {
isWaitting = true;
waittingIndex = toIndex;
return;//動(dòng)畫過程中不再響應(yīng)其他動(dòng)畫
}else{
isWaitting = false;
}
if(toIndex == undefined){
if(options.interval > 0){
nfdscrollTimer = setInterval(function(){
animateFn(toIndex);
},options.interval);
}
//跳到指定index后再計(jì)時(shí)
}else{
animateFn(toIndex);
if(options.interval > 0){
nfdscrollTimer = setInterval(function(){
animateFn();
},options.interval);
}
}
}
//停止輪播
function stopScroll(){
clearInterval(nfdscrollTimer);
}
//向左向右滾動(dòng)動(dòng)畫
//參數(shù)toIndex: number,滾動(dòng)到指定index
function leftRightAnimate(toIndex){
//默認(rèn)滾動(dòng)方式
if(toIndex == undefined){
if(options.deriction == 'left'){
toIndex = focusIndex + 1;
}else{
toIndex = focusIndex - 1;
}
}
if(toIndex != focusIndex){
inAnimation = true;
//當(dāng)前為最后一個(gè)輪播體時(shí)的處理
var tInd = 0;
if(toIndex >= max){//最后一張圖片繼續(xù)滾動(dòng)時(shí)
$panel.css({
'paddingLeft': options.width + 'px'
})
$panelList.eq(0).css({
'position': 'absolute',
'left': options.width*toIndex + 'px'
});
tInd = 0;
}else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個(gè)圖片,然后點(diǎn)擊上一個(gè)圖片的時(shí)候出現(xiàn)
//當(dāng)前為最后一個(gè)輪播體時(shí)的處理
$panelList.eq(max - 1).css({
'position': 'absolute',
'left': -options.width + 'px'
});
tInd = max - 1;
}else{
tInd = toIndex;
}
//先將焦點(diǎn)切換過去
$selectList.filter('.' + options.selected).removeClass(options.selected)
.end().eq(tInd).addClass(options.selected);
$panel.animate({ 'marginLeft': -options.width*toIndex + 'px' }, options.duration, function() {
focusIndex = tInd;
if(toIndex >= max){//最后一張圖片繼續(xù)滾動(dòng)時(shí)
$panel.css({
'marginLeft': 0,
'paddingLeft': 0
});
$panelList.eq(0).css({
'position': 'static',
'left': 'auto'
});
}else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個(gè)圖片,然后點(diǎn)擊上一個(gè)圖片的時(shí)候出現(xiàn)
$panel.css({
'marginLeft': -options.width*focusIndex + 'px',
'paddingLeft': 0
});
$panelList.eq(max - 1).css({
'position': 'static',
'left': 'auto'
});
}
options.callback(focusIndex,$panelList.eq(focusIndex));
inAnimation = false;
doWaitting();
})
}
}
//向上向下滾動(dòng)動(dòng)畫
function topBottomAnimate(toIndex){
//默認(rèn)滾動(dòng)方式
if(toIndex == undefined){
if(options.deriction == 'top'){
toIndex = focusIndex + 1;
}else{
toIndex = focusIndex - 1;
}
}
if(toIndex != focusIndex){
inAnimation = true;
//當(dāng)前為最后一個(gè)輪播體時(shí)的處理
var tInd = 0;
if(toIndex >= max){
$panel.css({
'paddingTop': options.height + 'px'
})
$panelList.eq(0).css({
'position': 'absolute',
'top': options.height*toIndex + 'px'
});
tInd = 0;
}else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個(gè)圖片,然后點(diǎn)擊上一個(gè)圖片的時(shí)候出現(xiàn)
//當(dāng)前為最后一個(gè)輪播體時(shí)的處理
$panelList.eq(max - 1).css({
'position': 'absolute',
'top': -options.height + 'px'
});
tInd = max - 1;
}else{
tInd = toIndex;
}
//先將焦點(diǎn)切換過去
$selectList.filter('.' + options.selected).removeClass(options.selected)
.end().eq(tInd).addClass(options.selected);
$panel.animate({ 'marginTop': -options.height*toIndex + 'px' }, options.duration, function() {
focusIndex = tInd;
if(toIndex >= max){
$panel.css({
marginTop: 0,
'paddingTop': 0
});
$panelList.eq(0).css({
'position': 'static',
'top': 'auto'
});
}else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個(gè)圖片,然后點(diǎn)擊上一個(gè)圖片的時(shí)候出現(xiàn)
$panel.css({
'marginTop': -options.height*focusIndex + 'px',
'paddingTop': 0
});
$panelList.eq(max - 1).css({
'position': 'static',
'top': 'auto'
});
}
options.callback(focusIndex,$panelList.eq(focusIndex));
inAnimation = false;
doWaitting();
})
}
}
function bindEvent(){
//綁定事件
$this.on('mouseover',function(){
stopScroll();
}).on('mouseout',function(){
startScroll();
}).on('click', '.nfdscroll-prev', function(){
stopScroll();
startScroll(focusIndex - 1);
}).on('click', '.nfdscroll-next', function(){
stopScroll();
startScroll(focusIndex + 1);
})
$selectList.on('mouseover',function(){
stopScroll();
if(!$(this).is('.' + options.selected)){
startScroll($(this).index());
}
});
}
function init(){
$this.css({
position: 'relative',
overflow: 'hidden'
});
$panel.css({
position: 'relative'
})
focusIndex = options.startIndex;//默認(rèn)從startIndex開始滾動(dòng)
$selectList.eq(focusIndex).addClass(options.selected);//先將焦點(diǎn)切換過去
if(options.deriction == 'left' || options.deriction == 'right'){
//初始化樣式,實(shí)際上不應(yīng)該插件里面來做樣式,應(yīng)該使用者自己就保證樣式?jīng)]有問題
var cssO = {
width: options.width,
'float': 'left'
}
$this.css({
width: options.width
});//只需要管寬度即可
if(options.height){
cssO.height = options.height;
}
var leng = $panel.find('>li').css(cssO).length;
$panel.css({
width: options.width * leng + 'px',
'marginLeft': -options.width*focusIndex + 'px'
});
animateFn = leftRightAnimate;
}else if(options.deriction == 'top' || options.deriction == 'bottom'){
var cssO = {
height: options.height
}
$this.css({
height: options.height
});//只需要管高度度即可
if(options.width){
cssO.width = options.width;
}
var leng = $panel.find('>li').css(cssO).length;
$panel.css({
height: options.height * leng + 'px',
'marginTop': -options.height*focusIndex + 'px'
});
animateFn = topBottomAnimate;
}else{
alert('插件只支持left/right/top/bottom四種方向上的滾動(dòng)');
return;
}
startScroll();
}
bindEvent();
init();
return {
'stopScroll': stopScroll,
'startScroll': startScroll
}
}
});
一個(gè)完整的例子
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>輪播測(cè)試?yán)?lt;/title>
<style type="text/css">
body,ul,ol{margin: 0; padding: 0;}
ul,ol{list-style: none;}
.li1{background-color: #000;}
.li2{background-color: #333;}
.li3{background-color: #666;}
.li4{background-color: #999;}
.example{margin-left: 300px;}
.example ol {
position: absolute;
padding-left: 80px;
width: 186px;
height: 20px;
top: 186px;
left: 0px;
background: #fff;
cursor: pointer;
}
ol li{
float: left;
width: 10px;
height: 10px;
margin: 5px;
background: #ff0;
border-radius: 10px;
}
ol li.circle{
background: #f00;
}
</style>
</head>
<body>
<div class="example">
<!-- 滾動(dòng)內(nèi)容ul -->
<ul>
<li class="li1"><a href="xxx" target="_blank" title="xxx"></a></li>
<li class="li2"><a href="xxx" target="_blank" title="xxx"></a></li>
<li class="li3"><a href="xxx" target="_blank" title="xxx"></a></li>
<li class="li4"><a href="xxx" target="_blank" title="xxx"></a></li>
</ul>
<!-- 焦點(diǎn)列表,可選 -->
<ol>
<li class=""></li>
<li class=""></li>
<li class=""></li>
<li class=""></li>
</ol>
<!-- 上一個(gè)和下一個(gè),可選 -->
<div>
<a class="nfdscroll-prev" href="javascript:void(0);"></a>
<a class="nfdscroll-next" href="javascript:void(0);"></a>
</div>
</div>
<script type="text/javascript" src="common/jquery.js"></script>
<script type="text/javascript" src="common/jquery.nfdscroll.js"></script>
<script type="text/javascript">
$('.example').nfdscroll({
startIndex:0,
width:'266',
height:'216',
interval:-1,//2000,
selected:'circle',
prevText:'上一個(gè)',
nextText:'下一個(gè)',
deriction:'left',
callback: function(index,$currentNode){
console.log(index)
}
});
</script>
</body>
</html>
實(shí)現(xiàn)的效果

里面ol、nfdscroll-prev等的樣式自己手動(dòng)調(diào)整
以上這篇輪播的簡(jiǎn)單實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
jQuery實(shí)現(xiàn)自定義右鍵菜單的樹狀菜單效果
這篇文章主要介紹了jQuery實(shí)現(xiàn)自定義右鍵菜單的樹狀菜單效果,涉及jquery鼠標(biāo)事件及頁(yè)面元素操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
JQuery 獲取多個(gè)select標(biāo)簽option的text內(nèi)容(實(shí)例)
下面小編就為大家?guī)硪黄狫Query 獲取多個(gè)select標(biāo)簽option的text內(nèi)容(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
$(document).ready(function() {})不執(zhí)行初始化腳本
今天發(fā)現(xiàn)一個(gè)頁(yè)面始終不執(zhí)行$(document).ready(function() {})初始化腳本,下面是解決方法2014-06-06
基于jquery實(shí)現(xiàn)拆分姓名的方法(純JS版)
jquery拆分姓名處理程序如下,純js實(shí)現(xiàn)的,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-05-05
jquery scroll()區(qū)分橫向縱向滾動(dòng)條的方法
這篇文章主要介紹了使用jquery scroll()方法區(qū)分瀏覽器橫向和縱向滾動(dòng)條的方法,需要的朋友可以參考下2014-04-04
jquery的index方法實(shí)現(xiàn)tab效果
jquery的index方法實(shí)現(xiàn)tab效果,需要的朋友可以參考下。2011-02-02

