JavaScript:PC端特效--緩動動畫

一、緩動效果原理

緩動動畫就是讓元素運動速度有所變化,最常見的就是讓元素慢慢停下來

思路:

  1. 讓盒子每次移動的距離慢慢變小,速度就會慢慢降下來
  2. 核心算法:(目標值-現在位置)/10作為每次移動距離的步長
  3. 停止條件:讓盒子位置等于目標位置就停止計時器

案例:點擊按鈕后盒子緩停

css:

div {position: absolute;left: 0;top: 40px;width: 200px;height: 200px;background-color: pink;
}

?HTML:

<div></div>
<button>點我開始走</button>

JavaScript:

function annimate(obj, target) {clearInterval(obj.timer);obj.timer = setInterval(function () {var step = (target - obj.offsetLeft) / 10;if (obj.offsetLeft == target) {clearInterval(obj.timer);}obj.style.left = obj.offsetLeft + step + 'px';}, 15)
}
var div = document.querySelector('div');
var button = document.querySelector('button');
button.addEventListener('click', function () {annimate(div, 500);
})

寫完運行發現,這個案例有小bug,它并沒有準準的停在我們設置的目標位置,因為它涉及到了除法,有小數點后就慢慢沒那么精確了

那么我們就把step向上取整,盡量避免小數運算,向上取整是因為能延緩速度的變化,讓緩動效果更加柔和

var step = Math.ceil(target - obj.offsetLeft) / 10;

不過這樣寫忽略了后退時的效果,比如

<div></div>
<button>點我到500</button>
<button>點我到800</button>
function annimate(obj, target) {clearInterval(obj.timer);obj.timer = setInterval(function () {var step = (target - obj.offsetLeft) / 10;if (obj.offsetLeft == target) {clearInterval(obj.timer);}obj.style.left = obj.offsetLeft + step + 'px';}, 15)
}
var div = document.querySelector('div');
var btn500 = document.querySelector('.btn500');
var btn800 = document.querySelector('.btn800');
btn500.addEventListener('click', function () {annimate(div, 500);
})
btn800.addEventListener('click', function () {annimate(div, 800);
})

在這個時候前進能準確到目標位置,但是后退時不能,按照上面修復bug的思路看,是取整出現問題了,和前面相似,后退時應該向下取整

那我們給step加上一個判斷條件,如果大于0則向上取整,小于0則向下取整

var step = (target - obj.offsetLeft) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);

二、動畫函數添加回調函數

回調函數原理:函數可以當成一個參數,把一個函數作為參數傳到另一個函數里面,那個函數執行完后再來執行傳進去的參數,這個過程叫回調

回調函數寫的位置:定時器結束的位置

?案例:在移動完后輸出你好

css:

* {margin: 0px;padding: 0px;
}div {position: absolute;left: 0;top: 40px;width: 200px;height: 200px;background-color: pink;
}

HTML:?

<div></div>
<button>點我到500</button>
<button>點我到800</button>

JavaScript:?

function annimate(obj, target) {clearInterval(obj.timer);obj.timer = setInterval(function () {var step = (target - obj.offsetLeft) / 10;if (obj.offsetLeft == target) {clearInterval(obj.timer);if (callback) {callback();}}obj.style.left = obj.offsetLeft + step + 'px';}, 15)
}
var div = document.querySelector('div');
var btn500 = document.querySelector('.btn500');
var btn800 = document.querySelector('.btn800');
btn500.addEventListener('click', function () {annimate(div, 800, function () {alert('你好');});
})
btn800.addEventListener('click', function () {annimate(div, 800, function () {alert('你好');});
})

三、動畫函數封裝到單獨JS文件里面

因為以后要常用動畫函數,所以我們把它封裝到JS文件里面,下次要用直接引用就可以了

?步驟:

  1. 單獨新建一個JS文件
  2. 把我們寫的這個函數復制進JS文件里
  3. 調用JS文件
  4. 直接調用動畫函數

案例:鼠標經過它后滑出來‘問題反饋’

css:

.sliderbar {position: relative;left: -9px;height: 40px;width: 40px;text-align: center;line-height: 40px;color: #fff;background-color: purple;
}.con {position: absolute;padding: 0 5px;left: -130px;height: 40px;width: 160px;background-color: purple;z-index: -1;
}

