js实现图片联动效果

一.实现理论基础:

(1)使用定时器setInterval(),完成动画效果;

(2)使用json传值,实现多个属性同时动画效果(比如:宽度,高度,透明度等可以一起进行动画效果);

(3)使用回调函数,实现链式动画(就是宽度值增大到目的值,然后继续宽度值减小的变化);

(4)使用目标值减去初始值除以一个值(比如10),得到每次变化的增量,可以使得动画效果从初始值到目标值有个过度的过程,以不同的增量进行变化,而不是瞬间完成。

speed=(json[attr]-curr)/10

(5)使用一个标志位flag,来控制当所有的动画效果都已经完成才清除此次动画效果的定时器,否则继续进行定时器的操作,完成动画效果。

二.Html框架

很简单,就一个父容器,包裹着几张图片。

<div id="container">
    <div id="list" >    
        <img src="../img/demo1.jpg" alt="1"/>
        <img src="../img/demo2.jpg" alt="2"/>
        <img src="../img/demo3.jpg" alt="3"/>
        <img src="../img/demo4.jpg" alt="4"/>
        <img src="../img/demo5.jpg" alt="5"/>      
    </div>
   
</div>

三.js实现

window.onload = function () {
 
    var list = document.getElementById(‘list‘);
    var listI = list.getElementsByTagName(‘img‘);
    //给每一张图片添加事件绑定
    for (var i = 0; i < listI.length; i++) {
 
        listI[i].addEventListener("mouseover", function () {
            change(this);
        }, false);
 
    }
 
    //鼠标移出list区域,图片回到初始时的宽度200
 
    list.addEventListener("mouseout", function () {
        for (var i = 0; i < list.children.length; i++) {
            startMove(list.children[i], {
                "width": "200",
                "opacity": "70"
            }, 50);
        }
    }, false);
 
 
    //当鼠标移过图片时,让焦点没在其他图片上的图片宽度变为100px,透明度变为0.7,而鼠标移动到的那张图片宽度变为600
 
    function change(obj) {
 
        var children = obj.parentNode.children; //为了获得其他img的兄弟节点   
 
        for (var j = 0; j < children.length; j++) {
            if (obj != children[j]) {
                startMove(children[j], {
                    "width": "100",
                    "opacity": "70"
                }, 50, startMove(obj, {
                    "width": "600",
                    "opacity": "100"
                }, 50));
            }
        }; 
    }
 
}
//进行js运动效果的函数
 function startMove(obj, json, interval, fn) {
    clearInterval(obj.timer); //该对象每次开始动画,都先停止掉正在进行的计数器,以免发生计数器运动速度会不断增快的效果。
    var flag; //用来表示所有运动是否到达目标值
    //开启定时器,每隔Interval时间段执行相应动作
    
    obj.timer = setInterval(function () {
        flag = true; //进入定时器时,现将flag设置为所有的属性都已达到目标值
        //获取传过来的Json值(需要变化的属性,因为要同时执行多属性,所以这里使用了json传值)。
        for (var attr in json) {
 
            var curr = 0;//用来获得当下的属性值
            //判断所传递的属性是否为透明度
            if (attr == ‘opacity‘) { //如果是透明度,则获取该对象此刻的透明度值
 
                curr = Math.round(parseFloat(getStyle(obj, attr)) * 100);
            } else { //否则,获取该属性的当下其他属性值
                curr = parseInt(getStyle(obj, attr));
            }
            //进行运动的速度处理
            var speed = 0;
            speed = (json[attr] - curr) / 10; //每次速度变化的增量,每次实时的获得,可以达到变速运动
            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); //速度增量大于0,向上取整,速度增量小于0,向下取整
            if (curr != json[attr]) { //当随着属性值还不等于要达到的目标值,就将flag设置为false;
                flag = false;
            }
            //进行运动变化
            if (attr == ‘opacity‘) {
                obj.style.filter = ‘alpha(opacity:‘ + (curr + speed) + ")";
                obj.style.opacity = (curr + speed) / 100;
            } else {
                obj.style[attr] = curr + speed + ‘px‘;
            }
        }
 
 
        if (flag) { //如果flag值为true,说明传来的属性值,都已经变化到目标值,就可以清除计数器,
            //同时在检查是否有回调函数传入,若有就继续执行回调函数。
            clearInterval(obj.timer);
            if (fn) {
                fn();
            }
        }
    }, interval);
}
//获得样式函数 
function getStyle(element, attr) {
    var value;
    if (typeof window.getComputedStyle != ‘undefined‘) { //非IE下获得属性的方法
        value = window.getComputedStyle(element, null)[attr];
    } else if (typeof element.currentStyle != ‘undefined‘) { //IE下获得属性的方法
        value = element.currentStyle[attr];
    }
    return value;
 
}

