使用js制作完整轮播图 (解决最后一张切换到前面一张的动画问题)

使用js制作完整轮播图 (解决最后一张切换到前面一张的动画问题)

首先先做好界面部分 使所有的图片浮动到一行中, 然后overflow:hidden; 清除溢出
需要动的部分需要添加定位

用户看到的轮播效果就是 改变图片的偏移量,使其滚动,添加定时器使其自动播放
没有用over'flow: hidden;预览图
预览图

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="tools.js"></script> //自己封装了一个函数  下面给出了这个tools
		<style type="text/css">
			*{
				margin: 0px;
				padding: 0px;
			}
			#banner{
				
				width: 610px;
				height: 470px;
				margin:70px auto;
				padding: 10px 0px;
				/* background-color: #00FFFF; */
				position: relative;
				left: 0px;
				overflow: hidden;
				
			}
			#imagesL{
				/* width: 3100px; */
				list-style: none;
				position: absolute;
				left: 0;
			}
			#imagesL li{
				float: left;
				margin: 0px 10px;
			}
			#nav{
				position: absolute;
				bottom: 15px;
			}
			#nav a{
				float: left;
				width: 15px;
				height: 15px;
				background-color: white;
				border-radius: 50%;
				margin: 0 5px;
				opacity: 0.5;
				filter: alpha(opacity=50);/* 兼容IE8 */
				
			}
			#nav a:hover{
				background-color: #000000;
			}
		</style>
	</head>
<body>
		<div id="banner">
			<ul id="imagesL">
				<li><img src="images/1.jpg" alt=""></li>
				<li><img src="images/2.jpg" alt=""></li>
				<li><img src="images/3.jpg" alt=""></li>
				<li><img src="images/4.jpg" alt=""></li>
				<li><img src="images/5.jpg" alt=""></li>
				<li><img src="images/1.jpg" alt=""></li>
			</ul>
			<div id="nav">
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
			</div>
		</div>
			
	</body>
</html>

这是界面部分
需要注意的问题是在浮动的时候父元素的宽度一定要足够 应该等于下面的图片的宽度加上他的边距的和
这里我采用的是 使用js动态计算宽度 包括图片下方的小圆点也采用的js实现
至于图片为什么是6张 这个是为了解决第五张到第一张的切换问题,下面会详细讲到

js部分

可以实现的功能
	 1、自动播放
	 2、当鼠标放在图片上时停止播放 离开继续播放
	 3、使用下面的小圆点 点击切换 并且 不合自动播放冲突
	<script type="text/javascript">
			window.onload = function(){
				var imagesL = document.getElementById("imagesL");
				var imagesAL = document.getElementsByTagName("img");
				imagesL.style.width = 610*imagesAL.length + "px";//动态计算父盒子的宽度
				var banner = document.getElementById("banner");
				var nav = document.getElementById("nav");
				nav.style.left = (banner.offsetWidth - nav.offsetWidth)/2 + "px"; //计算小圆点的位置 使小圆点居中
				var allA = document.getElementsByTagName("a");
				var index = 0;
				allA[index].style.backgroundColor = "black";
				var timer;
				for(var i = 0; i < allA.length; i++){ //单击小圆点 切换图片
					allA[i].num = i;
					allA[i].onclick = function(){
						clearInterval(timer);
						index = this.num;
						// alert(this.num);
						// imagesL.style.left = -610*index + "px";
						setA(); 当鼠标放到小圆点上时改变颜色 切换后改变小圆点的颜色
						move(imagesL, "left", 30, -610*index, function(){ //点击后继续自动播放
							autoChange();
						});
					}
				}	
				
				imagesL.onmouseover = function(){
					clearInterval(timer);
				} //鼠标停在图片上时 轮播动画停止
					
				imagesL.onmouseout = function(){
					autoChange();
				} // 鼠标离开图片时轮播动画继续播
				autoChange();  //开启自动播放
				function setA(){    //关于小圆点颜色变化的函数
					 if(index >= imagesAL.length - 1){
							index = 0;
							imagesL.style.left = 0;  // 使第六张 瞬间变为第一张,直接修改lef为0
							
						}
					for(var i=0 ;i<allA.length; i++){
						allA[i].style.backgroundColor = "";//为了正常显示内联样式表的hover  只显示 样式表里的颜色
					}
					allA[index].style.backgroundColor = "black";
				}
				function autoChange(){ //自动播放函数
					timer = setInterval(function(){
						index ++;
						move(imagesL, "left", 3, -610*index, function(){
							setA(); //在刚播完第六张 瞬间切换到第一张  第六张与第一张是同一张图片
						});					
					},3500);
				}	
			}
		</script>