HTML:

記得不要忘記調用JS文件

<script src="annimater.js"></script>
<div class="sliderbar"><span>→</span><div class="con">問題反饋</div>
</div>

JavaScript:

var sliderbar = document.querySelector('.sliderbar');
var con = document.querySelector('.con');
sliderbar.addEventListener('mouseenter', function () {annimate(con, 40, function () {sliderbar.children[0].innerHTML = '←';})
})
sliderbar.addEventListener('mouseleave', function () {annimate(con, -160,, function () {sliderbar.children[0].innerHTML = '→';})
})

四、網頁特效案例

案例:網頁輪播圖

css:

.main {width: 980px;height: 455px;margin-left: 242px;
}.focus {position: relative;width: 715px;height: 455px;overflow: hidden;
}.focus ul {position: absolute;top: 0;left: 0;width: 1100%;
}.focus li {float: left;
}.focus img {/* width: 715px; */height: 455px;
}.lft,
.rit {background: rgba(72, 68, 69, .3);width: 15px;height: 20px;z-index: 999;display: none;
}.lft {position: absolute;top: 231px;left: 0;
}.rit {position: absolute;top: 231px;right: 0px;
}.lft a,
.rit a {color: #f9f9f9;
}.lft,
.rit a:hover {color: #ccc;
}.circle {position: absolute;bottom: 10px;left: 295px;
}.circle li {float: left;width: 8px;height: 8px;border: 2px solid rgba(255, 255, 255, .5);margin: 0 3px;border-radius: 50%;cursor: pointer;
}.current {background-color: #fff;
}

HTML:

<div class="focus fl"><div class="lft"><a href="javascript:;">&lt</a></div><div class="rit"><a href="javascript:;">&gt</a></div><ul><li><a href="#"><img src="images/loginbg.png" alt=""></a></li><li><a href="#"><img src="images/loginbg.png" alt=""></a></li><li><a href="#"><img src="images/loginbg.png" alt=""></a></li><li><a href="#"><img src="images/loginbg.png" alt=""></a></li><li><a href="#"><img src="images/loginbg.png" alt=""></a></li><li><a href="#"><img src="images/loginbg.png" alt=""></a></li></ul><ol class="circle"></ol>
</div>

JavaScript:

window.addEventListener('load', function () {var lft = document.querySelector('.lft');var rit = document.querySelector('.rit');var focus = document.querySelector('.focus');focus.addEventListener('mouseenter', function () {lft.style.display = 'block';rit.style.display = 'block';clearInterval(timer);timer = null;})focus.addEventListener('mouseleave', function () {lft.style.display = 'none';rit.style.display = 'none';timer = setInterval(function () {rit.click();}, 2000)})var ul = focus.querySelector('ul');var ol = focus.querySelector('.circle');for (var i = 0; i < ul.children.length; i++) {var li = document.createElement('li');li.setAttribute('index', i);ol.appendChild(li);li.addEventListener('click', function () {for (var i = 0; i < ol.children.length; i++) {ol.children[i].className = '';}this.className = 'current';var index = this.getAttribute('index');num = index;circle = index;var focusWidth = focus.offsetWidth;annimate(ul, -index * 1044);})}ol.children[0].className = 'current';var first = ul.children[0].cloneNode(true);ul.appendChild(first);var num = 0;var circle = 0;rit.addEventListener('click', function () {if (num == ul.children.length - 1) {ul.style.left = 0;num = 0}num++;annimate(ul, -num * 1044)circle++;if (circle == ol.children.length) {circle = 0;}circleChange();})lft.addEventListener('click', function () {if (num == 0) {num = ul.children.length - 1;ul.style.left = -num * 1044 + 'px';}num--;annimate(ul, -num * 1044)circle--;if (circle < 0) {circle = ol.children.length - 1;}circleChange();})function circleChange() {for (var i = 0; i < ul.children.length; i++) {ol.children[i].className = '';ol.children[circle].className = 'current';}}var timer = setInterval(function () {rit.click();}, 2000)
})

?

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

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