四,效果图

当鼠标移入图片内,移入的该张图片进行宽度增加,透明度增加,其他几张宽度稍微变小一点,如图:

这样,整个过程的滑动就实现了图片的联动效果,看起来很漂亮。

时间: 2024-08-28 09:46:35

js实现图片联动效果的相关文章

JS中图片飞飞效果

当鼠标在界面上移动的时候,后面有一连串的图片跟随者一起飘动,效果如下: 实现的基本思想:准备五个img标签,为了方便控制都放在一个div里面,设置div的定位方式为 fixed,设置成这中定位方式主要是为了解决在页面出现滚动条的情况下,图片还能够跟随鼠标移动.然后再鼠标移动的时候,延时给每一个图片设置定位的left和top距离就OK了.HTML和CSS代码如下: 1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <head

原生JS编写图片切换效果和点击按钮的样式变化

这两天更进一步的了解了JS,老师让我们用原生的js编写图片切换和改变点击按钮样式,就是让我们学会怎么去把一个问题拆分,怎么将一个大问题拆分成许多的小问题,再用函数封装起来.比如一个点击按钮,让其点击时背景色发生改变,点击另一个时,上一个按钮要变回原来本有的颜色:这个问题用jquery,一行代码就搞定,但是用原生js就得分三个部分来考虑: 1.添加改变背景的样式. 2.怎么获取到除了当前点击的按钮以外其他的兄弟节点. 3.怎么去除按钮的样式属性. 也讲了事件委托,实现了可以删除新添加的元素的功能.

JS制作图片手风琴效果

使用JS写出 图片的手风琴效果 第一种:浮动版本的手风琴效果,并不推荐,因为会使图片出现抖动的现象 样式则是div中包含ul <script src="animate.js"></script> <script> //1. 找出页面中需要的对象 var box = document.getElementById("box"); var ul = box.children[0]; var lis = ul.children; //2

js实现图片切换效果

用js实现点击按钮,图片切换的效果: 1 <div class="box" id="box"> 2 <div class="img_box" id="img_box"> 3 <img src="../raw/b1.jpg" class="image" > 4 <img src="../raw/b2.jpg" class=&qu

JS实现图片滚动效果

源码参考菜鸟教程:<iframe width="100%" height="300" src="https://c.runoob.com/iframe/2037" allowfullscreen="allowfullscreen" frameborder="0"></iframe> 要实现图片自动滚动需要稍微修改一下源码(我怕忘记自己当时怎么修改的,因此记录一下): 示例代码: 1

原生js实现图片抖动效果

今天来写一个关于图片抖动的效果,需求是:点击图片,让其抖动几下停止(类似于苹果手机填错密码之后会抖一下的效果),其实想要实现这个效果,原理就是,点击之后,让其左移动下然后右移动一下(每移动一下减几像素知道减到0),然后将其放入定时器内,让其慢慢自动停下来.来看代码布局: <style> #img{position:absolute;left:30px;} </style> <body> <!--需求:点击图片,图片会抖动几下--> <img id=&q

springboot查询数据库,js实现二级联动效果

1.数据库设计 实现oracle,mysql不同数据库链接不同的数据类型 2.在跳转到添加页面的时候,去数据库查询parent_id=0的数据,存入modelMap中带入add.html页面 @GetMapping("/add") public String add(ModelMap mmap) { //查询数据库类型,返回oracle和mysql等数据库 List<DatabaseVo> databaseVo = matedataService.selectDatabas

聊聊大麦网UWP版的首页顶部图片联动效果的实现方法

随着Windows10的发布,国内已经有越来越多的厂商上架了自家的通用应用程序客户端,比如QQ.微博.大麦等.所实话,他们设计的确实很好,很符合Windows10 的设计风格和产品理念,而对于开发者而言,当我们发现一个不错的UI设计风格不禁想自己动手也写一个类似的效果玩玩.前几天在微软的开发者社区中逛的时候,看见有人问大麦网的UWP版首页顶部是如何实现的,于是自己就好奇的安装了一下,想看看是什么效果.效果图如下所示: 小白们有没有感觉有一种高大上的感觉呢?(当然我也是一个小白啦!!!!大牛勿喷!

js京东图片放大镜效果。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>放大镜</title> <style> *{ margin: 0; padding: 0; } /* 去除图片的3px */ img { vertical-align: top; } /* 容器样式 */ .container { width: