js(Dom+Bom)第七天(2)

webAPI

01-動畫封裝

  1. 應用到的知識點

    • 點擊事件

    • 給元素設置一個絕對定位

    • 定時器(setInterval)

  2. 封裝動畫1的步驟:

    • 讓元素設置為絕定位
    • 設置元素的開始位置(從哪開始移動)
    • 設置元素的目標位置(移動到哪)
    • 設置元素每次移動的距離
    • 設置元素每次移動的時間間隔(越短越好)
  3. 封裝動畫1遇到的問題

    • 如果快速的點擊按鈕,動畫會有一個加速的效果

      原因: 多次點擊按鈕的時候,在程序中相當于開啟了多個定時器導致的
      
    • 如何解決?

      解決途徑: 不管點擊多次按鈕,始終只有一個定時器
      
    • 解決問題的核心步驟

      1.var timeID = null; 設置為一個全局的公共變量2. 判斷是否存在,如果存在就停住定時器,然后子在開啟新的定時器(排他思想)
      //先判斷程序中是否有定時器
      if(timeID != null) {//代表已經存在定時器, 立即將存在的定時器刪除掉clearInterval(timeID);timeID = null;
      }
      
  4. 將動畫2封裝成一個函數,方便以后調用

    這個函數有5個參數:
    哪個元素設置動畫,
    元素的開始位置
    元素的結束位置
    元素每次移動的距離
    元素每次移動的時間間隔function animation(element, current, target, step, time) {//先判斷程序中是否有定時器if(timeID != null) {//代表已經存在定時器, 立即將存在的定時器刪除掉clearInterval(timeID);timeID = null;}timeID = setInterval(function(){//開始移動元素的位置if(current >= target) {current = target;clearInterval(timeID);}else {current += step;}//設置box的位置element.style.left = current + 'px';}, time);
    }
    
  5. 如果將動畫封裝成一個函數后,每次點擊都是從開始的位置 0 重新執行程序

    • 怎么解決?

      讓元素的 current 值 始終 和 元素實際移動后的位置保持一致
      
    • 在解決方案中有什么問題?

      如何獲取當前元素的位置?
      DOM.offsetLeft ----> 左側的距離位置
      DOM.offsetTop ----> 上邊的距離current = 當前元素的位置;
      
    • 最后的解決方案

      在函數中設置:current = element.offsetLeft;
      
  6. 為什么當頁面中出現多個元素的時候,動畫只能讓最后一個元素執行動畫?

    • 為什么?

      點擊按鈕的時候, 程序中共用了一個定時器導致的
      
    • 怎么解決

      每一個元素(對象)應該對應一個定時器在每一個timeID綁定一個對象function animation(element, current, target, step, time) {//讓curren 值始終和當前元素的位置保持一致current = element.offsetLeft;//先判斷程序中是否有定時器if(element.timeID != null) {//代表已經存在定時器, 立即將存在的定時器刪除掉clearInterval(element.timeID);element.timeID = null;}element.timeID = setInterval(function(){//開始移動元素的位置if(current >= target) {current = target;clearInterval(element.timeID);}else {current += step;}//設置box的位置element.style.left = current + 'px';}, time);
      }
      
  7. 為什么元素從右向左移動的時候沒有動畫效果了?

    • 為什么?

      我們在程序中原來只是簡單的判斷 開始位置和結束位置 值的大小,而現在 向左移動的時候,開始位置的值就是比目標位置的值要大,所以動畫就停止了條件判斷寫的有問題:if(current >= target) {current = target;clearInterval(element.timeID);}
      
    • 怎么解決?

      應該是求兩點之間的距離 和 每次移動的距離比較大小1.在確定當前位置是否移動到了終點位置(目標位置), 要通過計算兩點之間的距離實現
      if(Math.abs(target - current) <= Math.abs(step)) {current = target;clearInterval(element.timeID);
      }else {current += step;
      }2.當元素向左移動的時候,保證每次移動的距離  step 是一個負數(向左移動為負)//開始移動元素的位置
      if(current > target) {// 設置為負數step = -Math.abs(step);
      }
      
  8. 動畫的最后一個問題,動畫沒有執行完,又可以執行另外一個動畫

    設置一個標志位(節流閥)
    

