移动端实现导航的左右滑动

实现导航的左右滑动类似于腾讯新闻,网易等导航,一下贴上代码:

<!doctype html>

<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<style>
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,form,input,p,th,td,table,textarea,select{margin:0;padding:0;}
h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
th,em{font-style:normal;font-weight:normal;}
ol,ul{list-style:none;}
table{border-collapse:collapse;border-spacing:0;}
img,a img{border:0;}
body{font:12px 'Microsoft YaHei',Arial;color:#666;background-color:#eee;}
.nav{width:100%;overflow:hidden;margin:0 auto;height:35px;position:relative; line-height:35px;background-color:#000;}
.nav ul{position:absolute;left:0;top:0;width:640px;z-index:1;}
.nav ul li{width:80px; float:left; overflow:hidden;}
.nav a{color:#fff;width:100%; display:block; text-decoration:none; text-align:center;}
</style>


<body>




<div class="nav" id="nav">
<ul>
<li><a href="#">菜单1</a></li>
<li><a href="#">菜单2</a></li>
<li><a href="#">菜单3</a></li>
<li><a href="#">菜单4</a></li>
<li><a href="#">菜单5</a></li>
<li><a href="#">菜单6</a></li>
<li><a href="#">菜单7</a></li>
<li><a href="#">菜单8</a></li>
<li><a href="#">菜单9</a></li>
<li><a href="#">菜单10</a></li>
</ul>
</div>










<script>
window.Swipe = function(b, a) {
    if (!b) {
        return null
    }
    this.options = a || {};
    this.index = this.options.startSlide || 0;//开始的导航页的第几屏
    this.speed = this.options.speed || 300;//速度
this.lwidth = this.options.width || 80;//导航li宽度
    this.delay = this.options.auto || 0;//自动滚动菜单速度0为不自动滚动
    this.container = b;//在那个容器内
    this.element = this.container.children[0];//
    
    this.setup();
   
    if (this.delay != 0) {
        this.begin();
    }
    if (this.element.addEventListener) {
        this.element.addEventListener("touchstart", this, false);
        this.element.addEventListener("touchmove", this, false);
        this.element.addEventListener("touchend", this, false);
        this.element.addEventListener("touchcancel", this, false);
        this.element.addEventListener("webkitTransitionEnd", this, false);
        this.element.addEventListener("msTransitionEnd", this, false);
        this.element.addEventListener("oTransitionEnd", this, false);
        this.element.addEventListener("transitionend", this, false);//监听过度动画是否结束
        window.addEventListener("resize", this, false)
    }
};
Swipe.prototype = {
//设置其基本样式
    setup: function() {
        this.slides = this.element.children;
        this.width = Math.ceil(("getBoundingClientRect" in this.container) ? this.container.getBoundingClientRect().width: this.container.offsetWidth);
        if (!this.width||this.slides.length < 1) {//没有子节点,获取不到屏幕宽度均返回
            return null
        }
        this.element.style.width = Math.ceil(this.slides.length * this.lwidth) + "px";
        var a = this.slides.length;
        while (a--) {
            var b = this.slides[a];
            b.style.width = this.lwidth + "px";
        }
        this.slide(this.index, 0);
    },
    slide: function(a, c) {
        var b = this.element.style;
        if (c == undefined) {
            c = this.speed
        }
        //过度效果需要花费时间
        b.webkitTransitionDuration = b.MozTransitionDuration = b.msTransitionDuration = b.OTransitionDuration = b.transitionDuration = c + "ms";
        this.index = a
        //console.log(a * this.width,Math.ceil((this.slides.length*this.lwidth)/this.width));
        if(a * this.width>(Math.ceil((this.slides.length*this.lwidth)/this.width)-1)*this.width){
//          b.MozTransform = b.webkitTransform = "translate3d(" + -((Math.ceil((this.slides.length*this.lwidth)/this.width)-1) * this.width) + "px,0,0)";
//       b.msTransform = b.OTransform = "translateX(" + -((Math.ceil((this.slides.length*this.lwidth)/this.width)-1) * this.width) + "px)";
        return false;
        }
        else{
        b.MozTransform = b.webkitTransform = "translate3d(" + -(a * this.width) + "px,0,0)";
      b.msTransform = b.OTransform = "translateX(" + -(a * this.width) + "px)";
        }
       
    },
    getPos: function() {
        return this.index
    },
    //前一个,
    prev: function(a) {
        this.delay = a || 0;
        clearTimeout(this.interval);
       // console.log(this.index);
        if (this.index) {
            this.slide(this.index - 1, this.speed)
            //console.log( this.index);
        } else {
            this.slide(this.length - 1, this.speed)
        }
    },
    //后一个
    next: function(a) {
        this.delay = a || 0;
        clearTimeout(this.interval);
        if (this.index < this.length - 1) {
            this.slide(this.index + 1, this.speed)
        } else {
            this.slide(0, this.speed)
        }
    },
    begin: function() {
        var a = this;
        console.log(a);
        this.interval = (this.delay) ? setTimeout(function() {
            a.next(a.delay)
        },
        this.delay) : 0
    },
    stop: function() {
        this.delay = 0;
        clearTimeout(this.interval)
    },
    resume: function() {
        this.delay = this.options.auto || 0;
        this.begin()
    },
    handleEvent: function(a) {
        switch (a.type) {
        case "touchstart":
            this.onTouchStart(a);
            break;
        case "touchmove":
            this.onTouchMove(a);
            break;
        case "touchcancel":
        case "touchend":
            this.onTouchEnd(a);
            break;
        case "webkitTransitionEnd":
        case "msTransitionEnd":
        case "oTransitionEnd":
        case "transitionend":
            this.transitionEnd(a);
            break;
        case "resize":
            this.setup();
            break
        }
    },
    transitionEnd: function(a) {
        if (this.delay) {
            this.begin()
        }
        
    },
    onTouchStart: function(a) {
        this.start = {
            pageX: a.touches[0].pageX,
            pageY: a.touches[0].pageY,
            time: Number(new Date())
            
        };
       // console.log(this.start)
        this.isScrolling = undefined;
        this.deltaX = 0;
        this.element.style.MozTransitionDuration = this.element.style.webkitTransitionDuration = 0;
        a.stopPropagation()
    },
    onTouchMove: function(a) {
        if (a.touches.length > 1 || a.scale && a.scale !== 1) {
            return
        }
        this.deltaX = a.touches[0].pageX - this.start.pageX;
        if (typeof this.isScrolling == "undefined") {
        //判断是横向还是树向滑动
            this.isScrolling = !!(this.isScrolling || Math.abs(this.deltaX) < Math.abs(a.touches[0].pageY - this.start.pageY))
        }
        if (!this.isScrolling) {
            a.preventDefault();
            clearTimeout(this.interval);
            this.deltaX = this.deltaX / ((!this.index && this.deltaX > 0 || this.index == this.length - 1 && this.deltaX < 0) ? (Math.abs(this.deltaX) / this.width + 1) : 1);
            this.element.style.MozTransform = this.element.style.webkitTransform = "translate3d(" + (this.deltaX - this.index * this.width) + "px,0,0)";
            a.stopPropagation()
        }
    },
    onTouchEnd: function(c) {
        var b = Number(new Date()) - this.start.time < 250 && Math.abs(this.deltaX) > 20 || Math.abs(this.deltaX) > this.width / 2,
        a = !this.index && this.deltaX > 0 || this.index == this.length - 1 && this.deltaX < 0;
        if (!this.isScrolling) {
            this.slide(this.index + (b && !a ? (this.deltaX < 0 ? 1: -1) : 0), this.speed)
        }
        c.stopPropagation()
    }
};


//开始调用插件


var slider=new Swipe(document.getElementById('nav'),{speed:500,auto:0,width:100,col:4,});
</script>
</body>
</html>





### 回答1: 移动端块级标签左右滑动可以通过以下步骤实现: 1. 给外层容器设置固定宽度和 `overflow-x: scroll`,使其可以水平滚动。 2. 内部的块级标签可以使用 `display: inline-block` 或 `float: left` 等样式让它们排列在一行。 3. 如果需要添加滑动效果,可以使用 JavaScript 监听 touch 事件,根据手指移动的距离调整容器的 `scrollLeft` 值,实现左右滑动的效果。 以下是一个示例代码: HTML: ``` <div class="wrapper"> <div class="block">Block 1</div> <div class="block">Block 2</div> <div class="block">Block 3</div> <div class="block">Block 4</div> <div class="block">Block 5</div> </div> ``` CSS: ``` .wrapper { width: 100%; overflow-x: scroll; white-space: nowrap; /* 让内部块级标签在一行中排列 */ } .block { display: inline-block; width: 100px; height: 100px; background-color: #ccc; } ``` JavaScript: ``` var wrapper = document.querySelector('.wrapper'); var startX, startY, moveX, moveY, distanceX, distanceY; wrapper.addEventListener('touchstart', function(e) { startX = e.touches[0].pageX; startY = e.touches[0].pageY; }); wrapper.addEventListener('touchmove', function(e) { moveX = e.touches[0].pageX; moveY = e.touches[0].pageY; distanceX = moveX - startX; distanceY = moveY - startY; if (Math.abs(distanceX) > Math.abs(distanceY)) { // 判断是水平滑动还是垂直滑动 e.preventDefault(); // 阻止默认事件,使页面不会滚动 wrapper.scrollLeft -= distanceX; // 调整容器的 scrollLeft 值 } }); ``` ### 回答2: 移动端块级标签左右滑动是指在移动设备上,通过手指滑动屏幕实现对块级标签的左右滑动操作。 实现移动端块级标签左右滑动有多种方式,以下是其中一种常见的实现方法: 首先,需要使用HTML和CSS创建一个具有滚动效果的容器,容器内放置需要左右滑动的块级标签。 其次,使用JavaScript监听触摸事件,并根据手指滑动的方向和距离,改变容器内块级标签的位置。 具体实现步骤如下: 1. HTML布局部分,创建一个div容器,设置样式为可滚动,并放置需要左右滑动的块级标签。例如: <div class="scroll-container"> <div class="scroll-content"> <!-- 块级标签内容 --> </div> </div> 2. CSS样式部分,对容器和块级标签进行样式设置,其中.scroll-container需要设置overflow属性为scroll或auto以实现滚动效果。 .scroll-container { overflow: scroll; } .scroll-content { /* 块级标签样式设置 */ } 3. JavaScript部分,监听触摸事件,并根据手指滑动的方向和距离,改变.scroll-container容器的滚动位置。例如: var container = document.querySelector('.scroll-container'); var startX; // 初始触摸位置 container.addEventListener('touchstart', function(e) { startX = e.touches[0].clientX; // 记录初始触摸位置 }); container.addEventListener('touchmove', function(e) { var moveX = e.touches[0].clientX; // 移动时的触摸位置 var distanceX = moveX - startX; // 滑动距离 // 根据滑动距离改变.scroll-container容器的滚动位置 container.scrollLeft -= distanceX; e.preventDefault(); // 阻止默认事件,避免页面滚动 }); 通过以上步骤实现移动端块级标签的左右滑动效果。可以根据实际需求进行样式和交互的调整。 ### 回答3: 移动端块级标签左右滑动是指在移动设备上,通过手指滑动屏幕实现块级标签的左右切换或滚动效果。 要实现移动端块级标签左右滑动,可以使用一些现有的前端框架或库,如Swiper、Slick等。这些框架提供了丰富的API和功能,可以方便地实现移动端块级标签的左右滑动效果。 首先,需要将块级标签按照一定的布局方式排列,并提供导航按钮或指示器来切换不同的块级标签。在HTML文件中,可以使用div元素来包裹每个块级标签,并设置合适的CSS样式,使它们水平排列。 然后,使用JavaScript来实现滑动效果。通过绑定滑动事件,监听用户手指在屏幕上的滑动方向和距离,根据滑动的方向来切换不同的块级标签。可以使用一些原生的JavaScript方法,如touchstart、touchmove、touchend等来实现手势的监听和处理。 当用户滑动屏幕时,可以通过计算手指滑动的距离和滑动的方向,来判断是否切换到下一个或上一个块级标签。在切换过程中,可以使用CSS3动画或过渡效果,来实现流畅的滑动过程。 此外,为了提高用户体验,可以为移动端块级标签左右滑动添加一些特效和动画效果。比如,在切换到下一个块级标签时,可以使用渐变效果或滑动动画,使切换过程更加平滑和自然。 总之,移动端块级标签的左右滑动可以通过使用前端框架或库以及一些JavaScript和CSS技术来实现,提供给用户更加流畅和友好的交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值