相關文章

高效管理多后端服務:Nginx 配置與實踐指南

在現代的 Web 開發和運維中&#xff0c;一個系統往往由多個后端服務組成&#xff0c;每個服務負責不同的功能模塊。例如&#xff0c;一個電商網站可能包括用戶服務、訂單服務和支付服務&#xff0c;每個服務都運行在獨立的服務器或容器中。為了高效地管理這些服務并提供統一的訪…

2025年PMP 學習二十一 14章 項目立項管理

2025年PMP 學習二十一 14章 項目立項管理 項目立項管理 項目建議 (Project Proposal)項目可行性分析 (Project Feasibility Analysis)項目審批 (Project Approval)項目招投標 (Project Tendering)項目合同談判和簽訂 (Project Contract Negotiation and Signing) 文章目錄 20…

用Caffeine和自定義注解+AOP優雅實現本地防抖接口限流

一、背景與需求 在實際項目開發中&#xff0c;經常遇到接口被前端高頻觸發、按鈕被多次點擊或者接口重復提交的問題&#xff0c;導致服務壓力變大、數據冗余、甚至引發冪等性/安全風險。 常規做法是前端節流/防抖、后端用Redis全局限流、或者API網關限流。但在很多場景下&…

【IP101】紋理特征提取與分析:從統計方法到深度表征的系統解析

紋理分析詳解 &#x1f3a8; 紋理分析就像是給圖像做"指紋識別"&#xff01;每種紋理都有其獨特的"指紋"&#xff0c;就像木紋的條紋、布料的編織、草地的隨機分布一樣。讓我們一起來探索這個既有趣又實用的圖像處理領域吧&#xff01; 目錄 1. 什么是紋理…

機器學習中采樣哪些事

在機器學習中采樣主要分為兩種&#xff0c;過采樣&#xff08;Oversample&#xff09;和欠采樣(Undersample)。過采樣就是通過增加少數類樣本的數量來平衡數據集。而欠采樣就是通過減少多數類樣本的數量來平衡數據集。 通常在進行采樣中以下是幾種常用的方法: 1. 隨機采樣 隨…

fastadmin 數據導出,設置excel行高和限制圖片大小

fastadmin默認導出圖片全部都再一塊&#xff0c;而且不在單元格里 話不多說&#xff0c;上代碼 修改文件的路徑&#xff1a; /public/assets/js/require-table.js exportOptions: {fileName: export_ Moment().format("YYYY-MM-DD"),preventInjection: false,mso…

鴻蒙OSUniApp開發的商品詳情展示頁面(鴻蒙系統適配版)#三方框架 #Uniapp

使用UniApp開發的商品詳情展示頁面&#xff08;鴻蒙系統適配版&#xff09; 前言 隨著移動電商的普及&#xff0c;一個體驗良好的商品詳情頁對于提高用戶轉化率至關重要。本文將分享我在使用UniApp開發商品詳情頁時的實踐經驗&#xff0c;并特別關注如何適配鴻蒙系統&#xf…

redis中key的過期和淘汰

一、過期&#xff08;redis主動刪除&#xff09; 設置了ttl過期時間的key&#xff0c;在ttl時間到的時候redis會刪除過期的key。但是redis是惰性過期。惰性過期&#xff1a;redis并不會立即刪除過期的key&#xff0c;而是會在獲取key的時候判斷key是否過期&#xff0c;如果發現…

Qwen3 - 0.6B與Bert文本分類實驗:深度見解與性能剖析

Changelog [25/04/28] 新增Qwen3-0.6B在Ag_news數據集Zero-Shot的效果。新增Qwen3-0.6B線性層分類方法的效果。調整Bert訓練參數&#xff08;epoch、eval_steps&#xff09;&#xff0c;以實現更細致的觀察&#xff0c;避免嚴重過擬合的情況。 TODO&#xff1a; 利用Qwen3-0.6…

HTML應用指南:利用POST請求獲取全國京東快遞服務網點位置信息

京東快遞作為中國領先的智能供應鏈與綜合物流服務提供商,自2007年成立以來,始終致力于通過技術創新與高效運營,為客戶提供安全、可靠、快速的物流解決方案。京東快遞依托京東集團的強大資源支持,憑借其自營倉儲、干線運輸、末端配送一體化的物流網絡,在激烈的市場競爭中脫…

