JS运动-放大缩小物体(从中心)

先来看下效果:

要点:

1. 将css的float定位,转换成用js的绝对定位

2. 从中心放大缩小物体

主要步骤:

1. 先通过css的float定位,ul宽度设置成li宽的倍数(例子中li的宽是122,没行显示3 个li,所以ul宽设置        成366)

2.  利用js 获取并且设置他们初始的left 和top值

3.  ul 的position:relative相对定位,接着用js循环设置li的position:absolute绝对定位

4.  加入鼠标移入移出事件,并通过运动框架 达到放大缩小的效果

5.  物体放大的时候,主要层级问题

<ul id="ulList">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
<style>
        *{padding: 0;margin: 0;}
        #ulList{
            position: relative;
            width:366px;margin: 0 auto;
        }
        #ulList li{
           list-style: none;width: 100px;height: 100px;
            background: #c00;
            border: 1px solid black;
            float: left;
            margin: 10px;
        }
</style>
<script src="move.js"></script>
<script>
    window.onload = function () {
        var oUl = document.getElementById('ulList');
        var aLi = oUl.getElementsByTagName('li');
        var i=0;
        var initzIndex = 2;
        /*注意这里必须用两个for循环,首先给每个li添加了left和top值,在使他们的position=absolute,如果用一个for就会使所有li重叠在一起*/
        for(i=0;i<aLi.length;i++){
            aLi[i].style.left = aLi[i].offsetLeft + 'px';
            aLi[i].style.top = aLi[i].offsetTop + 'px';
        }
        for(i=0;i<aLi.length;i++){
            aLi[i].style.position = 'absolute';
            // 因为上面aLi[i].offsetLeft获取的值本身就已经包括了margin的值,所以这里需要将style里margin清零
            aLi[i].style.margin = '0';

            aLi[i].onmousemove = function () {
                this.style.zIndex = initzIndex++;
                startMove(this,{width:200,height:200,marginLeft:-50,marginTop:-50});
            }
            aLi[i].onmouseout = function () {
                startMove(this,{width:100,height:100,marginLeft:0,marginTop:0});
            }

        }
    }
    /*从中心放大要点:改变物体宽高的同时改变物体的margin-left和margin-top值,用改变后的宽200 减去 改变之前的宽100 然后除以2 就得到
    * margin-left 应该改变的值,因为要放大,所以margin-left是负值,margin-top同样的道理
    * */
</script>

下面是引入的move.js 的完整代码

/**
 * Created by ZJ on 18/5/2015.
 */
function getStyle(obj,attr){
    return window.getComputedStyle ? window.getComputedStyle(obj,false)[attr] : obj.currentStyle[attr];
}
function startMove(obj,json,fn) {
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        var bStop = true;
        for(attr in json){
            // 1. 取得当前的值(可以是widht,height,opacity等的值)
            var objAttr = 0;
            if(attr == "opacity"){
                objAttr = Math.round(parseFloat(getStyle(obj,attr))*100);
            }else{
                objAttr = parseInt(getStyle(obj,attr));
            }
            // 2.计算运动速度
            var iSpeed = (json[attr] -objAttr)/10;
            iSpeed = iSpeed>0 ?Math.ceil(iSpeed):Math.floor(iSpeed);
            // 3. 检测所有运动是否到达目标
            if(objAttr != json[attr]){
                bStop = false;
            }
            if(attr == "opacity"){
                obj.style.filter = 'alpha(opacity:'+(objAttr+iSpeed)+')';
                obj.style.opacity = (objAttr+iSpeed)/100;
            }else{
                obj.style[attr] =  objAttr+iSpeed+'px';// 需要又.属性名的形式改成[]
            }
        }
        if(bStop){ // 表示所有运动都到达目标值
            clearInterval(obj.timer);
            if(fn){
                fn();
            }
        }
    },10);
}

上面是全部的测试代码,下面对放大时的层级问题解释一下:

当鼠标移入,图片从中心放大,移出还原,出现图片层级问题,放大后图片明显被其他图片覆盖了。为了解决这个问题首先定义一个初始最小的  var  mixzIndex = 2;然后再鼠标移入时,让当前li的z-index 等于mixzIndex++;这样保证鼠标移入的li,它的层级总比其他的li层级高

