js 利用透明度 通过构造函数与原型对象来实现轮播图

这里为页面结构

<div class="slidBox">
        <ul class="slidUl">
            <li><img src="img/1.jpg" alt="">1</li>
            <li style="opacity: 0;"><img src="img/2.jpg" alt="">2</li>
            <li style="opacity: 0;"><img src="img/3.jpg" alt="">3</li>
        </ul>
    </div>
    <!-- 这个是封装好的运动函数 和 获取非行内样式的函数  的js -->
    <script src="sport-color-count.js"></script>
    <!--  这个是轮播类的js  -->
    <script src="case.js"></script>
    <script>
        window.onload = function () {
            var opacity1 = new Opacity();
            opacity1.action();
            opacity1.arrow();
            opacity1.nut();
            opacity1.clearInterval();
        }
    </script>

这里直接写构造函数和原型对象部分

function Opacity(){
    //获取ul
    this.oUl =document.getElementsByClassName("slidUl");
    //获取盒子
    this.oDiv =document.getElementsByClassName("slidBox");
    //获取ul下的子元素 也就是li
    this.oLi =this.oUl[0].children;
    //获取ul子元素的长度
    this.len =this.oLi.length;
}
//设置怎么动
Opacity.prototype.move=function(){
        //遍历所有li 先将所有隐藏
        for(let i=0;i<this.len;i++){
            startMove(this.oLi[i],{"opacity":0});
        }
        //利用计时器 使第一个张首先亮相
        startMove(this.oLi[this.count],{"opacity":100});
        //每次亮相完 计时器++ 以便进入下一张
        this.count++;
        //三张都亮相完了 计时器计时第四次亮相的是第一张图片 一轮三张
        if(this.count == this.len){
            this.count = 0;
        }
}
//定时器来启动
Opacity.prototype.action=function(){
    this.count  =0;
    this.timer=setInterval(()=>{
        this.move();
    },3000);
}
//生成箭头 并设置功能
Opacity.prototype.arrow=function(){
    this.oBtn = document.createElement("div");
    this.oBtn.className ="btn";
    this.oBtn.innerHTML = `<span>&lt;</span><span>&gt;</span>`;
    this.oDiv[0].appendChild(this.oBtn);
    this.oSpan = this.oBtn.children;
    this.oSpan[0].onclick=()=>{
        this.move();
    }
    //回到前一张 且要克服++的影响
    this.oSpan[1].onclick=()=>{
        // this.count++;
        for(let i=0;i<this.len+2;i++){
            this.move();
        }
    } 
}
//关闭定时器
Opacity.prototype.clearInterval=function(){
    // console.log(this.timer);
    this.oDiv[0].onmouseover = ()=>{
        clearInterval(this.timer);
        // console.log(this.timer);
    }
    this.oDiv[0].onmouseout = ()=>{
        this.timer = setInterval(() => {
            this.move();
        }, 3000)
    }
}
function startMove(domobj, json, fn) {
    clearInterval(domobj.timer);
    domobj.timer = setInterval(function () {
        var flag = true; //假设所有的属性都达到了目标值
        for (var attr in json) {
            var iTarget = json[attr]; //取到目标值
            if (attr == "opacity") { //透明度的处理
                var iCur = parseInt(getStyle(domobj, "opacity") * 100);
            } else {
                var iCur = parseInt(getStyle(domobj, attr)); //取到当前值
            }
            var iSpeed = (iTarget - iCur) / 8;
            iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
            if (attr == "opacity") {
                domobj.style.opacity = (iCur + iSpeed) / 100;
                domobj.style.filter = "alpha(opacity=" + (iCur + iSpeed) + ")";
            } else {
                domobj.style[attr] = iCur + iSpeed + "px";

            }

            if (iTarget != iCur) { //只要有没达到的 flag为false
                flag = false;
            }
        }
        if (flag) { //只有在flag为true时才清定时器
            clearInterval(domobj.timer);
            if (fn) {
                fn();
            }
        }

    }, 100)
}
function getStyle(domobj, attr) {
    if (window.getComputedStyle) {
        return getComputedStyle(domobj, null)[attr];
    }
    return domobj.currentStyle[attr];
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值