Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MouseOver CSS3D effect with javascript

I am trying to achieve mouseOver effect like this.

enter image description here

I am able to generate css3d matrix required for each and every tile according to their position.

I have achieved this effect with slow mouse movement, but if I am moving fast from one tile to another tile its notupdating properly. its showing gap in between tiles. What is the best way to update all the tile/tile co-ordinates on mouseover so that i get consistent effect?

here is my js code:

 $('.box').each(function() {
            $(this).css('height', '284px');
            $(this).css('width', '284px');
        });

        generateGrid = function(w, h) {
            var t = this;
            this.p = [];
            var d = 30;


            var c = Math.floor($('.w').outerWidth() / 284 + 1);
            var r = Math.ceil($('.w').outerHeight() / 284) + 1;
            var vc = c * r;
            for (i = 0; i < vc; i++) {
                var l = {
                    x: Math.floor(i % c) * 284,
                    y: Math.floor(i / c) * 284
                };
                this.p.push(l);
            }
            var m = m || {};

            m.Grid = function() {
                this.elms = [];
                this.init();
            }, m.Grid.prototype = {
                init: function() {
                    this.createTiles();
                },
                animateTile: function() {
                    var e = this;
                    for (i = 0; i < e.elms.length; i++) {
                        console.log(i);
                        e.elms[i].update();
                    }
                    requestAnimationFrame($.proxy(this.animateTile, this));
                },
                createTiles: function() {
                    var c = this;
                    for (i = 0; i < $('.box').length; i++) {
                        c.elms.push(new m.tile($('.box:eq(' + i + ')'), i));
                    }

                    c.animateTile();
                }
            }, m.tile = function(e, i, pt) {
                this.el = e;
                this.i = i;
                var p = t.p;
                this.elX = Math.floor(i % 4) * 284,
                        this.elY = Math.floor(i / 4) * 284,
                        this.p1 = p[i + Math.floor(i / 4)],
                        this.p2 = p[i + Math.floor(i / 4) + 1],
                        this.p3 = p[i + Math.floor(i / 4) + 6]
                this.p4 = p[i + Math.floor(i / 4) + 5];


                this.init();
            }, m.tile.prototype = {
                init: function() {

                    this.initEvents();
                },
                initEvents: function() {
                    var e = this;
                    var pts = t.p;
                    var p1 = pts[e.i + Math.floor(i / 4)],
                            p2 = pts[e.i + Math.floor(i / 4) + 1],
                            p3 = pts[e.i + Math.floor(i / 4) + 6],
                            p4 = pts[e.i + Math.floor(i / 4) + 5];


                    $(e.el).hover(function() {
                        TweenMax.killTweensOf(p1),
                                TweenMax.killTweensOf(p2),
                                TweenMax.killTweensOf(p3),
                                TweenMax.killTweensOf(p4),
                                TweenMax.to(p1, .3, {
                            x: p1.x - d,
                            y: p1.y - d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(p2, .3, {
                            x: p2.x + d,
                            y: p2.y - d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(p3, .3, {
                            x: p3.x + d,
                            y: p3.y + d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(p4, .3, {
                            x: p4.x - d,
                            y: p4.y + d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(e.el, .3, {
                            zIndex: 10,
                            ease: Back.easeOut
                        });

                    }, function() {
                        TweenMax.killTweensOf(p1),
                                TweenMax.killTweensOf(p2),
                                TweenMax.killTweensOf(p3),
                                TweenMax.killTweensOf(p4);

                        TweenMax.to(p1, .7, {
                            x: p1.x + d,
                            y: p1.y + d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(p2, .7, {
                            x: p2.x - d,
                            y: p2.y + d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(p3, .7, {
                            x: p3.x - d,
                            y: p3.y - d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(p4, .7, {
                            x: p4.x + d,
                            y: p4.y - d,
                            ease: Back.easeOut
                        }),
                        TweenMax.to(e.el, .7, {
                            zIndex: 0,
                            ease: Back.easeOut
                        });
                    });
                },
                update: function() {
                    var e = this;
                    var pts = t.p;
                    var p1 = pts[e.i + Math.floor(i / 4)],
                            p2 = pts[e.i + Math.floor(i / 4) + 1],
                            p3 = pts[e.i + Math.floor(i / 4) + 6],
                            p4 = pts[e.i + Math.floor(i / 4) + 5];
                    BLEND.TransformElement(
                            {
                                el: e.el[0],
                                src: [{x: 0, y: 0}, {x: w, y: 0}, {x: w, y: h}, {x: 0, y: h}],
                                dest: [
                                    {x: p1.x - e.elX,
                                        y: p1.y - e.elY},
                                    {x: p2.x - e.elX,
                                        y: p2.y - e.elY},
                                    {x: p3.x - e.elX,
                                        y: p3.y - e.elY},
                                    {x: p4.x - e.elX,
                                        y: p4.y - e.elY},
                                ]
                            });
                }
            };

            t.grid = new m.Grid();
        };
        generateGrid(284, 284);

BLEND.TransformElement(el,src,dest) in my code gives CSS3D matrix, it's working fine. I need to update vertices properly.

Here is my html and CSS:

<style>
       .box{
            float: left;
            background: #2b5349;
            transform-origin: 0px 0px;
        }
    </style>

    <div class="w" style=" margin-bottom:190px;display:inline-block;width: calc(284px * 4); margin:100px auto;">
        <div class="box" style="background: red"></div>
        <div class="box" style="background: #2b5349"></div>
        <div class="box" style="background: green"></div>
        <div class="box" style="background: blue"></div>
        <div class="box" style="background: darkgoldenrod"></div>
        <div class="box" style="background: fuchsia"></div>
        <div class="box" style="background: lightpink"></div>
        <div class="box" style="background: mediumspringgreen"></div>
        <div class="box" style="background: burlywood"></div>
        <div class="box" style="background: orange"></div>
        <div class="box" style="background: gold"></div>
        <div class="box" ></div>
    </div>

I am doing all this this from start without using any external plugin for that particular effect. Please suggest some solution.

I have stored all the vertices of all tiles and updating it on mouseover. as soon as I mouseover from one tile to another animation for resetting vertices values from new one to original stops. How can I fix vertices update problem on mouseenter and mouseleave envent.

like image 572
Manish Mahajan Avatar asked Dec 22 '14 14:12

Manish Mahajan


People also ask

How do you hover JavaScript?

The hover() method specifies two functions to run when the mouse pointer hovers over the selected elements. This method triggers both the mouseenter and mouseleave events. Note: If only one function is specified, it will be run for both the mouseenter and mouseleave events.

Can JavaScript add animation?

Animation CodeJavaScript animations are done by programming gradual changes in an element's style. The changes are called by a timer. When the timer interval is small, the animation looks continuous.

How do you add a hovering effect in HTML?

The :hover selector is used to select elements when you mouse over them. Tip: The :hover selector can be used on all elements, not only on links. Tip: Use the :link selector to style links to unvisited pages, the :visited selector to style links to visited pages, and the :active selector to style the active link.

What is hovering effect?

What is a CSS Hover Effect? A CSS hover effect takes place when a user hovers over an element, and the element responds with transition effects. It is used to mark the key items on the web page and it's an effective way to enhance the user experience.


1 Answers

I Solved the problem. Problem was with not updating vertices value to the original on mouseout event. to revert vertices value to original question i have to keep extra value of vertices like this.

var l = {
                x: Math.floor(i % c) * 284,
                y: Math.floor(i / c) * 284,
                x2: Math.floor(i % c) * 284,
                y2: Math.floor(i / c) * 284,

            };

On mouseover change the vertice value like this for every coordinate

 TweenMax.to(p1, .3, {
                        x: p1.x2 + d,
                        y: p1.y2 - d,
                        ease: Back.easeOut
                    })

and on mouseout reset original position

 TweenMax.to(p2, .3, {
                        x: p2.x,
                        y: p2.y,
                        ease: Back.easeOut
                    })
like image 124
Manish Mahajan Avatar answered Oct 17 '22 21:10

Manish Mahajan