首页 > Web开发 > 详细

多Tabs的横向滚动插件(支持Zepto和jQuery)

时间:2016-03-10 12:46:47      阅读:354      评论:0      收藏:0      [点我收藏+]

一. 效果图

技术分享

 

二. 说明

  1. 每个li标签的width长度相同,点击可以使其居中。

  2. 每个li标签的width长度不同,点击不能使其区中,计算方式还有待更新。

‘use strict‘;
(function($) {
  $.extend($.fn, {
    offsetSlider: function(obj) {
      this.each(function() {
        var $self = $(this);
        var dom = {
          "wrap": $self.find("ul"),
          "item": $self.find("li")
        };
        var settings = {
          "len": dom.item.length,
          "maxOffset": $(‘body‘).width() - dom.wrap.width(),
          "distance": 50,
          "startX": 0,
          "startY": 0,
          "curShow": obj ? (obj.curShow ? obj.curShow : 0) : 0,
          "showLen": obj ? (obj.showLen ? obj.showLen : 0) : 0,
          "curShowFix": obj ? (obj.curShowFix ? obj.curShowFix : 0.5) : 0.5,
        };
        var funs = {
          init: function() {
            funs.initUI();
            if (settings.len > 1) {
              funs.bindEvent();
            }
          },
          updateOffset: function() {
            if (settings.showLen && settings.curShow) {
              if (settings.curShow <= settings.showLen) {
                settings.currentOffset = settings.offset = 0;
              } else if (settings.curShow > settings.len - settings.showLen) {
                settings.currentOffset = settings.offset = settings.maxOffset;
              } else {
                var currentOffset = parseInt((settings.curShow - settings.showLen) * settings.maxOffset / (settings.len - 2 * settings.showLen + settings.curShowFix));
                if (currentOffset > 0) {
                  settings.currentOffset = settings.offset = 0;
                } else if (currentOffset < settings.maxOffset) {
                  settings.currentOffset = settings.offset = settings.maxOffset;
                } else {
                  settings.currentOffset = settings.offset = currentOffset;
                }
              }
            } else if (settings.showLen) {
              settings.currentOffset = settings.offset = 0;
            }
            dom.wrap.css("-webkit-transition", "-webkit-transform 0.5s ease-in-out")
            dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
          },
          initUI: function() {
            if (!settings.showLen) {
              settings.currentOffset = settings.offset = 0;
              dom.wrap.css("-webkit-transform", "translate3d(0, 0, 0)");
            } else {
              funs.updateOffset();
            }
          },
          bindEvent: function() {
            dom.item.on({
              "click": function(e) {
                e.stopPropagation();
                settings.curShow = parseInt($(this).index() + 1);
                funs.updateOffset();
              }
            });
            $self.off().on({
              "touchstart": function(e) {
                e.stopPropagation();
                settings.startX = e.touches ? e.touches[0].pageX : e.originalEvent.touches[0].pageX;
                settings.startY = e.touches ? e.touches[0].pageY : e.originalEvent.touches[0].pageY;
              },
              "touchmove": function(e) {
                e.stopPropagation();
                e.preventDefault();
                var curX = e.touches ? e.touches[0].pageX : e.originalEvent.touches[0].pageX;
                var curY = e.touches ? e.touches[0].pageY : e.originalEvent.touches[0].pageY;
                var moveX = curX - settings.startX;
                var moveY = curY - settings.startY;
                if (Math.abs(moveY) > Math.abs(moveX)) {
                  window.event.returnValue = true;
                } else {
                  e.preventDefault();
                }
                dom.wrap.css("-webkit-transition", "")
                var val = moveX + parseInt(settings.offset);
                if (val < settings.maxOffset) {
                  if (Math.abs(val - settings.maxOffset) > settings.distance) {
                    settings.currentOffset = -settings.distance / 2 + (val - settings.maxOffset + settings.distance) / 5 + settings.maxOffset;
                  } else {
                    settings.currentOffset = (val - settings.maxOffset) / 2 + settings.maxOffset;
                  }
                } else if (val > 0) {
                  if (val > settings.distance) {
                    settings.currentOffset = (val - settings.distance) / 5 + settings.distance / 2;
                  } else {
                    settings.currentOffset = val / 2;
                  }
                } else {
                  settings.currentOffset = val;
                }
                dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
              },
              "touchend": function(e) {
                e.stopPropagation();
                if (settings.currentOffset < settings.maxOffset) {
                  dom.wrap.css("-webkit-transition", "-webkit-transform 0.5s ease-in-out")
                  settings.currentOffset = settings.offset = settings.maxOffset;
                } else if (settings.currentOffset > 0) {
                  dom.wrap.css("-webkit-transition", "-webkit-transform 0.5s ease-in-out")
                  settings.currentOffset = settings.offset = 0;
                } else {
                  settings.offset = settings.currentOffset;
                }
                dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
              },
              "webkitTransitionEnd": function(e) {
                e.stopPropagation();
                e.preventDefault();
                dom.wrap.css("-webkit-transition", "")
                if (settings.currentOffset < settings.maxOffset) {
                  settings.currentOffset = settings.offset = settings.maxOffset;
                } else if (settings.currentOffset > 0) {
                  settings.currentOffset = settings.offset = 0;
                } else {
                  settings.offset = settings.currentOffset;
                }
                dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
              }
            });
          }
        };
        funs.init();
      });
    }
  });
})(window.jQuery || window.Zepto);

 

.analysis-tabs-title ul {
  width: 180%;
  display: -webkit-box;
  display: flex;
  display: -webkit-flex;
  -webkit-box-pack: justify;
  justify-content: space-between;
  -webkit-justify-content: space-between;
}

.analysis-tabs-title ul li {
  padding: 10px;
  text-align: center;
  display: block;
}

.analysis-tabs-title ul li:first-child {
  margin-left: 8px;
}

.analysis-tabs-title ul li:last-child {
  margin-right: 8px;
}

.analysis-tabs-title ul li.active {
  color: #8e6cd1;
  border-bottom: 2px solid #8e6cd1;
}

 

多Tabs的横向滚动插件(支持Zepto和jQuery)

原文:http://www.cnblogs.com/ccblogs/p/5261292.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!