JavaScript to achieve elastic navigation effect

JavaScript to achieve elastic navigation effect

This article shares the specific code for JavaScript to achieve elastic navigation effects for your reference. The specific content is as follows

Mainly using offsetX

1. Build the scaffolding first:

* {
      margin: 0;
      padding: 0;
        }
        
        .nav {
            width: 900px;
            height: 63px;
            background: url(images/doubleOne.png) no-repeat right center;
            border: 1px solid #ccc;
            margin: 100px auto;
            position: relative;
        }
        
        ul {
            position: relative;
            z-index: 999;
        }
        
        ul>li {
            list-style: none;
            float: left;
            width: 88px;
            height: 63px;
            line-height: 63px;
            text-align: center;
        }
        
        span {
            display: inline-block;
            width: 88px;
            height: 63px;
            background: url("images/tMall.png") no-repeat;
            position: absolute;
            left: 0;
            top: 0;
}
<div class="nav">
        <ul>
            <li>Double 11 Carnival</li>
            <li>Clothing venue</li>
            <li>Digital home appliances</li>
            <li>Home building materials</li>
            <li>Mother and baby clothing</li>
            <li>Mobile venue</li>
            <li>Beauty and makeup venue</li>
            <li>Import Venue</li>
            <li>Fliggy Travel</li>
        </ul>
        <span></span>
</div> 

2. Write the logic part

//1. Get the element to be operated const oItems = document.querySelectorAll("li");
 let oSpan = document.querySelector("span");
 
//2. Listen for click events of each menu for (let i = 0; i < oItems.length; i++) {
            let item = oItems[i];
            item.onclick = function() {
                //offsetLeft gets the offset of the clicked element from the first positioned ancestor element // console.log(this.offsetLeft);
                // oSpan.style.left = this.offsetLeft + 'px';
                //Call function easeAnimation(oSpan, {
                    "left": this.offsetLeft
                });
            };
        }

animation.js

(function() {
    /**
     * Uniform speed animation* @param {*} ele Element to perform animation* @param {*} obj Which attributes of the element need to be animated* @param {*} fn Operations that may need to be performed after the animation is completed* 
     * Calling method reference* linearAnimation(oDiv, {
                "marginTop": 500,
                "marginLeft": 300
        });
     */
    function linearAnimation(ele, obj, fn) {
        clearInterval(ele.timerId);
        ele.timerId = setInterval(function() {
            //The flag variable is used to mark whether all properties have completed the animation. let flag = true;
 
            for (let key in obj) {
                let target = obj[key];
 
                // 1. Get the current position of the element // let begin = parseInt(ele.style.width) || 0;
                let style = getComputedStyle(ele);
                // let begin = parseInt(style.width) || 0;
                let begin = parseFloat(style[key]) || 0;
 
                // 2. Define variables to record step length let step = (begin - target) > 0 ? -13 : 13;
 
                // 3. Calculate the new position begin += step;
                // console.log(Math.abs(target - begin), Math.abs(step));
                if (Math.abs(target - begin) > Math.abs(step)) { //Animation not completed flag = false;
                } else { //After executing the animation begin = target;
                }
 
                // 4. Reset the element's position // ele.style.width = begin + "px";
                ele.style[key] = begin + "px";
            }
 
            //Judge whether the animation has been executed if (flag) {
                //After the animation is finished, turn off the timer clearInterval(ele.timerId);
 
                //Judge whether the fn function is passed in, execute it if it is passed in, otherwise do not execute it // if (fn) {
                // fn();
                // }
                fn && fn();
            }
        }, 100);
    }
 
    //Easy animation function easeAnimation(ele, obj, fn) {
        clearInterval(ele.timerId);
        ele.timerId = setInterval(function() {
            //The flag variable is used to mark whether all properties have completed the animation. let flag = true;
 
            for (let key in obj) {
                let target = obj[key];
 
                // 1. Get the current position of the element let style = getComputedStyle(ele);
                let begin = parseInt(style[key]) || 0;
 
                // 2. Define variable record step size // Formula: (end position - start position) * easing coefficient (0 ~ 1)
                let step = (target - begin) * 0.3;
 
                // 3. Calculate the new position begin += step;
                if (Math.abs(Math.floor(step)) > 1) {
                    flag = false;
                } else {
                    begin = target;
                }
                // 4. Reset the element's position ele.style[key] = begin + "px";
            }
 
            //Judge whether the animation has been executed if (flag) {
                //After the animation is finished, turn off the timer clearInterval(ele.timerId);
 
                //Judge whether the fn function is passed in, and execute it if it is, otherwise do not execute fn && fn();
            }
        }, 100);
    }
 
    // Bind the function to the window object so that it can be used globally window.linearAnimation = linearAnimation;
    window.easeAnimation = easeAnimation;
})(); 

The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM.

You may also be interested in:
  • Pure JS to achieve elastic navigation bar effect

<<:  How to keep the content within the container when the flex layout is stretched by child elements

>>:  9 Tips for Web Page Layout

Recommend

Detailed examples of converting rows to columns and columns to rows in MySQL

mysql row to column, column to row The sentence i...

How to use Cron Jobs to execute PHP regularly under Cpanel

Open the cpanel management backend, under the &qu...

Several implementation methods of the tab bar (recommended)

Tabs: Category + Description Tag bar: Category =&...

How to install the latest version of docker using deepin apt command

Step 1: Add Ubuntu source Switch to root su root ...

Summarize some general principles of web design and production

<br />Related articles: 9 practical suggesti...

React handwriting tab switching problem

Parent File import React, { useState } from '...

Several reasons for not compressing HTML

The reason is simple: In HTML documents, multiple ...

js canvas realizes circular water animation

This article example shares the specific code of ...

MySQL select, insert, update batch operation statement code examples

In projects, batch operation statements are often...

Implement group by based on MySQL to get the latest data of each group

Preface: The group by function retrieves the firs...

How to query the latest transaction ID in MySQL

Written in front: Sometimes you may need to view ...

JavaScript implementation of verification code case

This article shares the specific code for JavaScr...

Detailed explanation of how to use JavaScript paging component

The pagination component is a common component in...