js实现炫酷的左右轮播图
作者:秋天1014童话 发布时间:2024-04-22 22:31:40
标签:js,轮播
本文实例为大家分享了js左右轮播图的具体代码,供大家参考,具体内容如下
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta keyword="左右轮播图-效果比较好">
<title>Document</title>
<link rel="stylesheet" type="text/css" href="css/css.css">
<script type="text/javascript" src="js/animate.js"></script>
<script type="text/javascript" src="js/slider.js"></script>
</head>
<body>
<div class="w-slider" id="js_slider">
<div class="slider">
<div class="slider-main" id="slider_main">
<div class="slider-main-img"><a href="#"><img src="images/1.jpg" alt=""></a></div>
<div class="slider-main-img"><a href="#"><img src="images/2.jpg" alt=""></a></div>
<div class="slider-main-img"><a href="#"><img src="images/3.jpg" alt=""></a></div>
<div class="slider-main-img"><a href="#"><img src="images/4.jpg" alt=""></a></div>
<div class="slider-main-img"><a href="#"><img src="images/5.jpg" alt=""></a></div>
<div class="slider-main-img"><a href="#"><img src="images/6.jpg" alt=""></a></div>
</div>
</div>
<div class="slider-ctrl" id="slider_ctrl">
<span class="slider-ctrl-prev"></span>
<!-- <span class="slider-ctrl-con current"></span>
<span class="slider-ctrl-con"></span>
<span class="slider-ctrl-con"></span>
<span class="slider-ctrl-con"></span>
<span class="slider-ctrl-con"></span>
<span class="slider-ctrl-con"></span> -->
<span class="slider-ctrl-next"></span>
</div>
</div>
<script>
</script>
</body>
</html>
主要css代码:
.w-slider{
width: 310px;
height: 265px;
background-color: pink;
margin: 100px auto;
position: relative;
overflow: hidden;
}
.slider{
width: 310px;
height: 220px;
}
.slider-main{
width: 620px; /* 两个图片的宽度 */
height: 310px;
}
.slider-main img{
vertical-align: top; /* 消除图片上下3px的间隙 */
}
.slider-main-img{
position: absolute;
top: 0;
left: 0;
}
.slider-ctrl{
text-align:center;
padding-top: 8px;
}
.slider-ctrl-con{
display: inline-block;
width: 24px;
height: 20px;
background-color: blue;
margin: 0 5px;
background: url(../images/icon.png) no-repeat -24px -782px;
cursor: pointer;
text-indent: -20em; /* 为了将span的标号隐藏掉 */
overflow: hidden;
}
.slider-ctrl .current{
background-position: -24px -762px;
}
.slider-ctrl-prev,.slider-ctrl-next{
position: absolute;
top: 50%;
margin-top: -35px;
display: inline-block;
width: 30px;
height: 35px;
background: url(../images/icon.png) no-repeat 6px top;
opacity: 0.8;
cursor: pointer;
}
.slider-ctrl-prev{
left: 0;
}
.slider-ctrl-next{
right: 0;
background-position: -6px -44px;
}
主要js代码(slider.js):
window.onload = function(){
function $(id){ return document.getElementById(id);}
var js_slider = $("js_slider");
var slider_main = $("slider_main"); //获取轮播图片的父盒子
var imgs = slider_main.children; //得到图片组
var slider_ctrl = $("slider_ctrl"); //获取控制的 父盒子
//生成控制轮播的span
for(var i = 0; i< imgs.length; i++){
var span = document.createElement("span");
span.className = "slider-ctrl-con";
span.innerHTML = imgs.length - i;
slider_ctrl.insertBefore(span,slider_ctrl.children[1]);
}
var spans = slider_ctrl.children;
spans[1].setAttribute("class","slider-ctrl-con current"); //设置第一个span增加current样式
//布局图片,第一张在正确位置,其余的在右边
var scrollWidth = js_slider.clientWidth; //获取大盒子的宽度,也就是后面动画走的距离
for(var i=1; i<imgs.length; i++){ //第一张图片在正确位置
imgs[i].style.left = scrollWidth + "px"; //其余图片在310px的位置
}
//遍历三个按钮--左、右和下面的span
var iNow = 0; //设置当前显示的图片的索引号
for(var k in spans){ //k是索引号
spans[k].onclick = function(){
if(this.className == "slider-ctrl-prev"){
//当前图片右移(从0 -> 310px)
animate(imgs[iNow],{left: scrollWidth});
iNow = --iNow < 0 ? imgs.length-1 : iNow;
imgs[iNow].style.left = -scrollWidth + "px";//快速执行,即将显示的一页立马走到左边,然后显示
animate(imgs[iNow],{left:0}); //下一张图片右移,从-310px->0
setSquare();
}else if(this.className == "slider-ctrl-next"){
//当前图片左移(从0 -> -310px)
animate(imgs[iNow],{left: -scrollWidth});
iNow = (++iNow) % imgs.length;
imgs[iNow].style.left = scrollWidth + "px";//快速执行,即将显示的一页立马走到右边,然后左移显示
animate(imgs[iNow],{left:0}); //下一张图片左移,从310px->0
setSquare();
//或者精简为函数
/*autoPlay();*/
}else{
/*alert("点击了下面的span");*/
var clickIndex = this.innerHTML - 1;
if(clickIndex > iNow){
//做法等同于右侧按钮
animate(imgs[iNow],{left: -scrollWidth});
imgs[clickIndex].style.left = scrollWidth + "px";//快速执行,即将显示的一页立马走到右边,然后左移显示
}else if(clickIndex < iNow){
//做法等同于左侧
animate(imgs[iNow],{left: scrollWidth});
imgs[clickIndex].style.left = -scrollWidth + "px";//快速执行,即将显示的一页立马走到左边,然后显示
}
iNow = clickIndex;
animate(imgs[iNow],{left:0});
setSquare();
}
}
}
//控制span小方块的样式 函数
function setSquare(){
//下面的span样式清空,将iNow设置为current,注意是下面的span,不包含左右控制按钮
for(var i=1; i<spans.length-1; i++){
spans[i].className = "slider-ctrl-con";
}
spans[iNow+1].className = "slider-ctrl-con current"; //注意iNow是索引号,要加1
}
//设置定时器 ,和右侧按钮功能一致
var timer =null;
timer = setInterval(autoPlay,2000);
function autoPlay(){
animate(imgs[iNow],{left: -scrollWidth});
iNow = (++iNow) % imgs.length;
imgs[iNow].style.left = scrollWidth + "px";//快速执行,即将显示的一页立马走到右边,然后左移显示
animate(imgs[iNow],{left:0}); //下一张图片左移,从310px->0
setSquare();
}
//清除定时器
js_slider.onmouseover = function(){
clearInterval(timer);
}
//开启定时器
js_slider.onmouseout = function(){
clearInterval(timer); //要执行定时器,先清除定时器
timer = setInterval(autoPlay,2000);
}
}
缓动动画js代码:(animate.js)
//返回当前样式
function getStyle(obj,attr){ //obj对象,attr属性名
if(obj.currentStyle){ //ie等
return obj.currentStyle[attr];
}else{ //w3c
return window.getComputedStyle(obj,null)[attr];
}
}
function animate(obj,json,fn) { // 给谁 json
clearInterval(obj.timer);
obj.timer = setInterval(function() {
var flag = true; // 用来判断是否停止定时器 一定写到遍历的外面
for(var attr in json){ // attr 属性 json[attr] 值
//开始遍历 json
// 计算步长 用 target 位置 减去当前的位置 除以 10
// console.log(attr);
var current = 0;
if(attr == "opacity")
{
current = Math.round(parseInt(getStyle(obj,attr)*100)) || 0; //用户没有定义opacity,则返回undefined
console.log(current);
}
else
{
current = parseInt(getStyle(obj,attr)); // 数值,去除样式的 “px”
}
// console.log(current);
// 目标位置就是 属性值
var step = ( json[attr] - current) / 10; // 步长 用目标位置 - 现在的位置 / 10
step = step > 0 ? Math.ceil(step) : Math.floor(step);
//判断透明度
if(attr == "opacity") // 判断用户有没有输入 opacity
{
if("opacity" in obj.style) // 判断 我们浏览器是否支持opacity
{
// obj.style.opacity,//支持opacity-----opacity:0.3
obj.style.opacity = (current + step) /100;
}
else
{ // obj.style.filter = alpha(opacity = 30)
obj.style.filter = "alpha(opacity = "+(current + step)* 10+")";
}
}
else if(attr == "zIndex")
{
obj.style.zIndex = json[attr];
}
else
{
obj.style[attr] = current + step + "px" ;
}
if(current != json[attr]) // 只要其中一个不满足条件 就不应该停止定时器 这句一定遍历里面
{
flag = false;
}
}
if(flag) // 用于判断定时器的条件
{
clearInterval(obj.timer);
//alert("ok了");
if(fn) // 很简单 当定时器停止了。 动画就结束了 如果有回调,就应该执行回调
{
fn(); // 函数名 + () 调用函数 执行函数 暂且这样替代
}
}
},30)
}