this.style.zIndex = initzIndex++;
时间: 2024-10-26 15:01:51

JS运动-放大缩小物体(从中心)的相关文章

(42)JS运动之多物体框架--多个div变宽

如果只为div添加一个定时器的话,在多个div变宽的时候会发生问题,但是如果为每个div添加一个定时器,那么就可以实现多个物体变宽.注意:在多物体运动的情况下,所有东西不能共用.offsetXXX会跟border冲突导致不能得到想要的结果,在这里可以用getStyle()函数代替. function getStyle(obj, name) { if(obj.currentStyle) { return obj.currentStyle[name]; } else { return getComp

(36)JS运动之使物体向右运动

基本思路:样式要是绝对定位,不然的话根本走不起来,当开启一个定时器的时候,必须先清除定时器,这是为了防止鼠标连续点击按钮而开启多个定时器,导致物体的速度加快等原因,其次要控制好物体的运动和停止,用if-else控制逻辑控制. <!DOCTYPE HTML> <!-- --> <html> <head> <meta charset="utf-8"> <title></title> <style>

Unity3D 学习教程 9 旋转 放大 移动 物体

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 点击选中物体 点击控制面板快捷栏 1 是平移镜头 2 是移动物体 点击箭头平移 3是转动物体 点击线圈转动 4 是 放大缩小物体 520 520小说 小说520 小说5205200 小说5200 5200小说 5200小说网 www.520bo

js实现多张图片同时放大缩小相对位置不变

项目要求需要用js实现同时放大多张图片相对位置不变,就和同事去一家国外网站的js文件中跟踪扒取了这一算法, 庆幸的是算法抠出来了并整理了出来,但遗憾的只知计算过程却弄不明白算法原理: 大体上是核心运算将图片的中心点和画布(外层div)中心点的差和放大倍数针对矩阵[1.0000000000000002,-0,-0,1.0000000000000002] (这个矩阵是由[1,0,01]经过一系列计算得出的一个固定矩阵)做了两次运算:(如果大家懂得其中计算原理,希望能分享一下) /// <refere

js判断页面放大缩小

项目中,经常会碰到页面被放大或者缩小,导致页面显示错误,js可以判断页面放大缩小. // 若返回100则为默认无缩放,如果大于100则是放大,否则缩小 function detectZoom (){ var ratio = 0, screen = window.screen, ua = navigator.userAgent.toLowerCase(); if (window.devicePixelRatio !== undefined) { ratio = window.devicePixel

纯js实用DOM元素放大缩小特效插件

Zoomerang.js是一款非常实用的HTML DOM元素放大缩小js特效插件.它可以将页面上的任何元素进行放大缩小.当某个元素处于Zoomerang的监听状态时,点击该元素可以将它放大到屏幕的中间,再次点击它又会回到原来的位置. 使用注意事项: 该元素放大缩小效果依赖于CSS Transform(IE浏览器至少要IE10才能支持) 在固定尺寸的元素上效果最佳:display: block.display: inline-block和img. 避免在很长的文本段上使用. 在mobile上使用时

JS实现鼠标拖拽效果以及放大缩小

要求:拖拽的子元素不能走出父元素,大小不能超过父元素,放大/缩小时阻止冒泡事件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> *{margin: 0;padding: 0;} .box1{border: 10px solid #000;width: 400px;height: 400px;posi

js 鼠标滚轮控制图片放大缩小

<img :src="ImgUrl" alt="" width="100%" @mousewheel="zoomimg($event)" id="ScrollImg"> // 缩放图片 zoomimg(event) { var delta = 0; if (!event) event = window.event; if (event.wheelDelta) { delta = event.wh

JS运动从入门到兴奋1

hello,我是沐晴,一个充满了才华,却靠了照骗走江湖的前端妹子.在这个充满PS的年代,这你们都信,哈哈,废话不多说,今天要分享的是关注JS运动的知识.楼主一直认为,不管学习什么,核心思想才是王道,掌握了思想,不管需求怎么改变,我们都能把它玩弄于股掌之中...下面我们就由浅入深走进运动的世界吧. 首先来看最基础的运动:单个物体向右匀速运动到某一点停止      例子:一个按钮,一个div,点击按钮,让div向右运动到某一个位置暂停 // 原理: 1 获取物体当前的位置 oDiv.offsetle