程序流动画在javascript中

时间:2016-03-26 04:15:05

标签: javascript css animation dynamic

您好我的代码有错误: https://jsfiddle.net/wzhm2whj/

<script>
    //Initial Global variables
    var mainloop_frame_time = 34;
    var top = 0;
    var rootMenu = document.getElementById('menu');
    var rootMenuDivs = rootMenu.getElementsByTagName('div')[0];
    var rootListDivs = rootMenuDivs.getElementsByTagName('ul')[0];
    var childDivs = rootListDivs.getElementsByTagName('div');
    var childDiv = childDivs[0];
    var childDiv_counter = 0;
    var child_change_flag = true;
    var child_index_increment = 0;
    var child_index_amount = childDivs.length;
    //var child_animation_keyframe = 0;
    var frame = 0;
    var childDiv_tmp1_position = 0;

    //finding the web browsers viewport size.
    var elem = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body;
    var client_height = elem.clientHeight;

    var process_array = new Array();
    //Initial styling
    for (var i = 0; i < childDivs.length; i++) {
        var childDiv = childDivs[0];
        childDiv.style.backgroundColor = "antiquewhite";
    }
    var childDiv = childDivs[0];

    //rotate function variables
    var rotate_div;
    var rotate_passed_deg;
    var rotate_deg_stop;
    var rotate_results;
    var rotate_current_deg = 0;

    var speed_modifier = 1;
    var tmp1_speed = 0;

    //case flags
    case2_flag = -1;
    case3_flag = -1;



    //This may not be needed >>> If not, put all code in mainloop.
    var processes_logic = function() {
        switch (frame) {
            case 0:
                process_array.push(menu_child0);
                break;
                //this case is when the previous case is 80% done
            case 28:
                rootMenu.style.transformOrigin = "top left";
                process_array.push(menu_slant);
                break;
            case 35:
                //Added the ability for paramaters, all push paramaters here are: function,      menu_index,      position, speed,      tmp as flag for switching to next menu, 
                //process_index used to give the process index as refrence to delete..
                window.alert(process_array.length);
                process_array.push(new Array(menu_div_slide_out, child_index_amount - 1, 0, 0, 0, process_array.length-1));

                break;
        }
    }


    var initiate_all_processes = function() {
        for (var i = 0; i < process_array.length; i++) {
            //Added the ability for paramaters, considerer removing as its not used atm, or revising.
            if (process_array[i] != undefined && process_array[i] != null && process_array[i] != "") {
                if (process_array[i].length < 6) {
                    process_array[i]();
                } else {
                    process_array[i][0](process_array[i][5]);
                }
            }
        }
    }


    function menu_div_slide_out(process_index) {
        /*process_array[process_index][
        0 = function,
        1 = current menu item (index length working backwards)
        2 = position,
        3 = speed,
        4 = tmp,
        5 = refrence to this process in array] */
        //for debuging purposes to see if a ChildDiv is not devined, what process index is being pointed to.
      
            //window.alert('Process index ' + process_index);
        //!!!!!!!! You are probably mixing up how you are setting process index! try +1
        process_array[process_index][2] += 3.5 + (process_array[process_index][3] * 1.7);
        process_array[process_index][3] += (speed_modifier * .3);
        childDivs[process_array[process_index][1]].style.left = process_array[process_index][2] + 'px';


        if (process_array[process_index][2] > 100 && process_array[process_index][4] && process_array[process_index][1] > 0) {
           // window.alert('CCC');
            process_array[process_index][4] = true;
           //Add another process at ever 100pxs
            process_array.push(new Array(menu_div_slide_out, process_array[process_index][1] - 1, 0, 0, false, process_array.length-1));
            //debugger;

        } else
        if (process_array[process_index][2] >= (900 - (process_array[process_index][2] / 20))) {
            childDivs[process_array[process_index][1]].remove();
            //process_array.splice(process_array[process_index][5], 1);
        }
    }


    function menu_slant() {
        rotate_return = rotate(rootMenu, .1 + (tmp1_speed), 27);
        tmp1_speed += (speed_modifier * .5);
        if (rotate_return === true) {
            /////////////This can be unremoved because there is more animation, perhaps. or can be done in another key frame.
            tmp1_speed = 0;
            rotate_current_deg = 0;
            remove_process(menu_slant);
        } else {
            if (rotate_return / 27 * 100 >= 60 && case3_flag < 0) {
                case2_flag = frame;
            }
        }
    }




    var menu_child0 = function() {
        childDiv_tmp1_position += 3 + (tmp1_speed * 1.7);
        childDiv.style.top = childDiv_tmp1_position + 'px';
        rotate(childDiv, .2 + (tmp1_speed), 170);
        tmp1_speed += (speed_modifier * .7);
        if (childDiv_tmp1_position / client_height * 100 >= 80 && case2_flag < 0) {
            case2_flag = frame;
        }
        if (childDiv_tmp1_position >= client_height) {
            childDiv.style.visibility = 'hidden';
            tmp1_speed = 0;
            childDiv_tmp1_position = 0;
            rotate_current_deg = 0;
            //may be bloated >>
            remove_process(menu_child0);
        }
    }


    function remove_process(index) {
        var index_tmp = process_array.indexOf(index);
        if (index_tmp >= 0) {
            process_array.splice(index_tmp, 1);
        }
    }


    function rotate(rotate_div, rotate_passed_deg, rotate_passed_deg_stop) {
        rotate_current_deg += rotate_passed_deg;
        rotate_deg = rotate_current_deg < rotate_passed_deg_stop ? rotate_current_deg : rotate_passed_deg_stop;
        rotate_div.style.webkitTransform = 'rotate(' + rotate_deg + 'deg)';
        rotate_div.style.mozTransform = 'rotate(' + rotate_deg + 'deg)';
        rotate_div.style.msTransform = 'rotate(' + rotate_deg + 'deg)';
        rotate_div.style.oTransform = 'rotate(' + rotate_deg + 'deg)';
        rotate_div.style.transform = 'rotate(' + rotate_deg + 'deg)';
        if (rotate_current_deg >= rotate_passed_deg_stop) {
            return true;
        } else {
            return rotate_current_deg;
        }
    }




    //main loop for the animation
    var mainloop = function() {
        processes_logic();
        initiate_all_processes();
        frame++;
    }
    var loop_interval = setInterval(mainloop, mainloop_frame_time);
</script>

我正试图让我的网站分崩离析,但我很难将其解释为代码。我想在循环中运行动画,在特定帧创建事件并重用一些代码作为函数。我有一个旋转功能,可以旋转几个东西。

问题: 我遇到的问题是一次一个地滑动我的菜单项。我希望有一个滑动,然后下一个滑动。我编写了一个函数来滑动项目,然后在该函数中,它为数组添加另一个进程,以便调用下一个菜单项并运行相同的函数(调用who的传递间隔)。我不知道会有多少菜单项,这就是为什么我想让它变得动态。

我可以得到它,以便第一个mwnu项目下降,菜单通过旋转它落下(有时如果代码中有错误然后它不会旋转,但是当没有错误时它会更好地工作)。

问题是滑动每个菜单项。

我的网站在这里:http://clearlove.ca/89-404-error

任何人都可以帮助我解释为什么这不起作用,如果有更好的方法来做我想做的事情?

0 个答案:

没有答案