02-BOM中獲取元素的信息

  • 難點在哪?

    這個知識點容易和前面鼠標位置信息混淆
    
  • 復習獲取鼠標位置信息

    • 怎么獲取鼠標位置信息?

      通過事件對象參數獲取
      
    • 獲取鼠標的坐標信息

      • 事件對象參數.clientX [獲取鼠標的橫坐標, 相對可視區域的]
      • 事件對象參數.pageX [獲取鼠標的橫坐標, 相對整個頁面,包括滾動條出去的位置]
      • 事件對象參數.screenX [獲取鼠標的橫坐標, 相對整個屏幕]
      • 事件對象參數.offsetX [獲取鼠標的橫坐標, 相對當前事件源]
  • 獲取頁面中元素的相關信息

    • offset系列的

      • DOM.offsetLeft : 獲取元素在網頁中的位置信息
      • DOM.offsetTop : 獲取元素在網頁中的位置信息
      • DOM.offsetWidth : 獲取元素的寬度 ( 內容區域 + 邊框 + 內邊距 )
      • DOM.offsetHeight: 獲取元素的高度 (內容區域 + 邊框 + 內邊距)
    • client系列

      • DOM.clientLeft : 元素左邊框的寬度
      • DOM.clientTop : 元素上邊框寬度
      • DOM.clientWidth: 元素的寬度(內容器區域 + 內邊距)
      • DOM.clientHeight: 元素的高度(內容器區域 + 內邊距)
    • scroll系列

      • DOM.scrollLeft : 元素內容區域滾動出去的距離(水平距離) [注冊一個滾動的事件 onscroll]

      • DOM.scrollTop: 元素內容區域滾動出去的距離(垂直距離) [注冊一個滾動的事件 onscroll]

        //注冊一個滾動事件
        div.onscroll = function() {console.log(this.scrollTop);
        }
        
      • DOM.scrollWidth : 元素元素寬度(超出盒子寬度 + 左padding)

      • DOM.scrollHeight: 元素元素高度(超出盒子高度 + 上下padding)

03-拖拽案例

  • 鼠標按下時候的事件

    onmousedown
    
  • 鼠標抬起時候的事件

    onmouseup
    

問題:

  1. 改變元素的位置:
    • 相對定位
    • 絕對定位(有一個參照元素 + 脫標)
    • 固定定位
    • margin
    • padding
    • 2d位移
    • 3d位移
  2. offsetleft
    • 就是用來保存元素位置信息的
    • 不能設置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248180.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鏈表中環的入口結點

題目描述 給一個鏈表&#xff0c;若其中包含環&#xff0c;請找出該鏈表的環的入口結點&#xff0c;否則&#xff0c;輸出null。 分析 第一步&#xff1a;確定一個鏈表中是否有環 我們可以用兩個指針來解決&#xff0c;定義兩個指針&#xff0c;同時從鏈表的頭結點觸發&#xf…

java 線程之線程狀態

Thread 類中的線程狀態&#xff1a; public enum State {NEW,//新建RUNNABLE,// 執行態BLOCKED, //等待鎖&#xff08;在獲取鎖的池子里&#xff09;WAITING,//等待狀態TIMED_WAITING,//定時等待TERMINATED; //終止 } 創建狀態&#xff08;NEW&#xff09;&#xff1a;當一個線…

目標元素拖動