function move(obj,attr,speed,target,callback){ //封装的函数为tools 功能为实现 元素的动态移动
					var current = parseInt( getStyle(obj,attr)); //转化为数字计算
					if(current > target) speed = -speed; 
					clearInterval(obj.timer); //清除计时器的累加
					obj.timer = setInterval(function(){  //把timer添加到obj中使动画执行不冲突
						
						var oldvalue = parseInt( getStyle(obj,attr));
						var newvalue = oldvalue + speed	;
						if(speed < 0 && newvalue < target || speed > 0 && newvalue > target){ //速度小于0 并且newvalue < target向左移
							newvalue = target;
						}
						obj.style[attr] = newvalue + "px";
						if(newvalue == target){
							clearInterval(obj.timer);
						callback && callback(); //回调函数 判断是否有这个有则执行 没有的话不影响该函数的执行
						}
					},3);
				}
				function getStyle(obj,name){ // 获取元素样式的函数 
					if(window.getComputedStyle){  //判断浏览器
						return getComputedStyle(obj,null)[name];
					}
					else{
						return box.currentStyle[name];
					}
				}

最后一张切换到第一张 这里应用了一个技巧
如果有5张图片
添加第六张图片 让第六张图片与第一张图片相同(由于我上面求父盒子宽度使用的js动态添加的所以不需要再考虑父盒子宽度不足的问题) 当播到第六张(与第一张相同)使第六张 瞬间变为第一张,直接修改left为0,这就实现了第六张与第一张 和谐切换

这次的轮播图 用到了封装好的 tools工具 和一个getStyle()函数
这个可以参考我写的
getStyle()点击进入

如果想使用此轮播图 里面的图片及大小需要自己更改

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现这个效果的基本思路是在每张轮播图上添加一个利益点图片,然后在切换轮播图时,利益点图片执行滑出动画。 具体实现步骤如下: 1. 在每张轮播图上添加一个利益点图片,可以使用绝对定位来定位图片的位置。 2. 利用CSS3动画实现利益点图片的滑出动画。可以使用translateX属性来实现水平移动的效果。设置利益点图片的初始位置,然后通过动画效果将其移动到目标位置。具体的动画代码可以参考如下: ``` @keyframes slide-out { 0% { transform: translateX(0); } 100% { transform: translateX(100%); } } 利益点图片的CSS代码可以设置如下: .benefit-image { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); animation: slide-out 1s ease-in-out; } ``` 3. 在轮播图切换时,利用JavaScript控制利益点图片的显示和隐藏。可以在轮播图切换时,先将当前轮播图上的利益点图片隐藏,然后再显示下一张轮播图上的利益点图片并执行滑出动画。 具体的JavaScript代码可以参考如下: ``` // 获取轮播图容器和利益点图片 var carousel = document.querySelector('.carousel'); var benefitImages = carousel.querySelectorAll('.benefit-image'); // 切换轮播图时隐藏当前轮播图上的利益点图片 function hideCurrentBenefitImage() { var currentSlide = carousel.querySelector('.active'); var currentBenefitImage = currentSlide.querySelector('.benefit-image'); if (currentBenefitImage) { currentBenefitImage.style.display = 'none'; } } // 显示下一张轮播图上的利益点图片并执行滑出动画 function showNextBenefitImage() { var nextSlide = carousel.querySelector('.next'); var nextBenefitImage = nextSlide.querySelector('.benefit-image'); if (nextBenefitImage) { nextBenefitImage.style.display = 'block'; } } // 切换轮播图时执行动画 carousel.addEventListener('slid.bs.carousel', function () { hideCurrentBenefitImage(); showNextBenefitImage(); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值