最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 一款几年前的轮播图|满满的兼容性味道

    正文概述 掘金(隐冬)   2021-06-30   749

    最近整理电脑偶然发现自己几年前的学习笔记,那时我才是刚入前端不久,每当看到新奇的js效果都忍不住惊叹,记得当时写过很多的练习作品,现在大多尘封在我的D盘,和岛国爱情片共享天伦之乐。

    这是一个当年很流行的js轮播效果,那时候css3.0还不允许用,所以动画都是采用js的setTimeout来写的。

    默认效果长这样,图片如有侵权请联系,立即就删。

    一款几年前的轮播图|满满的兼容性味道

    滚动效果是这个样子的,现在看起来好像也挺好看的。

    一款几年前的轮播图|满满的兼容性味道

    记得去年好像在酷我音乐里面还见到了这样的滚动效果。

    页面的布局很简单,一个div里面包裹了要滚动的内容和向前向后的操作按钮。由于刚学前端还不懂什么react,vue,代码都是写死的,写一句手动刷新一下浏览器,手动欢乐。

    <body>
    	<div id="content">
    		<div class="prev_div"></div>
    		<div class="next_div"></div>
    		<ul>
    			<li class="item_0">
    				<img src="https://img.zcool.cn/community/01cc635cbdecbca801214168c7fa83.png@1280w_1l_2o_100sh.png">
    			</li>
    			<li class="item_1">
    				<img src="https://img.zcool.cn/community/018b535cbdecbca801214168fe547d.png@1280w_1l_2o_100sh.png">
    			</li>
    			<li class="item_2">
    				<img src="https://img.zcool.cn/community/01231d5cbdf17aa801214168294a22.jpg@1280w_1l_2o_100sh.jpg">
    			</li>
    			<li class="item_3">
    				<img src="https://img.zcool.cn/community/01f4a05cbdecbca8012141689f5b58.png@1280w_1l_2o_100sh.png">
    			</li>
    			<li class="item_4">
    				<img src="https://img.zcool.cn/community/01df655cbdf29aa801214168b005b6.jpg@1280w_1l_2o_100sh.jpg">
    			</li>
    			<li class="item_5">
    				<img src="https://img.zcool.cn/community/0166c35cbdf29ba801208f8ba065df.jpg@1280w_1l_2o_100sh.jpg">
    			</li>
    			<li class="item_6">
    				<img src="https://img.zcool.cn/community/013cdc5cbdecbda801208f8bc572cc.png@1280w_1l_2o_100sh.png">
    			</li>
    		</ul>
    	</div>
    </body>
    

    style样式也是随手就写,哪天什么less,sass。第一句肯定是这个。先重置样式

    html, body, ul, li, img, a, p { padding: 0; margin: 0; }
    li { list-style: none; }
    img { border: none; width: 680px; height: 344px;}
    body { background: #ececec; padding-top: 50px; }
    

    然后样式都是手动一级一级的向后写,最多的时候能写个五六级,而且特别容易出错,莫名其妙样式就被覆盖了。

    #content { width: 970px; height: 344px; position: relative; margin: 0 auto; overflow: hidden; }
    
    .prev_div { width: 130px; height: 72px; position: absolute; top: 128px; left: 92px; z-index: 5; background: red; filter: alpha(opacity=0); opacity: 0; cursor: pointer; }
    .next_div { width: 130px; height: 72px; position: absolute; top: 128px; right: 92px; z-index: 5; background: red; filter: alpha(opacity=0); opacity: 0; cursor: pointer; }
    
    #content ul { width: 970px; height: 344px; position: absolute; top: 0; left: 0; z-index: 1; }
    #content li { position: absolute; }
    
    #content .line { border: 4px solid #fff; width: 672px; height: 336px; position: absolute; top: 0; left: 50%; margin-left: -340px; z-index: 3; }
    
    #content .item_0 { top: -104px; left: 0; z-index: 1; filter: alpha(opacity=0); opacity: 0; }
    #content .item_1 { top: 104px; left: 0; z-index: 2; filter: alpha(opacity=60); opacity: 0.6; }
    #content .item_2 { top: 43px; left: 50px; z-index: 3; filter: alpha(opacity=80); opacity: 0.8; }
    #content .item_3 { top: 0; left: 145px; z-index: 4; }
    #content .item_4 { top: 43px; right: 50px; z-index: 3; filter: alpha(opacity=80); opacity: 0.8; }
    #content .item_5 { top: 104px; right: 0; z-index: 2; filter: alpha(opacity=60); opacity: 0.6; }
    #content .item_6 { top: -104px; right: 0; z-index: 1; filter: alpha(opacity=0); opacity: 0; }
    

    细心的你肯定发现了filter: alpha,这还是兼容IE浏览器的代码,我的青春。

    接着就是js了,首先第一句就是这个,真的持续了好长一段时间,做梦都是这样写。那时候面试也很喜欢问这个问题,为什么要这么写。

    window.onload = function () {
    
    }
    

    onload里面就开始操作dom啦,首先获取左右两个操作按钮,并且给他们绑定事件。对了要用var,哪有什么const和let,必须得是var。

    var oPrevDiv = document.getElementsByClassName('prev_div')[0];
    var oNextDiv = document.getElementsByClassName('next_div')[0];
    

    绑定事件都是这样写的。

    oPrevDiv.onclick = function () {  //左
    
    }
    
    oNextDiv.onclick = function () {  //右
    
    }
    

    这个效果的原理实现起来还是很简单的,这里有六张图片,布局完成之后记住每一张图片的位置数据, 宽高啊,透明度啊,将每一组定义为一个对象存储在数组中。当点击前一张的时候就把数组中的最后一个元素放在数组第一位,点击后一个就把第一个元素放在数组最后一位。

    一款几年前的轮播图|满满的兼容性味道

    首先定义一个数组把没涨图片的布局数据存起来。

    var aLi = document.getElementsByTagName('li');
    
    var arr = [];
    
    for (var i = 0; i < aLi.length; i++) {
    
        var oImg = aLi[i].getElementsByTagName('img')[0];
    
        arr.push([
            parseInt(getStyle(aLi[i], 'left')),
            parseInt(getStyle(aLi[i], 'top')), 
            getStyle(aLi[i], 'opacity') * 100, 
            getStyle(aLi[i], 'zIndex'), 
            oImg.width
        ]);
    }
    
    function getStyle(obj, attr) {
        if (obj.currentStyle) {
            return obj.currentStyle[attr];
        }
        else {
            return getComputedStyle(obj, false)[attr];
        }
    }
    

    getStyle这个封装太有年代感了,DOM编程必备的,之所以封装也是为了解决兼容性问题。

    接着点击按钮的时候只需要切换数组中元素的顺序就可以啦。点击想做的时候,将数组的第一个元素放在了数组尾部,并且删除了第一个,来实现交换位置。

    然后还得循环来修正每一个标签对应的样式。这里还封装了一个move方法来实现运行效果。那时候基本都是先写代码,写完之后找相似的功能封装函数,再替换,效率真的低。

    oPrevDiv.onclick = function () {  //左
    
    	arr.push(arr[0]);
    	arr.shift();
    
    	for (var i = 0; i < aLi.length; i++) {
    
    		var oImg = aLi[i].getElementsByTagName('img')[0];
    		// 当前li的index属性修改,index是不支持做动画的。
    		aLi[i].style.zIndex = arr[i][3];
    		// 处理
    		move(aLi[i], { left: arr[i][0], top: arr[i][1], opacity: arr[i][2] });
    		// 处理img
    		move(oImg, { width: arr[i][4] });
    
    	}
    
    };
    
    oNextDiv.onclick = function () {  //右
    	arr.unshift(arr[arr.length - 1]);
    	arr.pop();
    
    	for (var i = 0; i < aLi.length; i++) {
    
    		var oImg = aLi[i].getElementsByTagName('img')[0];
    
    		aLi[i].style.zIndex = arr[i][3];
    
    		move(aLi[i], { left: arr[i][0], top: arr[i][1], opacity: arr[i][2] });
    		move(oImg, { width: arr[i][4] });
    	}
    };
    

    move函数接收两个参数,第一个是要操作的DOM元素,第二个是要操作的的属性。

    进入函数的时候我们首先会清空一次定时器,避免重复调用,然后再定义一个定时器setInterval,那时候真的很喜欢setInterval直到后来清楚了他的问题才慢慢转向setTimeout, 也没有什么requestAnimationFrame。

    定时器里面就是改变每个属性的值,每次改动一点,直到改动完成,通过这样的方式来实现动画。

    function move(obj, json) {
    
    	clearInterval(obj.timer);
    
    	obj.timer = setInterval(function () {
    
    		var bBtn = true;
    
    		for (var attr in json) {
    
    			var iCur = 0;
    
    			if (attr == 'opacity') {
    				if (Math.round(parseFloat(getStyle(obj, attr)) * 100) == 0) {
    					iCur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
    
    				} else {
    					iCur = Math.round(parseFloat(getStyle(obj, attr)) * 100) || 100;
    				}
    			} else {
    				iCur = parseInt(getStyle(obj, attr)) || 0;
    			}
    
    			var iSpeed = (json[attr] - iCur) / 8;
    			iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
    			if (iCur != json[attr]) {
    				bBtn = false;
    			}
    
    			if (attr == 'opacity') {
    				obj.style.filter = 'alpha(opacity=' + (iCur + iSpeed) + ')';
    				obj.style.opacity = (iCur + iSpeed) / 100;
    
    			} else {
    				obj.style[attr] = iCur + iSpeed + 'px';
    			}
    		}
    		if (bBtn) {
    			clearInterval(obj.timer);
    		}
    	}, 30);
    }
    

    move函数是单独写在一个js文件里的,然后在html里面直接script进来,所有的变量都是全局变量才行,不然真的找不到,哈哈哈哈,根本没有什么模块化的概念。

    满满的回忆,时间太快了,前端变化也太快了,我的青春啊!

    自取链接: github.com/xiaoyindong…


    起源地下载网 » 一款几年前的轮播图|满满的兼容性味道

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元