<div class"box"><div class"title">拖拽效果</div></div>* {margin: 0;padding: 0;}.box {width: 350px;height: 300px;border: 1px solid #ccc;position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);cursor…

操作系統原理之內存管理(第四章第二部分)

一、基本分頁存儲管理方式 1、分?存儲管理的基本原理&#xff1a; 頁&#xff1a;將?個進程的邏輯地址空間分成若?個??相等的?頁框&#xff1a;將物理內存空間分成與???相同的若?個存儲塊分?存儲&#xff1a;將進程中的若??分別裝?多個可以不相鄰的?框中頁內碎片…

C#代碼總結02---使用泛型來獲取Asp前臺頁面全部控件,并進行屬性修改

該方法&#xff1a;主要用于對前臺頁面的不同類型&#xff08;TextBox、DropDownList、等&#xff09;或全部控件進行批量操作&#xff0c;用于批量修改其屬性&#xff08;如&#xff0c;Text、Enable&#xff09;。 private void GetControlList<T>(ControlCollection c…

d3.js 教程 模仿echarts柱狀圖

由于最近工作不是很忙&#xff0c;隧由把之前的charts項目用d3.js重寫的一下&#xff0c;其實d3.js文檔很多&#xff0c;但是入門不是很難&#xff0c;可是想真的能做一個完成的&#xff0c;交互良好的圖還是要下一番功夫的。今天在echarts找到了一個柱狀圖&#xff0c;如圖。 …

簡單的動畫函數封裝(2)

<div></div><!-- <span></span> --><button class"btn1">點擊500</button><button class"btn2">點擊800</button>div{width: 100px;height: 100px;background-color: red;position: absolute;top: …

【蔡勒公式 】根據給定的年月日求出對應星期幾

蔡勒公式 蔡勒&#xff08;Zeller&#xff09;公式&#xff0c;是一個計算星期的公式&#xff0c;隨便給一個日期&#xff0c;就能用這個公式推算出是星期幾。時間復雜度&#xff1a;O(1)。具體的在紅書P229有。 若要計算的日期是在1582年10月4日或之前&#xff0c;公式則為&am…

MFC的程序,不想顯示窗口,任務欄里也不顯示

在dialog的oninitdialog里設置如下屬性&#xff0c;很簡單&#xff0c;網上一些亂七八糟的做法&#xff0c;一行代碼就能搞定啊 SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,SWP_HIDEWINDOW); ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); 轉載于:https://www.cnblog…

放大鏡制作(2)—此方法比較容易理解

<div class"box" id"box"><!--左側的盒子--><div class"left_img"><!--圖片--><img src"images/small.jpg" class"aaa" alt"小圖片"/><!--黃色小盒子--><div class"…

call / apply / bind

對于 call / apply / bind 來說&#xff0c;他們的首要目的是用于改變執行上下文的 this 指針。 call / apply 對 call / apply 的使用&#xff0c;一般都如下&#xff0c;用于改變執行環境的上下文。只是 call 接受的是一個一個的參數&#xff0c;而 apply 則是接受的是一個參…

js(Dom+Bom)第八天—Swiper(插件)

Swiper插件(庫) 01-基本介紹 Swiper 是一款免費以及輕量級的移動設備觸控滑塊的js框架&#xff0c;使用硬件加速過渡&#xff08;如果該設備支持的話&#xff09;。主要使用于移動端的網站、移動web apps&#xff0c;native apps和hybrid apps。主要是為IOS而設計的&#xff…

第七節:EF Core調用SQL語句和存儲過程

一. 查詢類(FromSql) 1.說明 A. SQL查詢必須返回實體的所有屬性字段。 B. 結果集中的列名必須與屬性映射到的列名相匹配。 C. SQL查詢不能包含關聯數據 D. 除Select以為的其它SQL語句無法運行。 2.調用SQL語句的幾種情況 A. 基本的原生SQL查詢 B. 利用$內插語法進行傳遞 C. 原生…

沒用的一些水貨

1. 不遞歸的子函數加上inline會跑的很快。 2. 在稠密圖中用dijkstra堆優化會導致跑的很慢。 3. 連著開幾個數組的話&#xff0c;有可能越界了評測機卻返回WA。 4. 如果你用的Dev-C&#xff0c;那么有的時候會出現一些莫名其妙的編譯錯誤。請檢查是否存在未關閉的代碼生成的.exe…

js(Dom+Bom)第八天

JavaScript 移動端事件介紹 touch事件類型 移動設備上無法使用鼠標&#xff0c;當手指按下屏幕的時候會觸發 click,mousedown,mouseup事件&#xff0c;但是在移動設備上有專門的事件&#xff1a; touch 備注&#xff1a; 在移動端touch事件需要通過事件監聽的方式添加touchsta…

程序員計算器HEX、EDC、OCT等等的意思

binary 二進制 對應的是 BINoctal 八進制的 ---- OCThexadecimal 十六進制的 --- HEXdecimal 十進制的 -- DEC 轉載于:https://www.cnblogs.com/132818Creator/p/11459984.html

為什么mysql 5.7.24啟停不顯示錯誤信息?log-error_verbosity參數

關鍵詞&#xff1a;log-error_verbosity &#xff0c;mysql啟停沒有信息&#xff0c;mysql啟停不顯示錯誤信息&#xff0c;mysql不顯示啟停信息 原因就是因為 log-error_verbosity 2 被設置成了1/2&#xff0c;需要設置成3才行。 轉載自&#xff1a;https://www.cnblogs.com/k…

ASP.NET Core 3.0中使用動態控制器路由

原文&#xff1a;Dynamic controller routing in ASP.NET Core 3.0 作者&#xff1a;Filip W 譯文&#xff1a;https://www.cnblogs.com/lwqlun/p/11461657.html 譯者&#xff1a;Lamond Lu 譯者注 今天在網上看到了這篇關于ASP.NET Core動態路由的文章&#xff0c;感覺蠻有意思…

Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet

一個地圖上有若干障礙&#xff0c;問允許出現一個障礙的最大子矩形為多大&#xff1f; 最大子矩形改編 #include<bits/stdc.h> using namespace std; #define rep(i, j, k) for (int i int(j); i < int(k); i) #define dwn(i, j, k) for (int i int(j); i > int…