html+css+js 实现图片轮播效果

html+css+js 实现图片轮播效果

图片轮播效果:

  • 会自动 向左 || 向右 切换图片
  • 能手动点击按钮切换图片
  • 多用于商品展览等等
    在这里插入图片描述
    ——首先我们创建一个盒子进行展览,然后一个< ul>,< li>来存每张图片。
    话不多说,放 代码:
    HTML
<div id="banner">
			<ul id="ul">
				<li><a href="###"><img src="./images/dianyuan.jpg" /></a></li>
				<li><a href="###"><img src="./images/shouhuan.jpg" /></a></li>
				<li><a href="###"><img src="./images/mi4.jpg" /></a></li>
			</ul>
			<span id="left" onclick="left()">< </span>
			<span id="right" onclick="right()">></span>
			<ol id="ol">
				<!--由js动态生成<li>-->
			</ol>
		</div>

CSS
这里css的设置不算重要,大家根据我的注释看一下

#banner {
	height: 75%;
	width: 100%;
	overflow: hidden;
	position: relative;
}

#banner #ul {
	width: 6600px;		/*ul的宽度我们选择业让那个js动态生成,这样可以减少后期修改带来的麻烦*/
	height: 100%;
	position: absolute;
	left: -0350px;				/*因为我的图片比较大,所以为了能让内容居中,于是移了一些出去*/
	top: 0;
}

#banner li {
	float: left;			/*浮动,使所有图片排成一行*/
	width: 2200px;			/*设置每个li的宽度(根据自己的图片width进行选择)*/
	height: 100%;
}

#banner img {
	width: 100%;
	position: relative;
}
#banner #left , #banner #right{		/*两边的left、right按钮(<  >)*/
	width: 40px;
	height: 40px;
	position: absolute;
	left: 5px;
	top: 50%;
	margin-top: -20px;
	background-color: cadetblue;
	cursor: pointer;
	line-height: 40px;
	text-align: center;
	font-weight: bold;
	font-family: '黑体';
	font-size: 30px;
	color: #000;
	opacity: 0.5;
	border: 1px solid #fff;
}
#banner #right{
	right: 5px;
	left: auto;
}
#banner #left:hover , #banner #right:hover{
	opacity: 1;
	border-color: #000;
	color: #fff;
}
#banner #ol{				/*底部的图片精准选择按钮*/
	position: absolute;
	bottom: 10px;
	left: 50%;
}
#banner #ol li{
	border-radius: 45px;			/*令其呈圆形*/
	width: 15px;
	height: 15px;
	background-color: #CCCCCC;
	cursor: pointer;			/*鼠标呈 手 样式*/
	line-height: 20px;
	text-align: center;
	font-weight: bold;
	font-family: '黑体';
	font-size: 15px;
	color: #000;
	opacity: 0.5;				/*设置透明度*/
	border: 2px solid #333;
	float: left;
	margin: 0 10px;
}
#banner #ol li:hover{
	opacity: 0.8;
}
#banner #ol .now{				/*当前展示图片所对应的数字按钮(这个.now我们由js动态设置)*/
	opacity: 1;					/*不透明*/
	background-color: #333;
}

js部分 重头来啦~~~~~~~~~~~~~~~~~~~~

首先我们先进行对象成员的赋值

  • obj.offsetLeft:获取对象的left属性值(只读)
  • obj.offsetWidth:获取对象的width属性值(只读)
var ul = document.getElementById("ul");
var ol = document.getElementById("ol");
var li = ul.getElementsByTagName("li");
var li_width = li[0].offsetWidth;				//获得li的宽度
var left_start = ul.offsetLeft;			//获取当前第一张图片的left
ul.style.width=(li_width*li.length)+"px";

然后是对< ol> < li>的初始化创建

  • var one=setInterval(“right()”,3000)

    • setInterval() :方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
    • 返回一个可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。
    • 我们让它每过3秒就调用一次right()向右滑动
  • 我们在click的点击中先清除掉setInterval,再创建setInterval,这样可以让用户在选择是有足够的时间观看

var one=setInterval("right()",3000);			//setInterval() :方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。

for(var i=0 ; i<li.length ; i++){				//动态生成底部按钮数字按钮
	var ol_li=document.createElement("li");		//创建<li>标签
	ol.appendChild(ol_li);						//加入将ol_li加入到<ol>标签中
	ol_li.id=i+1;						//设置id,主要是方便后面的数字计算
	ol_li.onclick=function(){
		clearInterval(one);
		pic=this.id;
		ul.style.left = (left_start - (pic-1) * li_width) + "px";	//点击那个li就会跳转到那张图片
		change();			//见下文
		one=setInterval(right,3000);	//前面取消了周期时间one,现在又把它开启,后面也会有这种操作,主要是为了使用方便
	}
}

这里我们设置了一下逻辑功能,以及change()方法

  • pic:这里用来关联当前所展示的图片
  • obj.className:设置标签的class名称,设置完毕后会被css所更改相应样式
var pic=1;
var last=document.getElementById(pic);	//定义last变量指向一个li标签
last.className="now";  //在css中我已经将class为now的样式设置为特殊设置,是为了突出

function change(){				//“改变”方法:动态设置当前显示的图片所对应按钮的格式
	last.className=" ";			//清除上一个的格式
	document.getElementById(pic).className="now";	//为当前li添加className(需要css配合使用.now{设置格式})
	last=document.getElementById(pic);		//更新last
}

接下来就是最重要的部分了left()与right()

  • 这里我自认为注释已经写得很全了,哈哈哈哈,若有那里不清楚的欢迎评论
  • 这里主要就是一些逻辑的部分,利用几个属性来回改变< ull>的left
    • left值越少,就越到后面的图片
ul.style.transition="left 0.5s, right 0.5s";	//为图片轮播效果加一个transition过渡动画,当然是为了更好看啦

function left() {			//向左按钮
	clearInterval(one);							//先暂停
	/*if (ul.offsetLeft > left_start - li_width) {	//考虑到当前图片已经是第一张,点击left按钮就跳向最后一张 */ 
	// 这种方法出了Bug
	if(pic == 1){
		ul.style.left = (left_start - (li.length - 1) * li_width) + "px";
		pic=li.length;			//li.length就相当于是最后一张图片的id了(见前面这只id部分)
	} else {
		ul.style.left = (ul.offsetLeft + li_width) + "px";
		pic--;				//向前翻一张,当然就减一了
		// alert(ul.offsetLeft);
	}
	change();			//每次改变是都调用change()函数
	one=setInterval(right,3000);				//重新开始周期调用
}

function right() {			//向右按钮
	clearInterval(one);
	/* if (ul.offsetLeft < left_start - (li.length - 2) * li_width) {//考虑到已经是最后一张的情况,跳向第一张 */
	if(pic == li.length){
		ul.style.left = (left_start) + "px";
		pic=1;
	} else {
		ul.style.left = (ul.offsetLeft - li_width) + "px";
		pic++;
		// alert(ul.offsetLeft);
	}
	change();				//调用改变函数
	one=setInterval(right,3000);
}

好了,码字不易,欢迎 点赞 评论

在这里插入图片描述
在这里插入图片描述

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TryMyBestTo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值