`
lcyangily
  • 浏览: 21811 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

自己写的一个javascript首页图片切换组件

阅读更多

      在平时做网站的过程中,最常用的一个组件就是首页的图片切换,网上有很多可以下载的Flash插件,jquery插件,但是有时又很难找到适合自己的,有时候是不是想自己动手写个组件? 那样以后有什么自己个性的功能好自定义。怀着这样的心理我也开始动手写了自己的一个js组件,不依赖任何库,最原生的js语法,里面少量的用了一些js高级属性:闭包。希望对js初学者有一定的帮助,代码写的不好也希望大家能指出更正。谢谢。

 

/**

*  定义一个生成类模板,生成的类,

*  每次实例化后自动调用init方法

*/

var Class = window.Class = {

create: function() {

function kclass(obj) {

if(this.init){

this.init(obj); 

};

}

kclass.prototype.constructor = kclass;

return kclass;

},

emptyFn:function(){}

}

 

/*** 类的继承方法 ***/

Object.extend = function(destination, source) {

for (var property in source) {

   destination[property] = source[property];

}

return destination;

};

 

/**

* 绑定函数到一个指定对象***********

*/

Function.prototype.bind = function() {

 

if (arguments.length < 2 && arguments[0] === undefined) return this;

var __method = this, args = $A(arguments), object = args.shift();

return function() {

return __method.apply(object, args.concat($A(arguments)));

}

}

 

以上是prototype框架里常用的一些基础方法,个人觉得很好,就拿来使用了^_^!

 

/**定义一个名字,类似于jQuery的jQuery、$ 变量,写自己的js框架最好是这样

  *全局只有一个你定义的变量,因为全局变量越少越好!

  */

var Lcy = window.Lcy = {};

 

//以下就是实现的主要代码了,一坨一坨的,希望大家能耐心看。呵呵

 

 

/**

* @author liuchuanyang

* @Date 2012-6-7 

* @首页图片切换

*/

Lcy.PicViewTrans = Class.create();

 

Lcy.PicViewTrans.prototype = {

    constructor : Lcy.PicViewTrans,

    init : function(option) { //初始化方法,类似于java类的构造函数

        var opts = this._opts = Object.extend(this.defaults, option||{});

        if(!opts.target) {

            return;

        }

 

        this._element = typeof opts.target == 'string' ? document.getElementById(opts.target) : opts.target;

        var uls = this._element.getElementsByTagName("ul");

        for(var i = 0; i < uls.length; i++) {

            if(uls[i].className === 'slider') {

                this._slider = uls[i];

                break;

            }

        }

 

        if(!this._slider) {

            return;

        }

 

        this._opts.index = 0;    //当前图片索引

        this._opts.count = this._slider.getElementsByTagName("li").length; //切换图总数

 

        //alert("opts.direct : " + opts.direct);

        if(opts.direct === 'left' || opts.direct === 'right') {

            this._slider.style.width = parseInt(this._element.offsetWidth) * opts.count + 100 + "px";

        } else if(opts.direct === 'up' || opts.direct === 'down') {

            //alert("up or down");

            this._slider.style.width = parseInt(this._element.offsetWidth) + "px";

        }

 

        var lis = this._slider.getElementsByTagName("li");

        for(i = 0; i < lis.length; i++) {

            lis[i].style.width = parseInt(this._element.offsetWidth) + "px";

            lis[i].style.height = parseInt(this._element.offsetHeight) + "px";

 

            if(opts.fit) {

                var img = lis[i].getElementsByTagName("img")[0];

                img.style.width = parseInt(this._element.offsetWidth) + "px";

                img.style.height = parseInt(this._element.offsetHeight) + "px";

            }

        }

 

        //创建分页,就是图片切换右下角的1,2,3,4,5数字了

        var ulObj = document.createElement("ul");

        var pages = new Array();

        ulObj.className = "num";        

        for(i = 0; i < opts.count; i++) {

            var liObj = document.createElement("li");

            liObj.innerHTML = i+1;

            ulObj.appendChild(liObj);

            pages.push(liObj);

 

            //liObj.onmouseover = this.start.bind(this);

            liObj.onmouseover = function(t){

                var idx = i;

                var that = t; //这样写var that = this,为错!因为匿名函数又绑定到全局了.注意!this变了

                return function(){

                    clearTimeout(that._timer);

                    that._opts.index = idx;

                    that.start();

                }

            }(this);

        }

        this._element.appendChild(ulObj);

        this._pages = pages;

 

        this.start();

 

    },

 

    //每次切换前的准备,包括: 转移到哪位图,目标位置。

    start : function() {

 

        var opts = this._opts;

        if(opts.index >= opts.count || opts.index < 0) {

            opts.index = 0;

        }

 

        //更改分页page 样式

        this.changePageStyle();

 

        opts.targetPos = 0; //本次切换图片的最终位置

        if(opts.direct === 'left' || opts.direct === 'right') {

            opts.targetPos = -1*this._element.offsetWidth * opts.index;

        } else if(opts.direct === 'up' || opts.direct === 'down') {

            opts.targetPos = -1*this._element.offsetHeight * opts.index;

        }

 

        //执行用户自定义函数

        if(typeof this._opts.changeStart == 'function') {

            this._opts.changeStart();

        }

 

        this._timer = setTimeout(this.move.bind(this), opts.time);

 

    },

 

    move : function() {     //

        var opts = this._opts;

        clearTimeout(this._timer);

        var curPos = 0;     //当前位置

        var style = '';

        if(opts.direct === 'left' || opts.direct === 'right') {

            style = "left"

        } else if(opts.direct === 'up' || opts.direct === 'down') {

            style = "top";

        }

        curPos = parseInt(this._slider.style[style]) || 0;

 

        var iStep = getStep(opts.targetPos, curPos);

        if(iStep != 0) {    //还在移动  

            this._slider.style[style] = (curPos + iStep) + "px";

            this._timer = setTimeout(this.move.bind(this), opts.time);

        } else { //本次切换已经完成

            //alert(this.targetPos);

            if(typeof this._opts.changeStop == 'function') {

                this._opts.changeStop();

            }

            this._slider.style[style] = this._opts.targetPos + "px";

            opts.index++;

            if(opts.auto) {

                this._timer = setTimeout(this.start.bind(this), opts.pause);

            }

        }

 

        //获得一次移动的距离

        function getStep(iTargetPos, iCurPos) {

            var istep = (iTargetPos - iCurPos) / opts.step;

 

            if(istep == 0) return 0;

            if(Math.abs(istep) < 1) {

                return istep > 0 ? 1 : -1;

                //return 0;

            }            

            return istep;

        }

 

    },

 

    stop : function() {

 

    },

 

    changePageStyle : function() {

        var opts = this._opts;

        for(var i = 0; i < this._pages.length; i++) {

            this._pages[i].className = "";

        }

        this._pages[opts.index].className = "current";

    },

 

 

    //图片切换默认属性

    defaults: {

        direct:'left',      //图片滑动方向. left-向左, right-向右, up-向上, down-向下

        fit: false,         //图片长宽是否强制适合窗口大小

        auto: true,         //是否自动切换

        pause: 2000,        //停顿时间(auto为true有效)

        step: 5,            //滑动变化速度

        time: 10,           //滑动延时

        changeStart: function(){},  //开始转换时执行

        changeStop:function(){}     //完成转换时执行

    }

}

 

 

以上是实现代码了,下面就是使用了!

<!-- html页面上需要图片切换的地方,aaa.jpg/bbb.jpg/ddd.jpg三张图片切换 -->

 

<div class="container" id="container">

    <ul class="slider">

        <li><a href="http://www.youll.cn" target="_blank"><img src="aaa.jpg"/></a></li>

        <li><a href="http://www.youll.cn" target="_blank"><img src="bbb.jpg"/></a></li>

        <li><a href="http://www.youll.cn" target="_blank"><img src="ddd.jpg"/></a></li>

    </ul>

</div>

 

<script language="javascript">

//这就是调用的地方了!自定义的东西很多,很多可以使用默认值的。

 

new Lcy.PicViewTrans({
        target : 'container',
        fit: true,
        direct: 'left',
        step: 10,            //滑动变化速度
        time: 10,            //滑动延时
        changeStart: function() {
            //alert(111);
        },
        changeStop: function(){
            //alert(222);
        }
    });
</script>

 

还有最重要的东西就是样式了,没有样式只有js也是白搭哦。

 

/** 首页图片切换 **/

.container, .container *{margin:0; padding:0;}

.container {width:510px; height:300px; overflow:hidden;position:relative;float:left;z-index:1}

.container ul.slider{position:absolute;width:2000px;}

.container ul.slider li{ list-style:none;float:left;display:inline;width:408px; height:168px;}

.container ul.slider li a img{border:none;}

.container .num{ position:absolute; right:5px; bottom:5px;}

.container .num li{

    float: left;

    text-align: center;

    cursor: pointer;

    overflow: hidden;

    margin: 3px 2px;

    background-color: #fff;

    width: 20px;

    height: 20px;

    line-height:20px;

    border-radius: 20px;

    color: #DE7D4B;

    display: list-item;

    font-family: tahoma, arial;

    font-size: 13px;

 

    /*透明度-兼容所有浏览器*/

    filter:alpha(opacity=70);  

    -moz-opacity:0.7;

    -khtml-opacity: 0.7;

    opacity: 0.7;

}

.container .num li.current{

    color: #fff;

    border: 0;

    font-weight: bold;

    background-color: #F60;

    color: white;

    filter: none;

    font-weight: bold;

 

    /*透明度-兼容所有浏览器*/

    filter:alpha(opacity=100);  

    -moz-opacity:1;

    -khtml-opacity: 1;  

    opacity: 1;

}

 

这就是图片切换的所有代码了。如果有兴趣可以拿去用,无图无真相!上图:

 

 

 

 

  • 大小: 78.8 KB
  • 大小: 66.9 KB
1
6
分享到:
评论
2 楼 lcyangily 2012-08-23  
haibin_gl 写道
不错,图片是自己处理的么?

图片是随便下的,如果想看使用效果可以到这里 http://www.youll.cn
1 楼 haibin_gl 2012-08-23  
不错,图片是自己处理的么?

相关推荐

    【JavaScript源代码】vue卡片式点击切换图片组件使用详解.docx

     本文实例为大家分享了vue卡片式点击切换图片组件,供大家参考,具体内容如下 因为公司业务的问题,最近在写vue项目,有了一个卡片图片的点击的需求,自己又不想写动画效果,就偷个懒,采用vue是以数据驱动的原理...

    一个javascript图片阅览组件

    就是图片切换的效果是可自定义的,通过这个组件,我们可以自定义出很多效果,不过这个东西还不算最终完成,现在搞出来先让大家试试 代码如下: var pola=new PhotoLook(“contain”);//建立PhotoLook对象 这就是实例...

    JavaScript实现图片轮播组件代码示例

    本篇文章主要介绍了JavaScript实现图片轮播组件代码示例,对图片轮播效果感兴趣的小伙伴们可以参考一下。

    【JavaScript源代码】vue实现tab路由切换组件的方法实例.docx

    vue实现tab路由切换组件的方法实例  前言 本文介绍的是使用vue自带的vue-router.js路由实现分页切换功能,下面话不多说了,来一起看看详细的实现代码吧 实现图片如下 下列为实现代码 css: *{ margin: 0; ...

    原生js图片画廊组件之点击小图弹出大图并可左右切换

    原生js写的点击小图列表中的任意小图可弹出对应的大图,并支持点击左右按钮切换大图,也支持设置是否显示大图的分页控件。

    wx-statuslayout:微信小程序页面状态切换组件

    微信小程序页面状态切换组件, 如果对您有帮助的话, 就赏个star吧~ 效果图 自定义属性 rootStyle 根容器样式, 可用来设置组件宽高等 status 默认状态 emptyImage 无数据时的图片 emptyText 无数据时的文案 ...

    Android UI组件实例集合

    是 Android 上的一个异步从网络上获取图片并进行浏览的开源组件,可自动在本地进行缓存。该项目是 GreenDroid 的一部分。 13、仿Path按钮动画效果 PathButton 仿照Path应用首页左下角的Button动画效果写了个简单的...

    JavaScript网页特效范例宝典源码

    实例075 只有一个复选框时控制复选框的全选或反选 119 2.5 密码域 120 实例076 让您的密码域更安全 120 实例077 不提交表单自动检测密码域是否相同 121 2.6 表单应用 122 实例078 通过JavaScript控制表单的提交与...

    JavaScript娇娆向日葵

    First 场景,此场景只有一张图片,此图片与游戏包一起发布。是为了解决 IOS 进行远程加载时会出现短暂黑屏的问题 Welcome 公司 IP 形象宣传页动画 Loading 加载数据的过渡场景。 初始化云开发环境 获取 openId 获取...

    js组件SlotMachine实现图片切换效果制作抽奖系统

    下面就带着大家来看看这么一个神奇的组件——SlotMachine吧。 一、组件预览 先来一发简单的效果压压惊 觉得太简单?别急,好戏在后头,试试手气先。 什么?还没达到想要的效果,好!下面,真实效果来一发。 点击...

    jQuery easyUI 前端JavaScript框架 v1.2.3

    包括EasyUI.js核心文件、EasyUI.style样式对象、EasyUI.math.js数学对象、JSTweener.js缓动对象、EasyUI.color.js颜色对象、可扩展的附加组件等,含有大量的WEB前端TAB,滑动门,提示层,图片切换,幻灯片等特效,是...

    vue实现轮播图(滚动切换,无缝切换,自动切换,循环无回滚等)

    vue实现轮播图,实现滚动切换,无缝切换,自动切换,循环无回滚,暂停滚动等效果。适合初学者学习借鉴。对代码有疑问或者不懂的欢迎私信交流。

    EZUIKit-JavaScript-test:海康萤石云测试

    UIKit Javascript 使用说明 #demo_hk1是4个视频框 ...页面创建一个video标签 [若设置autoplay属性则默认自动播放] &lt;video id="myPlayer" poster="[这里可以填入封面图片URL]" controls playsInline webkit-p

    react-image-gallery:具有缩略图支持的React轮播图片库组件:framed_picture:

    React Carousel图片库 现场演示(尝试在移动设备上进行滑动支持) React Image Gallery是用于构建图像库和轮播的React组件 产品特点 手机滑动手势 缩略图导航 全屏支持 自定义渲染的幻灯片 RTL支持 响应式设计 大量...

    JavaScript-Example-100:100个JavaScript实战案例,适合初学者系统学习

    1.1图片切换 1.2模拟上传文件判断 1.3 QQ好友列表 1.4开灯关灯 1.5网易云课堂拖放菜单 1.6百度登录 1.7模拟QQ聊天 1.8网易选项卡切换 1.9拖拽原理 1.10可进行QQ聊天 1.11数码时钟 1.12图片自动播放 1.13京东轮播 ...

    微信小程序 swiper 组件遇到的问题及解决方法

    Swiper是纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端。...给这组件重新设置个高度,然后在把里面的图片设置为自动适应容器大小。图片模式设置为 宽度不变 自动适应高度 &lt;/swiper-

    JAVA上百实例源码以及开源项目源代码

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    v-viewer:vue的图片查看器组件,支持旋转、缩放、缩放等,基于viewer.js

    vue的图片查看器组件,支持旋转、缩放、缩放等,基于 例子 缩略图和来源 查看器回调 过滤图像 更改图像 中文文档 从 0.x 迁移 您需要做的唯一更改是手动导入.css文件: import 'viewerjs/dist/viewer.css' 安装...

    JAVA上百实例源码以及开源项目

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

Global site tag (gtag.js) - Google Analytics