主頁 > 企業開發 > JavaScript——WEBAPIS_深入影片函式的封裝,常見網頁特效

JavaScript——WEBAPIS_深入影片函式的封裝,常見網頁特效

2020-09-30 10:11:14 企業開發

深入影片函式的封裝

1.影片函式的封裝

1.1 緩動效果的實作

這里有一些核心的演算法,(目標值 - 現在的位置)   /  10 = 每一次移動的步長

拿一個具體的效果舉例子,比如讓一個元素慢下來,
實作想法:讓元素的移動距離變下,每一次的步長都變小,核心的演算法:** (目標值 - 現在的位置)   /  10    做為每次移動的距離步長**,其停止的條件就是當盒子到達目標位置就停止定時器

實作的代碼:

<body>
    <button>點擊之后老李才飛!</button>
    <span>BM老李</span>
    <script>
        // 緩動影片函式封裝obj目標物件 target 目標位置
        // 思路:
        // 1. 讓盒子每次移動的距離慢慢變小, 速度就會慢慢落下來,
        // 2. 核心演算法:(目標值 - 現在的位置) / 10 做為每次移動的距離 步長
        // 3. 停止的條件是: 讓當前盒子位置等于目標位置就停止定時器
        function animate(obj, target) {
            // 先清除以前的定時器,只保留當前的一個定時器執行
            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                // 步長值寫到定時器的里面
                var step = (target - obj.offsetLeft) / 10;
                if (obj.offsetLeft == target) {
                    // 停止影片 本質是停止定時器
                    clearInterval(obj.timer);
                }
                // 把每次加1 這個步長值改為一個慢慢變小的值  步長公式:(目標值 - 現在的位置) / 10
                obj.style.left = obj.offsetLeft + step + 'px';

            }, 15);
        }
        var span = document.querySelector('span');
        var btn = document.querySelector('button');

        btn.addEventListener('click', function() {
                // 呼叫函式
                animate(span, 500);
            })
            // 勻速影片 就是 盒子是當前的位置 +  固定的值 10 
            // 緩動影片就是  盒子當前的位置 + 變化的值(目標值 - 現在的位置) / 10)
    </script>
</body>

1.2 多值移動

比如我現在有這樣的一個需求:點擊走到800 再點擊走到500,相當于往回走了,我們可以加一個條件判斷一下步長

  1. 如果是正值,則步長往大了取整
  2. 如果是負值,則步長 向小了取整

核心代碼

+++
 var step = (target - obj.offsetLeft) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
// 解釋一下,這里的,Math.celi(step)函式回傳大于或等于一個給定數字的最小整數,比如我給一個0.95 它給我的就是1,比比如我給的4,它就是4 如果是-7.44 它就回傳 -7
// Math.floor(step); 回傳小于或等于一個給定數字的最大整數,注意這玩意兒 向下取整

+++

1.3 關于回呼函式

關于回呼函式其實比較簡單,說白了就是動作(函式)結束之后下一步改干什么,注意在影片函式中,回呼函式寫的位置:定時器結束的位置,

2.常見的網頁特效例子

2.1 輪播圖

注意哈,我們每次遇到問題的時候嗎,一定要先想清楚再去敲代碼,想清楚 非常非常的關鍵,不要一上來就敲代碼!!!,到頭來你都不知道在寫什么鬼東西,

  1. 需求分析
?	1.滑鼠經過輪播圖模塊,左右按鈕顯示,離開隱藏左右按鈕,

?	2.點擊右側按鈕一次,圖片往左播放一張,以此類推,左側按鈕同理,

?	3.圖片播放的同時,下面小圓圈模塊跟隨一起變化,

?	4.點擊小圓圈,可以播放相應圖片,

?	5.滑鼠不經過輪播圖,輪播圖也會自動播放圖片,

?	6.滑鼠經過,輪播圖模塊, 自動播放停止,

實作代碼:

