0
点赞
收藏
分享

微信扫一扫

横向图片无缝滚动走马灯效果类似公告

佳简诚锄 2024-05-08 阅读 12

走马灯:

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<script type="text/javascript" src="https://bhw.lllomh.com/js/jquery-1.12.4.min.js"></script>
</head>
<body>

	<!--左右方向-->
<div class="partPiiic" style="position: absolute;width: 3.75rem;height: 1.81rem;top: 3.88rem;left: 0rem;overflow:hidden" slidespeed="10">
      <div class="piiic_region" slidedirection="LR" slidespeed="10" style="display: flex; position: relative; height: 100%; ">
        <div class="piiic_item" style="position:relative;height:100%" >
          <img style="height:100%" src="https://bhw.lllomh.com/images/01.jpg"/>
        </div>
      
      </div>
    </div>

<script type="text/javascript">
	
	window.onload = function () { 
 //初始化图片走马灯
longPicInit(); 
}
function longPicInit() {
    var container = document.querySelector("body");
    var partPiiicList = container.querySelectorAll(".partPiiic");
    if (partPiiicList.length > 0) {
        for (var index = 0; index < partPiiicList.length; index++) {
            var partPiiicNode = partPiiicList[index];
               //存在其他业务逻辑,删除后只保留走马灯逻辑
               //根据你自己的实际情况,获取到所有走马灯元素即可
                //执行循环动画              
                loopLongPic(partPiiicNode);         
        }
    }
}