js中eval的用法風險與替代方案全面解析

1. 前言 在 JavaScript 里&#xff0c;eval是一個既強大又充滿爭議的函數。它為開發者提供了一種動態執行字符串代碼的能力&#xff0c;在某些特定場景下能發揮出獨特的作用。然而&#xff0c;由于其特殊的運行機制&#xff0c;也帶來了諸多潛在的風險和問題。本文將深入探討e…

antd樹結構

一、場景實現 1、左側為查詢條件&#xff0c;查詢條件為樹和多選。點擊查詢條件在右上方顯示搜索條件的內容&#xff0c;右上方查詢條件 tag 刪除后&#xff0c;左側條件也對應刪除。 2、樹結構&#xff1a;默認第一層下所有節點都展開。 1、頁面效果圖 2、查詢效果圖 二、前端…

Jenkins 安裝與配置指南

Jenkins 安裝與配置指南&#xff08;MD 示例&#xff09; markdown Jenkins 安裝與配置指南 ## 一、環境準備 1. **系統要求** - 操作系統&#xff1a;Linux/macOS/Windows - Java 版本&#xff1a;JDK 8 或更高&#xff08;建議 JDK 11&#xff09;2. **安裝方式** - **L…

[Linux性能優化] 線程卡頓優化。Linux加入USB(HID)熱插拔線程占用CPU優化。Linux中CPU使用率過高優化

文章目錄 [Linux性能優化] 線程卡頓優化。0、省流版本一、問題定位&#xff1a;CPU 資源分析二、線程卡頓現場復現線程優化前圖片 三、線程卡頓優化方向1.如果是輪詢方式2.如果是事件驅動方式 四、修改方式線程優化后圖片 [Linux性能優化] 線程卡頓優化。 0、省流版本 如果采…

ip與mac-數據包傳輸過程學習

你管這破玩意叫網絡&#xff1f; 內容來源于飛天閃客&#xff0c;以前沒有學習過網絡的相關基礎知識&#xff0c;只會去瞎設置&#xff0c;現在終于是弄明白了。 多臺電腦之間想要通信&#xff0c;可以直接通過一條網線進行連接。但是隨著網線的增加&#xff0c;這個就會比較…

數值分析知識重構

數值分析知識重構 一 Question 請構造一下數值分析中的誤差概念以及每一個具體數值方法的誤差是如何估計的&#xff1f; 二 Question 已知 n 1 n1 n1個數據點 ( x i , y i ) , i 0 , 1 , ? , n (x_i,y_i),i0,1,\cdots,n (xi?,yi?),i0,1,?,n,請使用多種方法建立數據之間…

使用 Qt QGraphicsView/QGraphicsScene 繪制色輪

使用 Qt QGraphicsView/QGraphicsScene 繪制色輪 本文介紹如何在 Qt 中利用 QGraphicsView 和 QGraphicsScene 實現基礎圓形繪制&#xff0c;以及進階的色輪&#xff08;Color Wheel&#xff09;效果。 色輪是色彩選擇器的常見控件&#xff0c;廣泛應用于圖形設計、繪畫和 UI …

移除鏈表元素數據結構oj題(力扣題206)

目錄 題目描述&#xff1a; 題目解讀&#xff08;分析&#xff09; 解決代碼 題目描述&#xff1a; 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。 題目解讀&#xff08;分析&#…

GLPK(GNU線性規劃工具包)中建模語言MathProg的使用

GNU MathProg是一種用于描述線性數學規劃模型的建模語言。用GNU MathProg語言編寫的模型描述由一組語句和數據塊組成。 在MathProg中&#xff0c;模型以集合、參數、變量、約束和目標(sets, parameters, variables, constraints, objectives稱為模型對象)的形式進行描述。 在Ma…

《Python星球日記》 第77天:模型部署與總結

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、模型部署技術1. 模型文件導出不同模型格式對比2. 使用Flask構建RESTful API3. 使用FastAPI構建高性能API4. 部署優化與最佳實踐二、部署架構…