猜你喜欢
- 本文实例讲述了go语言使用第三方包 json化结构体操作。分享给大家供大家参考,具体如下:前提条件:安装好操作系统对应的gitgo get
- 这种方案是通过对代码进行加密,然后利用C语音写解密的PHP扩展。破解难度会有提升,但依然是会被破解的。 从网上找过各种代码加密的开源方案。
- 在日常的开发中经常进行跨数据库进行查询数据。同服务器下跨数据库进行查询在表前加上数据库名就可以查询到数据。在数据超出服务器承载的时候,往往需
- 导语学习一下golang权限控制,保留一下demo代码作为参考Casbin是什么Casbin是一个强大的、高效的开源访问控制框架,其权限管理
- 在开发中中我们经常会使用到数据库连接池,比如dbcp数据库连接池,本章将讲解java连接dbcp数据库库连接池的简单使用。开发工具myecl
- 以行的形式读出一个文件最简单的方式是使用文件对象的readline()、readlines()和xreadlines()方法。Python2
- 文章略长,但比较简单。es6中的数组方法some()和every()都接收一个回调函数作为参数,该回调函数又接收三个参数,分别是数组元素、数
- 1. 概述Promise对象是ES6提出的的异步编程的规范。说到异步编程,就不得不说说同步和异步这两个概念。从字面意思理解同步编程的话,似乎
- 前言这里要说明一下,本文包含的代码其中一部分并不是自己写的,是我找了很多文章拼凑出来的,比如如何找相同内容的单元格、怎么合并、怎么居中等等。
- 我们可用如下代码进行监控:函数中使用了fso对象来读取文件属性。Function File_GetLastModifi
- 01 前言&&效果展示相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息。但微信又不能像QQ一样设置自动回
- 后台数据库用是Access,客户用了一年后说打开界面非常慢,查看了数据库后发现数据表中的记录已有五万多条,自己试过将记录复制到10 万条,打
- 使用cpan安装Net::SSH::Perl:cpan>install Net::SSH::Perl期间遇到了一些问题,记录在此,以备
- 一、设置主窗口# -*- coding: utf-8 -*-import tkinter from tkinter import ttkim
- Hello大家好,今天说一下python的socket编程,基于python的socket通信的文本框网络聊天首先,实验环境:一个云服务器(
- 目标:爬取自己账号中购买的课程视频。一、实现登录账号这里采用的是手动输入验证码的方式,有能力的盆友也可以通过图像识别的方式自动填写验证码。登
- 阅读上一篇教程:WEB2.0网页制作标准教程(10)自适应高度布局初步搭建起来,我开始填充里面的内容。首先是定义logo图片:样式表:#lo
- 序 号前 缀使用的变量/范围或数据类型1a or arrArray2b or blnBoolean3bytByte4
- Pythonpython 真的太好用了,但是它真的好慢啊(哭死) ; C++ 很快,但是真的好难写啊,此生能不碰它就不碰它。老天啊,有没有什
- 前言学习一门新的语言肯定是要从他的基本语法开始,语法构成了整个程序设计的基础,从语法中我们也可以看到这门语言的一些特性,但是话说回来,语法这