无插件移动模型

移动标签

标签栏

当标签很多的时候,要实现左右移动。

移动模型

初次给ul一个足够大的宽值(999%),为防止标签过多而折行。然后在渲染完毕之后,根据标签和间距,计算ul的真实宽度,使滑到到最后一个标签就不会继续滑动到空白处了(前提:视图窗口的 overflow-x:auto)。用jQuery $('.tag').css('padding-left') 等可以获取到标签真实的px值。
我本来一直想用swiper插件看能不能实现,但是插件一直使得每一个标签全屏宽,也有不是全屏宽的div,但似乎要设宽。因为标签内容不定,不能设等宽。所以不能用Swiper。

仅仅只有移动,无论在IOS还是Android下都显得挺失色的。有点反弹才比较舒服。jQuery有个封装好的额插件,带有animate的,忘了叫什么名字,带有一点滑动的速度,显得特别不错。

update:
最终,交付反馈我的滑动效果不好。这肯定得改的。找到了现成的jquery插件。必须以下面的格式才可以,当然,也可以改写源码,好像不太难。用 $('#container').touchslider();触发,主要识别** ul.slides**

<div id="container">
  <ul class="slides">
    <li>xxxxx1</li>
    <li>xxxxx2</li>
  </ul>
</div>

附上插件的源码:(插件是动态计算li的outWidth,即padding和width,如果有margin需要另外加上去,在doMath函数里修改就可以了)

(function(a) {
a.touchslider = function(c) {
    var d = a(c),
    e = ("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch,
    b = {};
    a.data(c, "touchslider", d);
    b = {
        init: function() {
            d.container = a("ul.slides", d);
            d.slides = a("li", d.container);
            d.find("div.loading").remove();
            d.container.show();
            d.x = 0;
            d.switchs = true;
            a("a", d.slides).bind("click",
            function() {
                var f = d.container.position().left;
                if (Math.abs(f - d.x) > 5) {
                    d.setProps(Math.abs(f));
                    return false
                }
            });
            d.prop = "marginLeft";
            d.args = {};
            d.transitions = (function() {
                var h = document.createElement("div"),
                g = ["perspectiveProperty", "WebkitPerspective", "MozPerspective", "OPerspective", "msPerspective"];
                for (var f in g) {
                    if (h.style[g[f]] !== undefined) {
                        d.pfx = g[f].replace("Perspective", "").toLowerCase();
                        d.prop = "-" + d.pfx + "-transform";
                        return true
                    }
                }
                return false
            } ());
            d.doMath();
            d.setup();
            if (d.switchs) {
                if (e) {
                    b.touch()
                }
                a(window).bind("resize focus", b.resize)
            }
        },
        touch: function() {
            var p, n, k, s, h, q, l, i, j, g, o = false;
            c.addEventListener("touchstart", m, false);
            function m(t) {
                if (t.touches.length === 1) {
                    q = Number(new Date());
                    h = 0;
                    i = 0;
                    j = 0;
                    k = Math.abs(d.x);
                    p = t.touches[0].pageX;
                    n = t.touches[0].pageY;
                    c.addEventListener("touchmove", f, false);
                    c.addEventListener("touchend", r, false)
                }
            }
            function f(v) {
                s = p - v.touches[0].pageX;
                o = (Math.abs(s) < Math.abs(v.touches[0].pageY - n));
                if (!o) {
                    v.preventDefault();
                    var u = Number(new Date()) - q;
                    i += parseInt(Math.abs(s) * 100 / u) > 30 ? 50 : 20;
                    j++;
                    if (Math.abs(s - h) > 3) {
                        h = s;
                        var t = k + s;
                        if (d.transitions && t > -50 && Math.abs(t) < d.tw - d.w + 50) {
                            d.setProps(t, "setTouch")
                        }
                    }
                }
            }
            function r(v) {
                if (d.transitions) {
                    var t;
                    if (d.x > 0) {
                        t = 0
                    } else {
                        l = i / j;
                        var u = (Math.abs(d.x) - k) * (l > 30 ? parseInt(l / 10) : 1);
                        t = k + u
                    }
                    if (t < 0) {
                        t = 0;
                        u = -k
                    } else {
                        if (Math.abs(t) > d.tw - d.w) {
                            t = d.tw - d.w;
                            u = t - k
                        }
                    }
                    d.setProps(t, "setTouch", Math.abs(u))
                }
                c.removeEventListener("touchmove", f, false);
                c.removeEventListener("touchend", r, false);
                p = null;
                n = null;
                s = null;
                k = null
            }
        },
        resize: function() {
            if (d.is(":visible")) {
                d.doMath();
                d.setProps(0, "setTotal", 400)
            }
        }
    };
    d.setProps = function(i, f, g) {
        var h = (function() {
            var j = (function() {
                switch (f) {
                case "setTotal":
                    return (Math.abs(d.x) > d.tw - d.w) ? (d.tw - d.w < 0 ? 0 : d.tw - d.w) : Math.abs(d.x);
                case "setTouch":
                    return i;
                default:
                    return i
                }
            } ());
            d.x = j * -1;
            return d.x + "px"
        } ());
        if (d.transitions) {
            h = "translate3d(" + h + ",0,0)";
            g = (g !== undefined) ? (g / 1000) + "s": "0s";
            d.container.css("-" + d.pfx + "-transition-duration", g)
        }
        d.args[d.prop] = h;
        if (d.transitions || g === undefined) {
            d.container.css(d.args)
        }
    };
    d.setup = function() {
        d.viewport = a('<div class="flex-viewport"></div>').appendTo(d).append(d.container);
        d.w = d.viewport.width();
        d.container.width(d.tw + "px");
        var f = d.tw - d.w;
        if (f < 0) {
            d.x = 0;
            d.switchs = false;
            return
        } else {
            if (d.x >= f) {
                d.x = f
            }
        }
        d.setProps(d.x, "init")
    };
    d.doMath = function() {
        if (d.viewport) {
            d.w = d.viewport.width()
        }
        d.tw = 0;
        d.slides.each(function() {
            if (a(this).attr("class") == "cur") {
                d.x = d.tw
            }
            d.tw += a(this).outerWidth()
        })
    };
    b.init()
};
a.fn.touchslider = function() {
    return this.each(function() {
        new a.touchslider(this)
    })
}
})(jQuery);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,571评论 25 707
  • 请参看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon阅读 6,999评论 2 19
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 3,418评论 1 19
  • 你走的那天,我也随着心情出发 看那些受过的伤,结在你身上的疤 我远远的站着,只是看你扛起又放下 天逐渐的冷了 回到...
    东北郭西西阅读 143评论 0 0
  • 七月的最后一天,坐在办公室内,空调内吹出的凉风,从我的身上在我身上来回游走;望着窗外依然炽热的阳光,在玻璃上来回折...
    好郝说话阅读 255评论 0 3