window.addEventListener('load', function() {
    // 1. 獲取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    var focusWidth = focus.offsetWidth;
    // 2. 滑鼠經過focus 就顯示隱藏左右按鈕
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
        clearInterval(timer);
        timer = null; // 清除定時器變數
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
        timer = setInterval(function() {
            //手動呼叫點擊事件
            arrow_r.click();
        }, 2000);
    });
    // 3. 動態生成小圓圈  有幾張圖片,我就生成幾個小圓圈
    var ul = focus.querySelector('ul');
    var ol = focus.querySelector('.circle');
    // console.log(ul.children.length);
    for (var i = 0; i < ul.children.length; i++) {
        // 創建一個小li 
        var li = document.createElement('li');
        // 記錄當前小圓圈的索引號 通過自定義屬性來做 
        li.setAttribute('index', i);
        // 把小li插入到ol 里面
        ol.appendChild(li);
        // 4. 小圓圈的排他思想 我們可以直接在生成小圓圈的同時直接系結點擊事件
        li.addEventListener('click', function() {
            // 干掉所有人 把所有的小li 清除 current 類名
            for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 留下我自己  當前的小li 設定current 類名
            this.className = 'current';
            // 5. 點擊小圓圈,移動圖片 當然移動的是 ul 
            // ul 的移動距離 小圓圈的索引號 乘以 圖片的寬度 注意是負值
            // 當我們點擊了某個小li 就拿到當前小li 的索引號
            var index = this.getAttribute('index');
            // 當我們點擊了某個小li 就要把這個li 的索引號給 num  
            num = index;
            // 當我們點擊了某個小li 就要把這個li 的索引號給 circle  
            circle = index;
            // num = circle = index;
            console.log(focusWidth);
            console.log(index);

            animate(ul, -index * focusWidth);
        })
    }
    // 把ol里面的第一個小li設定類名為 current
    ol.children[0].className = 'current';
    // 6. 克隆第一張圖片(li)放到ul 最后面
    var first = ul.children[0].cloneNode(true);
    ul.appendChild(first);
    // 7. 點擊右側按鈕, 圖片滾動一張
    var num = 0;
    // circle 控制小圓圈的播放
    var circle = 0;
    // flag 節流閥
    var flag = true;
    arrow_r.addEventListener('click', function() {
        if (flag) {
            flag = false; // 關閉節流閥
            // 如果走到了最后復制的一張圖片,此時 我們的ul 要快速復原 left 改為 0
            if (num == ul.children.length - 1) {
                ul.style.left = 0;
                num = 0;
            }
            num++;
            animate(ul, -num * focusWidth, function() {
                flag = true; // 打開節流閥
            });
            // 8. 點擊右側按鈕,小圓圈跟隨一起變化 可以再宣告一個變數控制小圓圈的播放
            circle++;
            // 如果circle == 4 說明走到最后我們克隆的這張圖片了 我們就復原
            if (circle == ol.children.length) {
                circle = 0;
            }
            // 呼叫函式
            circleChange();
        }
    });

    // 9. 左側按鈕做法
    arrow_l.addEventListener('click', function() {
        if (flag) {
            flag = false;
            if (num == 0) {
                num = ul.children.length - 1;
                ul.style.left = -num * focusWidth + 'px';

            }
            num--;
            animate(ul, -num * focusWidth, function() {
                flag = true;
            });
            // 點擊左側按鈕,小圓圈跟隨一起變化 可以再宣告一個變數控制小圓圈的播放
            circle--;
            // 如果circle < 0  說明第一張圖片,則小圓圈要改為第4個小圓圈(3)
            // if (circle < 0) {
            //     circle = ol.children.length - 1;
            // }
            circle = circle < 0 ? ol.children.length - 1 : circle;
            // 呼叫函式
            circleChange();
        }
    });

    function circleChange() {
        // 先清除其余小圓圈的current類名
        for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = '';
        }
        // 留下當前的小圓圈的current類名
        ol.children[circle].className = 'current';
    }
    // 10. 自動播放輪播圖
    var timer = setInterval(function() {
        //手動呼叫點擊事件
        arrow_r.click();
    }, 2000);

})

2.2 圖外話,截流閘

當我們執行上面的代碼的時候會發現一些小的bug,比如我瘋狂的去點擊下一張,就有問題了!這個時候截流閘孕育而生

核心原理:

節流閥目的:當上一個函式影片內容執行完畢,再去執行下一個函式影片,讓事件無法連續觸發,

核心實作思路:利用回呼函式,添加一個變數來控制,鎖住函式和解鎖函式,

開始設定一個變數var flag= true;

If(flag){flag = false; do something}       關閉水龍頭

利用回呼函式影片執行完畢, flag = true     打開水龍頭

實體代碼塊:


2.3 回傳頂部

重要的事情再說一遍!一定要先分析清楚需求再下手去做!

  1. 需求分析:
1. 帶有影片的回傳頂部
2. 此時可以繼續使用我們封裝的影片函式
3. 只需要把所有的left 相關的值改為 跟 頁面垂直滾動距離相關就可以了
4. 頁面滾動了多少,可以通過 window.pageYOffset 得到
5. 最后是頁面滾動,使用 window.scroll(x,y) 

