利用jQuery实现滑动开关按钮效果(附demo源码下载)

首先来看看要实现的效果图:

HTML结构如下:

Boxwrap fr">
Box fl" id="timeList" typeId="time"> Box_l">Box_c rel"> 24小时 @L_404_1@ Box_r">
Box fl" id="cityList" typeId="city">
Box_l">Box_c rel"> Box_r">

初始化函数

Boxwrap :滑动按钮父容器,同一界别的滑动按钮必须包含在同一个容器中 *@loadData :点击按钮后回调函数 *@#frameMain : 加载内容的iframe Id *@tab.html : 提交参数的页面 */ loadSwitchBox('.Boxwrap',loadData,'#frameMain','tab.html');

完整demo:

HTML:

sitch<a href="https://www.f2er.com/tag/Box/" target="_blank" class="keywords">Box</a>
Boxwrap fr">
Box fl" id="timeList" typeId="time">
Box_l">Box_c rel"> 24小时 @L_404_1@ Box_r">
Box fl" id="cityList" typeId="city">
Box_l">Box_c rel"> Box_r">

JS:

/*
@iframe 加载内容页面
@url url
/
function loadUrl(iframe,url) {
$(iframe).attr('src',url);
}

/**

  • 创建一个滑动div容器
  • @wrapperId 容器ID
  • @type 切换标签的类型
  • @fnCallBack 回调函数
    */
    function createSlideDiv(wrapperId,fnCallBack) {
    calTabWidth(wrapperId); //初始化容器宽度
    var $wraper = $('#' + wrapperId);
    //默认选中第一项
    var default_padding = 5;
    var default_BtnWidth = $wraper.find('.swichTxt').eq(0).width() + default_padding;
    var $switchBtn = $wraper.find('.switchBtn');
    $switchBtn.width(default_BtnWidth); //浮动按钮宽度
    $wraper.find('.swichTxt').eq(0).addClass('cur'); //设置选中选项
    $wraper.attr('selVal',$wraper.find('.swichTxt').eq(0).attr('id'));

//添加click事件
$wraper.find('.swichTxt').click(function() {
var default_padding = 5;
var newIndex = $(this).index(),oldIndex = $wraper.find('.cur').index(),curTxt = $(this).html(),eleWidth = $(this).width() + default_padding,value = $(this).attr('id');
distant = -1;
$wraper.attr('selVal',value);
distant = moveWidth(wrapperId,oldIndex,newIndex); //计算滑动距离
//回调函数参数 点击标签的类型 和 值
var obj = {
type: type,value: value
};

//左移动
if (newIndex > oldIndex) {
$wraper.find(".switchBtn").animate({
'left': '+=' + distant + 'px'
},function() {
$wraper.find('.curTxt').html(curTxt);
$wraper.find("#switchBtn").width(eleWidth);
//执行回调函数
if ($.isFunction(fnCallBack)) fnCallBack(obj);
});
oldIndex = newIndex;
} else if (newIndex < oldIndex) { //右移动
$wraper.find(".switchBtn").animate({
'left': '-=' + distant + 'px'
},function() {
$(this).find('.curTxt').html(curTxt);
$wraper.find(".switchBtn").width(eleWidth);
//执行回调函数
if ($.isFunction(fnCallBack)) fnCallBack(obj);
});
oldIndex = newIndex;
}
$wraper.find('.cur').removeClass('cur');
$(this).addClass('cur');
});
}

/*
计算容器宽度

  • @wrapperId 容器id
    */
    function calTabWidth(wrapperId) {
    var $wraper = $('#' + wrapperId);
    var wrapperWidth = 0;
    var tdSpace = 18; //左右圆角宽度
    var oPadding = 5; //元素默认间距
    $wraper.find('.swichTxt').each(function(i) {
    wrapperWidth += $(this).outerWidth() + oPadding;
    });
    wrapperWidth = wrapperWidth + tdSpace;
    $wraper.width(wrapperWidth);
    }

/*
计算按钮移动距离

  • @wrapperId 容器id
  • @oldIndex 之前选中的选项索引
  • @newIndex 当前点击选项索引
    */
    function moveWidth(wrapperId,newIndex) {
    var $wraper = $('#' + wrapperId);
    var width = 0;
    //向右移动
    if (oldIndex < newIndex) {
    var $s_btn = $wraper.find(".switchBtn");
    var $a_btn = $wraper.find('.swichTxt').eq(newIndex - 1);
    //当前span左侧位置离左边的距离
    var curBtn = $s_btn.offset().left;
    //目标标签左侧位置离左边的距离
    var einA = $a_btn.offset().left;
    width = parseInt(einA - curBtn + 9); //?
    } else { //向左移动
    var $s_btn = $wraper.find(".switchBtn");
    var $a_btn = $wraper.find('.swichTxt').eq(newIndex - 1);
    //当前span左侧位置离左边的距离
    var curBtn = $s_btn.offset().left;
    //目标标签左侧位置离左边的距离
    var einA = $a_btn.offset().left;
    width = parseInt(curBtn - einA);
    }
    return width;
    }

实例下载:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

jQuery插件的种类 1、封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进...
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。 入门 编写一个jQuery插件开始于给...
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js。 兼容性如图: ht...
一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一...