function loopLongPic(partPiiicNode) {     //timeflag标志位 offspeed走马灯每次移动距离 copynum需要复制的子元素数量 
    var timeFlag = 1, offSpeed = 1, copyNum = 1, picTimer;
    var piiic_region = partPiiicNode.querySelector(".piiic_region");
    var speed = piiic_region.getAttribute("slidespeed"); //走马灯速度
    var deraction = piiic_region.getAttribute("slidedirection");//走马灯方向 上下还是左右
    var piiic_item = piiic_region.querySelector(".piiic_item");//走马灯元素
    if (deraction == "LR") {        //根据视图宽度除子元素宽度计算需要复制几个子元素
        copyNum = Math.ceil(partPiiicNode.offsetWidth / piiic_item.offsetWidth);
        var text = $(piiic_region).html();
        for (var i = 0; i < copyNum; i++) {            //复制后追加
            $(piiic_region).append(text);
        }
        piiic_region.style.width = piiic_item.offsetWidth * (copyNum + 1) + "px";
    } else {        //上下方向上的复制,逻辑同理
        copyNum = Math.ceil(partPiiicNode.offsetHeight / piiic_item.offsetHeight);
        var text = $(piiic_region).html();
        for (var i = 0; i < copyNum; i++) {
            $(piiic_region).append(text);
        }
        piiic_region.style.height = piiic_item.offsetHeight * (copyNum + 1) + "px";
    }    //复制后,开启跑马灯
    picTimer = setInterval(LoopMove, speed) 
    function LoopMove() {
        if (timeFlag == 0) {
            clearInterval(picTimer)
            picTimer = null;
            return false;
        }
        if (deraction == "LR") {           //边界处理函数,到头拉回
            criticalX()
            piiic_region.style.left = piiic_region.offsetLeft - offSpeed + "px"; 
        }
        if (deraction == "UD") {
            criticalY();
            piiic_region.style.top = piiic_region.offsetTop - offSpeed + "px"; 
        } 
    }//添加touch事件
var touchStartX = 0,touchStartY = 0, moveStartY = 0, starttime = 0,restart, animateMoveTimer;
    piiic_region.addEventListener("touchstart", function (e) {
        if (picTimer) { clearInterval(picTimer); picTimer = null; }
        if (restart) { clearTimeout(restart); restart = null; }
        if (animateMoveTimer) { clearInterval(animateMoveTimer) }
        timeFlag = 0
        //暂停定时器 手动拖拽上下左右距离
        var ev = e || window.event;
        var touch = ev.targetTouches[0];        //记录touch初始位置
        touchStartX = touch.pageX;
        touchStartY = touch.pageY;        //记录元素初始位置
        moveStartX = piiic_region.offsetLeft;
        moveStartY = piiic_region.offsetTop;
        starttime = Date.now();
        piiic_region.addEventListener("touchmove", preventDefault, false);
    })
    piiic_region.addEventListener("touchmove", picImgMove)
    function picImgMove(e) {
        timeFlag = 0;
        if (timeFlag == 0) {
            var ev = e || window.event;
            var touch = ev.targetTouches[0]
            if (deraction == "LR") {//左右移动               //根据当前位置-初始位置计算手指移动距离 改变元素left
                var moveX = touch.pageX - touchStartX;
                piiic_region.style.left = moveStartX + moveX + "px";
                criticalX()                  
            }
            if (deraction == "UD") {//上下移动
                var moveY = touch.pageY - touchStartY;
                piiic_region.style.top = moveStartY + moveY + "px";
                criticalY()       
            }
        }
    }
piiic_region.addEventListener("touchend", function (e) {
        piiic_region.removeEventListener("touchmove", preventDefault);
        //获取最总结束位置
        var ev = e || window.event;
        var touch = ev.changedTouches[0]
        var time = Date.now() - starttime;           //获取手指滑动速度 设置参数 可以根据自己想要的效果设置不同值
        var endeSpeed = 0, rationSpeed = 40;
        //执行惯性移动
        if (deraction == "LR") {
            var distanceX = touch.pageX - touchStartX;
            endeSpeed = (distanceX / time) * rationSpeed;
            animateMove(endeSpeed)
        }
        if (deraction == "UD") {
            var distanceY = touch.pageY - touchStartY;
            endeSpeed = (distanceY / time) * rationSpeed;
            animateMove(endeSpeed)
        }        
    })
function animateMove(endeSpeed) {
        if (animateMoveTimer) { clearInterval(animateMoveTimer) }
        //endeSpeed是结束时的初速度,a为加速度,每隔1ms速度递减执行当前速度*1ms时间的距离,如果速度接近0,则清除计时器
        var a = endeSpeed < 0 ? 2 : -2; 
        animateMoveTimer = setInterval(function () {
            if (Math.abs(endeSpeed) < 1) {
                clearInterval(animateMoveTimer);
                if (picTimer) {clearInterval(picTimer); picTimer = null;}
                if (restart) {clearTimeout(restart); restart = null;}
                restart = setTimeout(function () { timeFlag = 1; picTimer = setInterval(LoopMove, speed); }, 3000);
                return;
            }
            endeSpeed += a;
            if (deraction == "LR") {
                piiic_region.style.left = piiic_region.offsetLeft + endeSpeed + "px";
                criticalX(); 
            }
            if (deraction == "UD") {
                piiic_region.style.top = piiic_region.offsetTop + endeSpeed + "px";
                criticalY(); 
            }
        },1)
    }
//边界处理函数
function criticalX() {
        if (piiic_region.offsetLeft < -piiic_region.offsetWidth / (copyNum + 1)) {           //拖到最右边 循环
            piiic_region.style.left = 0;
        } else if (piiic_region.offsetLeft >= 0) {            //拖到最左边 循环
            piiic_region.style.left = -piiic_region.offsetWidth / (copyNum + 1) + "px";
        }    
    }
    function criticalY() {
        if (piiic_region.offsetTop < -piiic_region.offsetHeight / (copyNum + 1)) {
            piiic_region.style.top = 0
        } else if (piiic_region.offsetTop >= 0) {
            piiic_region.style.top = -piiic_region.offsetHeight / (copyNum + 1) + "px";
        }    
    }
}



</script>
</body>
</html>


举报

相关推荐

0 条评论