代碼實作

  //1. 獲取元素
        var sliderbar = document.querySelector('.slider-bar');
        var banner = document.querySelector('.banner');
        // banner.offestTop 就是被卷去頭部的大小 一定要寫到滾動的外面
        var bannerTop = banner.offsetTop
            // 當我們側邊欄固定定位之后應該變化的數值
        var sliderbarTop = sliderbar.offsetTop - bannerTop;
        // 獲取main 主體元素
        var main = document.querySelector('.main');
        var goBack = document.querySelector('.goBack');
        var mainTop = main.offsetTop;
        // 2. 頁面滾動事件 scroll
        document.addEventListener('scroll', function() {
                // console.log(11);
                // window.pageYOffset 頁面被卷去的頭部
                // console.log(window.pageYOffset);
                // 3 .當我們頁面被卷去的頭部大于等于了 172 此時 側邊欄就要改為固定定位
                if (window.pageYOffset >= bannerTop) {
                    sliderbar.style.position = 'fixed';
                    sliderbar.style.top = sliderbarTop + 'px';
                } else {
                    sliderbar.style.position = 'absolute';
                    sliderbar.style.top = '300px';
                }
                // 4. 當我們頁面滾動到main盒子,就顯示 goback模塊
                if (window.pageYOffset >= mainTop) {
                    goBack.style.display = 'block';
                } else {
                    goBack.style.display = 'none';
                }

            })
            // 3. 當我們點擊了回傳頂部模塊,就讓視窗滾動的頁面的最上方
        goBack.addEventListener('click', function() {
            // 里面的x和y 不跟單位的 直接寫數字即可
            // window.scroll(0, 0);
            // 因為是視窗滾動 所以物件是window
            animate(window, 0);
        });

3.移動端的觸摸螢屏事件

3.1 觸屏事件

一般來說移動端的js都兼容的比較不錯,

  1. touch事件一覽表

3.1 觸屏事件物件

TouchEvent 是一類描述手指在觸摸平面(觸摸屏、觸摸板等)的狀態變化的事件,這類事件用于描述一個或多個觸點,使開發者可以檢測觸點的移動,觸點的增加和減少,等等

touchstart、touchmove、touchend 三個事件都會各自有事件物件,

觸摸事件物件重點我們看三個常見物件串列:

注意哈在實際的開發中,最常用的還是targetTocuhes,因為平時我們都是給元素注冊觸摸事件

3.1 實作拖拽元素

  1. touchstart、touchmove、touchend可以實作拖動元素

  2. 但是拖動元素需要當前手指的坐標值 我們可以使用  targetTouches[0] 里面的pageX 和 pageY

  3. 移動端拖動的原理:    手指移動中,計算出手指移動的距離,然后用盒子原來的位置 + 手指移動的距離

  4. 手指移動的距離:  手指滑動中的位置 減去  手指剛開始觸摸的位置

    拖動元素三步曲:

    (1) 觸摸元素 touchstart: 獲取手指初始坐標,同時獲得盒子原來的位置

    (2) 移動手指 touchmove: 計算手指的滑動距離,并且移動盒子

    (3) 離開手指 touchend:

    注意: 手指移動也會觸發滾動螢屏所以這里要阻止默認的螢屏滾動 e.preventDefault();

示例代碼:

<body>
    <div></div>
    <script>
        // (1) 觸摸元素 touchstart:  獲取手指初始坐標,同時獲得盒子原來的位置
        // (2) 移動手指 touchmove:  計算手指的滑動距離,并且移動盒子
        // (3) 離開手指 touchend:
        var div = document.querySelector('div');
        var startX = 0; //獲取手指初始坐標
        var startY = 0;
        var x = 0; //獲得盒子原來的位置
        var y = 0;
        div.addEventListener('touchstart', function(e) {
            //  獲取手指初始坐標
            startX = e.targetTouches[0].pageX;
            startY = e.targetTouches[0].pageY;
            x = this.offsetLeft;
            y = this.offsetTop;
        });

        div.addEventListener('touchmove', function(e) {
            //  計算手指的移動距離: 手指移動之后的坐標減去手指初始的坐標
            var moveX = e.targetTouches[0].pageX - startX;
            var moveY = e.targetTouches[0].pageY - startY;
            // 移動我們的盒子 盒子原來的位置 + 手指移動的距離
            this.style.left = x + moveX + 'px';
            this.style.top = y + moveY + 'px';
            e.preventDefault(); // 阻止螢屏滾動的默認行為
        });
    </script>
</body>

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/141695.html

標籤:JavaScript

上一篇:JavaScript 基本常識

下一篇:JavaScript——WEBAPIS_有關于移動端特效,還有本地存盤

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more