PC端和移动端网页特效,fastclick插件,Swiper插件,Bootstrap等框架,本地存储
?
目錄
PC 端網頁特效
元素偏移量 offset 系列
1.offset 系列常用屬性
2.offset 與 style 區別
?3.計算鼠標在盒子內的坐標
4.模態框拖拽
?5.京東商品放大鏡
元素可視區 client 系列
1. client 系列常用屬性
2.flexible.js分析(移動適配rem)
3.立即執行函數
4.像素比和pageshow事件
元素滾動 scroll 系列
1. scroll 系列屬性
?2.被頁面卷去的頭部
3.仿淘寶固定側邊欄
三大系列總結
mouseenter 和mouseover的區別
?動畫函數封裝
1.動畫原理
2.動畫函數簡單封裝
3.動畫函數給不同元素記錄不同定時器
4.緩動動畫
5.緩動動畫多個目標值之間移動
6.動畫函數添加回調函數并封裝到單獨的js文件
常見網頁特效案例
1.網頁輪播圖
2.返回頂部
移動端網頁特效
觸屏事件
1.觸屏事件touch
2.觸摸事件對象(TouchEvent)
3.移動端拖動元素
移動端常見特效
1.移動端輪播圖
2.classList 屬性
移動端常用開發插件
click 延時解決方案:
Swiper 插件的使用(輪播圖)
移動端常用開發框架
Bootstrap 框架
本地存儲
window.sessionStorage
window.localStorage
?記住用戶名
PC 端網頁特效
元素偏移量 offset 系列
offset 翻譯過來就是偏移量, 我們使用 offset 系列相關屬性可以動態的得到該元素的位置(偏移)、大小等。 ?
可以獲得元素距離帶有定位父元素的位置 ?
可以獲得元素自身的大小(寬度高度)
注意: 返回的數值都不帶單位。
1.offset 系列常用屬性
<body><div class="father"><div class="son"></div></div><div class="w"></div><script>// offset 系列var father = document.querySelector('.father');var son = document.querySelector('.son');// 1.可以得到元素的偏移 位置,返回的不帶單位的數值 console.log(father.offsetTop);console.log(father.offsetLeft);// 它以帶有定位的父親為準,如果沒有父親或者父親沒有定位 則以 body 為準console.log(son.offsetLeft);var w = document.querySelector('.w');// 2.可以得到元素的大小:寬度和高度,是包含padding + border + width console.log(w.offsetWidth);console.log(w.offsetHeight);// 3. 返回帶有定位的父親 否則返回的是bodyconsole.log(son.offsetParent); // 返回帶有定位的父親 否則返回的是bodyconsole.log(son.parentNode); // 返回父親 是最近一級的父親 親爸爸 不管父親有沒有定位</script> </body>2.offset 與 style 區別
?3.計算鼠標在盒子內的坐標
<body><div class="box"></div><script>// 我們在盒子內點擊, 想要得到鼠標距離盒子左右的距離。// 首先得到鼠標在頁面中的坐標( e.pageX, e.pageY)// 其次得到盒子在頁面中的距離(box.offsetLeft, box.offsetTop)// 用鼠標距離頁面的坐標減去盒子在頁面中的距離, 得到 鼠標在盒子內的坐標var box = document.querySelector('.box');box.addEventListener('mousemove', function(e) {// console.log(e.pageX);// console.log(e.pageY);// console.log(box.offsetLeft);var x = e.pageX - this.offsetLeft;var y = e.pageY - this.offsetTop;this.innerHTML = 'x坐標是' + x + ' y坐標是' + y;})</script> </body>4.模態框拖拽
點擊彈出層, 會彈出模態框, 并且顯示灰色半透明的遮擋層。
點擊關閉按鈕,可以關閉模態框,并且同時關閉灰色半透明遮擋層。
鼠標放到模態框最上面一行,可以按住鼠標拖拽模態框在頁面中移動。
鼠標松開,可以停止拖動模態框移動。
<style>.login-header {width: 100%;text-align: center;height: 30px;font-size: 24px;line-height: 30px;}ul,li,ol,dl,dt,dd,div,p,span,h1,h2,h3,h4,h5,h6,a {padding: 0px;margin: 0px;}.login {display: none;width: 512px;height: 280px;position: fixed;border: #ebebeb solid 1px;left: 50%;top: 50%;background: #ffffff;box-shadow: 0px 0px 20px #ddd;z-index: 9999;transform: translate(-50%, -50%);}.login-title {width: 100%;margin: 10px 0px 0px 0px;text-align: center;line-height: 40px;height: 40px;font-size: 18px;position: relative;cursor: move;}.login-input-content {margin-top: 20px;}.login-button {width: 50%;margin: 30px auto 0px auto;line-height: 40px;font-size: 14px;border: #ebebeb 1px solid;text-align: center;}.login-bg {display: none;width: 100%;height: 100%;position: fixed;top: 0px;left: 0px;background: rgba(0, 0, 0, .3);}a {text-decoration: none;color: #000000;}.login-button a {display: block;}.login-input input.list-input {float: left;line-height: 35px;height: 35px;width: 350px;border: #ebebeb 1px solid;text-indent: 5px;}.login-input {overflow: hidden;margin: 0px 0px 20px 0px;}.login-input label {float: left;width: 90px;padding-right: 10px;text-align: right;line-height: 35px;height: 35px;font-size: 14px;}.login-title span {position: absolute;font-size: 12px;right: -20px;top: -30px;background: #ffffff;border: #ebebeb solid 1px;width: 40px;height: 40px;border-radius: 20px;}</style> </head><body><div class="login-header"><a id="link" href="javascript:;">點擊,彈出登錄框</a></div><div id="login" class="login"><div id="title" class="login-title">登錄會員<span><a id="closeBtn" href="javascript:void(0);" class="close-login">關閉</a></span></div><div class="login-input-content"><div class="login-input"><label>用戶名:</label><input type="text" placeholder="請輸入用戶名" name="info[username]" id="username" class="list-input"></div><div class="login-input"><label>登錄密碼:</label><input type="password" placeholder="請輸入登錄密碼" name="info[password]" id="password" class="list-input"></div></div><div id="loginBtn" class="login-button"><a href="javascript:void(0);" id="login-button-submit">登錄會員</a></div></div><!-- 遮蓋層 --><div id="bg" class="login-bg"></div><script>// 點擊彈出層, 模態框和遮擋層就會顯示出來 display:block;// 點擊關閉按鈕,模態框和遮擋層就會隱藏起來 display:none;// 在頁面中拖拽的原理: 鼠標按下并且移動, 之后松開鼠標// 觸發事件是鼠標按下 mousedown, 鼠標移動mousemove 鼠標松開 mouseup// 拖拽過程: 鼠標移動過程中,獲得最新的值賦值給模態框的left和top值, 這樣模態框可以跟著鼠標走了// 鼠標按下觸發的事件源是 最上面一行,就是 id 為 title // 鼠標的坐標 減去 鼠標在盒子內的坐標, 才是模態框真正的位置。// 鼠標按下,我們要得到鼠標在盒子的坐標。// 鼠標移動,就讓模態框的坐標 設置為 : 鼠標坐標 減去盒子坐標即可,注意移動事件寫到按下事件里面。// 鼠標松開,就停止拖拽,就是可以讓鼠標移動事件解除 // 1. 獲取元素var login = document.querySelector('.login');var mask = document.querySelector('.login-bg');var link = document.querySelector('#link');var closeBtn = document.querySelector('#closeBtn');var title = document.querySelector('#title');// 2. 點擊彈出層這個鏈接 link 讓mask 和login 顯示出來link.addEventListener('click', function() {mask.style.display = 'block';login.style.display = 'block';})// 3. 點擊 closeBtn 就隱藏 mask 和 login closeBtn.addEventListener('click', function() {mask.style.display = 'none';login.style.display = 'none';})// 4. 開始拖拽// (1) 當我們鼠標按下, 就獲得鼠標在盒子內的坐標title.addEventListener('mousedown', function(e) {var x = e.pageX - login.offsetLeft;var y = e.pageY - login.offsetTop;// (2) 鼠標移動的時候,把鼠標在頁面中的坐標,減去 鼠標在盒子內的坐標就是模態框的left和top值document.addEventListener('mousemove', move)function move(e) {login.style.left = e.pageX - x + 'px';login.style.top = e.pageY - y + 'px';}// (3) 鼠標彈起,就讓鼠標移動事件移除document.addEventListener('mouseup', function() {document.removeEventListener('mousemove', move);})})</script> </body>?5.京東商品放大鏡
整個案例可以分為三個功能模塊
先獲取元素
<div class="preview_img"><img src="upload/s3.png" alt=""><div class="mask"></div><div class="big"><img src="upload/big.jpg" alt="" class="bigImg"></div></div> var preview_img = document.querySelector('.preview_img'); //包括圖片和遮擋層的盒子var mask = document.querySelector('.mask'); //遮擋層var big = document.querySelector('.big'); //旁邊展示圖片的大盒子(1)鼠標經過小圖片盒子, 黃色的遮擋層 和 大圖片盒子顯示,離開隱藏2個盒子功能
//preview_img包括圖片和遮擋層的盒子//mask遮擋層//big展示圖片的大盒子// 1. 當我們鼠標經過 preview_img 就顯示和隱藏 mask 遮擋層 和 big 大盒子preview_img.addEventListener('mouseover', function() {mask.style.display = 'block';big.style.display = 'block';})preview_img.addEventListener('mouseout', function() {mask.style.display = 'none';big.style.display = 'none';})(2)黃色的遮擋層跟隨鼠標功能。
(3)移動黃色遮擋層,大圖片跟隨移動功能。
// 2. 鼠標移動的時候,讓黃色的盒子跟著鼠標來走preview_img.addEventListener('mousemove', function(e) {// (1). 先計算出鼠標在盒子內的坐標var x = e.pageX - this.offsetLeft;var y = e.pageY - this.offsetTop;// console.log(x, y);// (2) 減去盒子高度 300的一半 是 150 就是我們mask 的最終 left 和top值了// (3) 我們mask 移動的距離var maskX = x - mask.offsetWidth / 2;var maskY = y - mask.offsetHeight / 2;// (4) 如果x 坐標小于了0 就讓他停在0 的位置// 遮擋層的最大移動距離var maskMax = preview_img.offsetWidth - mask.offsetWidth;if (maskX <= 0) {maskX = 0;} else if (maskX >= maskMax) {maskX = maskMax;}if (maskY <= 0) {maskY = 0;} else if (maskY >= maskMax) {maskY = maskMax;}mask.style.left = maskX + 'px';mask.style.top = maskY + 'px';// 3. 大圖片的移動距離 = 遮擋層移動距離 * 大圖片最大移動距離 / 遮擋層的最大移動距離// 大圖var bigIMg = document.querySelector('.bigImg');// 大圖片最大移動距離var bigMax = bigIMg.offsetWidth - big.offsetWidth;// 大圖片的移動距離 X Yvar bigX = maskX * bigMax / maskMax;var bigY = maskY * bigMax / maskMax;bigIMg.style.left = -bigX + 'px';bigIMg.style.top = -bigY + 'px';})元素可視區 client 系列
client 翻譯過來就是客戶端,我們使用 client 系列的相關屬性來獲取元素可視區的相關信息。通過 client 系列的相關屬性可以動態的得到該元素的邊框大小、元素大小等
1. client 系列常用屬性
?
2.flexible.js分析(移動適配rem)
(function flexible(window, document) {// 獲取的html 的根元素var docEl = document.documentElement// dpr 物理像素比var dpr = window.devicePixelRatio || 1// adjust body font size 設置我們body 的字體大小function setBodyFontSize() {// 如果頁面中有body 這個元素 就設置body的字體大小if (document.body) {document.body.style.fontSize = (12 * dpr) + 'px'} else {// 如果頁面中沒有body 這個元素,則等著 我們頁面主要的DOM元素加載完畢再去設置body// 的字體大小document.addEventListener('DOMContentLoaded', setBodyFontSize)}}setBodyFontSize();// set 1rem = viewWidth / 10 設置我們html 元素的文字大小function setRemUnit() {var rem = docEl.clientWidth / 10docEl.style.fontSize = rem + 'px'}setRemUnit()// reset rem unit on page resize 當我們頁面尺寸大小發生變化的時候,要重新設置下rem 的大小window.addEventListener('resize', setRemUnit)// pageshow 是我們重新加載頁面觸發的事件window.addEventListener('pageshow', function(e) {// e.persisted 返回的是true 就是說如果這個頁面是從緩存取過來的頁面,也需要從新計算一下rem 的大小if (e.persisted) {setRemUnit()}})// detect 0.5px supports 有些移動端的瀏覽器不支持0.5像素的寫法if (dpr >= 2) {var fakeBody = document.createElement('body')var testElement = document.createElement('div')testElement.style.border = '.5px solid transparent'fakeBody.appendChild(testElement)docEl.appendChild(fakeBody)if (testElement.offsetHeight === 1) {docEl.classList.add('hairlines')}docEl.removeChild(fakeBody)} }(window, document))3.立即執行函數
主要作用: 創建一個獨立的作用域。 避免了命名沖突問題
<script>// 1.立即執行函數: 不需要調用,立馬能夠自己執行的函數function fn() {console.log(1);}fn();// 2. 寫法 也可以傳遞參數進來// 1.(function() {})() 或者 2. (function(){}());(function(a, b) {console.log(a + b);var num = 10;})(1, 2); // 第二個小括號可以看做是調用函數(function sum(a, b) {console.log(a + b);var num = 10; // 局部變量}(2, 3));// 3. 立即執行函數最大的作用就是 獨立創建了一個作用域, //里面所有的變量都是局部變量 不會有命名沖突的情況</script>4.像素比和pageshow事件
? ?下面三種情況都會刷新頁面都會觸發 load 事件。
? ? 1.a標簽的超鏈接
? ? 2.F5或者刷新按鈕(強制刷新)
? ? 3.前進后退按鈕
? ? ? ? 但是 火狐中,有個特點,有個“往返緩存”,這個緩存中不僅保存著頁面數據,還保存了DOM和JavaScript的狀態;實際上是將整個頁面都保存在了內存里。
? ? ? ?所以此時后退按鈕不能刷新頁面。
? ? ? ?此時可以使用 pageshow事件來觸發。,這個事件在頁面顯示時觸發,無論頁面是否來自緩存。在重新加載頁面中,pageshow會在load事件觸發后觸發;根據事件對象中的persisted來判斷是否是緩存中的頁面觸發的pageshow事件,注意這個事件給window添加?
<body><script>// console.log(window.devicePixelRatio);window.addEventListener('pageshow', function() {alert(11);})</script><a href="http://www.itcast.cn">鏈接</a> </body>元素滾動 scroll 系列
1. scroll 系列屬性
?2.被頁面卷去的頭部
如果瀏覽器的高(或寬)度不足以顯示整個頁面時,會自動出現滾動條。當滾動條向下滾動時,頁面上面被隱藏掉的高度,我們就稱為頁面被卷去的頭部。滾動條在滾動時會觸發 onscroll 事件。
<body><div>我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容 我是內容</div><script>// scroll 系列var div = document.querySelector('div');console.log(div.scrollHeight);console.log(div.clientHeight);// scroll滾動事件當我們滾動條發生變化會觸發的事件div.addEventListener('scroll', function() {console.log(div.scrollTop);})</script> </body>3.仿淘寶固定側邊欄
(1)原先側邊欄是絕對定位
(2)當頁面滾動到一定位置,側邊欄改為固定定位
(3)頁面繼續滾動,會讓 返回頂部顯示出來
<body><div class="slider-bar"><span class="goBack">返回頂部</span></div><div class="header w">頭部區域</div><div class="banner w">banner區域</div><div class="main w">主體部分</div><script>//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. 頁面滾動事件 scrolldocument.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';}})// 當我們點擊了返回頂部模塊,就讓窗口滾動的頁面的最上方goBack.addEventListener('click', function() {// 里面的x和y 不跟單位的 直接寫數字即可// window.scroll(0, 0);// 因為是窗口滾動 所以對象是windowanimate(window, 0);});// 動畫函數function animate(obj, target, callback) {// console.log(callback); callback = function() {} 調用的時候 callback()// 先清除以前的定時器,只保留當前的一個定時器執行clearInterval(obj.timer);obj.timer = setInterval(function() {// 步長值寫到定時器的里面// 把我們步長值改為整數 不要出現小數的問題// var step = Math.ceil((target - obj.offsetLeft) / 10);var step = (target - window.pageYOffset) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);if (window.pageYOffset == target) {// 停止動畫 本質是停止定時器clearInterval(obj.timer);// 回調函數寫到定時器結束里面// if (callback) {// // 調用函數// callback();// }callback && callback();}// 把每次加1 這個步長值改為一個慢慢變小的值 // 步長公式:(目標值 - 現在的位置) / 10// obj.style.left = window.pageYOffset + step + 'px';window.scroll(0, window.pageYOffset + step);}, 15);}</script> </body>三大系列總結
(1)offset系列 經常用于獲得元素位置 ? ?offsetLeft ?offsetTop
(2)client 經常用于獲取元素大小 ?clientWidth ?clientHeight
(3)scroll 經常用于獲取滾動距離 ?scrollTop ?scrollLeft ?
注意頁面滾動的距離通過 window.pageXOffset ?獲得
mouseenter 和mouseover的區別
?動畫函數封裝
1.動畫原理
<body><div></div><script>// 動畫原理:通過定時器 setInterval() 不斷移動盒子位置。// 1. 獲得盒子當前位置 // 2. 讓盒子在當前位置加上1個移動距離// 3. 利用定時器不斷重復這個操作// 4. 加一個結束定時器的條件// 5. 注意此元素需要添加定位, 才能使用element.style.leftvar div = document.querySelector('div');var timer = setInterval(function() {if (div.offsetLeft >= 400) {// 停止動畫 本質是停止定時器clearInterval(timer);}div.style.left = div.offsetLeft + 1 + 'px';}, 30);</script> </body>2.動畫函數簡單封裝
注意函數需要傳遞2個參數,動畫對象和移動到的距離。
// 簡單動畫函數封裝obj目標對象 target 目標位置function animate(obj, target) {var timer = setInterval(function() {if (obj.offsetLeft >= target) {// 停止動畫 本質是停止定時器clearInterval(timer);}obj.style.left = obj.offsetLeft + 1 + 'px';}, 30);}var div = document.querySelector('div');var span = document.querySelector('span');// 調用函數animate(div, 300);animate(span, 200);3.動畫函數給不同元素記錄不同定時器
<body><button>點擊夏雨荷才走</button><div></div><span>夏雨荷</span><script>// var obj = {};// obj.name = 'andy';// 簡單動畫函數封裝obj目標對象 target 目標位置// 給不同的元素指定了不同的定時器function animate(obj, target) {// 當我們不斷的點擊按鈕,這個元素的速度會越來越快,因為開啟了太多的定時器// 解決方案就是 讓我們元素只有一個定時器執行// 先清除以前的定時器,只保留當前的一個定時器執行clearInterval(obj.timer);obj.timer = setInterval(function() {if (obj.offsetLeft >= target) {// 停止動畫 本質是停止定時器clearInterval(obj.timer);}obj.style.left = obj.offsetLeft + 1 + 'px';}, 30);}var div = document.querySelector('div');var span = document.querySelector('span');var btn = document.querySelector('button');// 調用函數animate(div, 300);btn.addEventListener('click', function() {animate(span, 200);})</script> </body>4.緩動動畫
<body><button>點擊夏雨荷才走</button><span>夏雨荷</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 這個步長值改為一個慢慢變小的值 // 步長公式:(目標值 - 現在的位置) / 10obj.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>5.緩動動畫多個目標值之間移動
<style>div {position: absolute;left: 0;width: 100px;height: 100px;background-color: pink;}span {position: absolute;left: 0;top: 200px;display: block;width: 150px;height: 150px;background-color: purple;}</style> </head><body><button class="btn500">點擊夏雨荷到500</button><button class="btn800">點擊夏雨荷到800</button><span>夏雨荷</span><script>// 緩動動畫函數封裝obj目標對象 target 目標位置// 思路:// 1. 讓盒子每次移動的距離慢慢變小, 速度就會慢慢落下來。// 2. 核心算法:(目標值 - 現在的位置) / 10 做為每次移動的距離 步長// 3. 停止的條件是: 讓當前盒子位置等于目標位置就停止定時器function animate(obj, target) {// 先清除以前的定時器,只保留當前的一個定時器執行clearInterval(obj.timer);obj.timer = setInterval(function() {// 步長值寫到定時器的里面// 把我們步長值改為整數 不要出現小數的問題// var step = Math.ceil((target - obj.offsetLeft) / 10);var step = (target - obj.offsetLeft) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);if (obj.offsetLeft == target) {// 停止動畫 本質是停止定時器clearInterval(obj.timer);}// 把每次加1 這個步長值改為一個慢慢變小的值 步長公式:(目標值 - 現在的位置) / 10obj.style.left = obj.offsetLeft + step + 'px';}, 15);}var span = document.querySelector('span');var btn500 = document.querySelector('.btn500');var btn800 = document.querySelector('.btn800');btn500.addEventListener('click', function() {// 調用函數animate(span, 500);})btn800.addEventListener('click', function() {// 調用函數animate(span, 800);})// 勻速動畫 就是 盒子是當前的位置 + 固定的值 10 // 緩動動畫就是 盒子當前的位置 + 變化的值(目標值 - 現在的位置) / 10)</script> </body>6.動畫函數添加回調函數并封裝到單獨的js文件
回調函數原理:函數可以作為一個參數。將這個函數作為參數傳到另一個函數里面,當那個函數執行完之后,再執行傳進去的這個函數,這個過程就叫做回調。
回調函數寫的位置:定時器結束的位置。
animate.js文件
function animate(obj, target, callback) {// console.log(callback); callback = function() {} 調用的時候 callback()// 先清除以前的定時器,只保留當前的一個定時器執行clearInterval(obj.timer);obj.timer = setInterval(function() {// 步長值寫到定時器的里面// 把我們步長值改為整數 不要出現小數的問題// var step = Math.ceil((target - obj.offsetLeft) / 10);var step = (target - obj.offsetLeft) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);if (obj.offsetLeft == target) {// 停止動畫 本質是停止定時器clearInterval(obj.timer);// 回調函數寫到定時器結束里面// if (callback) {// // 調用函數// callback();// }callback && callback();}// 把每次加1 這個步長值改為一個慢慢變小的值 步長公式:(目標值 - 現在的位置) / 10obj.style.left = obj.offsetLeft + step + 'px';}, 15); }常見網頁特效案例
1.網頁輪播圖
功能需求:
1.鼠標經過輪播圖模塊,左右按鈕顯示,離開隱藏左右按鈕。
2.點擊右側按鈕一次,圖片往左播放一張,以此類推, 左側按鈕同理。
3.圖片播放的同時,下面小圓圈模塊跟隨一起變化。
4.點擊小圓圈,可以播放相應圖片。
5.鼠標不經過輪播圖, 輪播圖也會自動播放圖片。
6.鼠標經過,輪播圖模塊, 自動播放停止。
7.節流閥
防止輪播圖按鈕連續點擊造成播放過快。
節流閥目的:當上一個函數動畫內容執行完畢,再去執行下一個函數動畫,讓事件無法連續觸發。 核心實現思路:利用回調函數,添加一個變量來控制,鎖住函數和解鎖函數。 ?
開始設置一個變量 var flag = true;
If(flag) {flag = false; do something} ? ? ? 關閉水龍頭
利用回調函數 動畫執行完畢, flag = true ? ? 打開水龍頭
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設置類名為 currentol.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 改為 0if (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.返回頂部
滾動窗口至文檔中的特定位置。
window.scroll(x, y)
注意,里面的x和y 不跟單位,直接寫數字
// 當我們點擊了返回頂部模塊,就讓窗口滾動的頁面的最上方goBack.addEventListener('click', function() {// 里面的x和y 不跟單位的 直接寫數字即可// window.scroll(0, 0);// 因為是窗口滾動 所以對象是windowanimate(window, 0);});// 動畫函數function animate(obj, target, callback) {clearInterval(obj.timer);obj.timer = setInterval(function() {var step = (target - window.pageYOffset) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);if (window.pageYOffset == target) {// 停止動畫 本質是停止定時器clearInterval(obj.timer);callback && callback();}//移動距離為window.pageYOffset + step + 'px';window.scroll(0, window.pageYOffset + step);}, 15);}移動端網頁特效
觸屏事件
1.觸屏事件touch
<style>div {width: 100px;height: 100px;background-color: pink;}</style> </head><body><div></div><script>// 1. 獲取元素// 2. 手指觸摸DOM元素事件var div = document.querySelector('div');div.addEventListener('touchstart', function() {console.log('我摸了你');});// 3. 手指在DOM元素身上移動事件div.addEventListener('touchmove', function() {console.log('我繼續摸');});// 4. 手指離開DOM元素事件div.addEventListener('touchend', function() {console.log('輕輕的我走了');});</script> </body>2.觸摸事件對象(TouchEvent)
<script>// 觸摸事件對象// 1. 獲取元素// 2. 手指觸摸DOM元素事件var div = document.querySelector('div');div.addEventListener('touchstart', function(e) {// console.log(e);// touches 正在觸摸屏幕的所有手指的列表 // targetTouches 正在觸摸當前DOM元素的手指列表// 如果偵聽的是一個DOM元素,他們兩個是一樣的// changedTouches 手指狀態發生了改變的列表 從無到有 或者 從有到無// 因為我們一般都是觸摸元素 所以最經常使用的是 targetTouchesconsole.log(e.targetTouches[0]);// targetTouches[0] 就可以得到正在觸摸dom元素的第一個手指的相關信息//比如 手指的坐標等等});// 3. 手指在DOM元素身上移動事件div.addEventListener('touchmove', function() {});// 4. 手指離開DOM元素事件div.addEventListener('touchend', function(e) {// console.log(e);// 當我們手指離開屏幕的時候,就沒有了 touches 和 targetTouches 列表// 但是會有 changedTouches});</script>3.移動端拖動元素
<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>移動端常見特效
1.移動端輪播圖
window.addEventListener('load', function() {// alert(1);// 1. 獲取元素 var focus = document.querySelector('.focus');var ul = focus.children[0];// 獲得focus 的寬度var w = focus.offsetWidth;var ol = focus.children[1];// 2. 利用定時器自動輪播圖圖片var index = 0;var timer = setInterval(function() {index++;// 移動距離=索引號*盒子寬度var translatex = -index * w;// 過渡ul.style.transition = 'all .3s';// 位移ul.style.transform = 'translateX(' + translatex + 'px)';}, 2000);// 等著我們過渡完成之后,再去判斷 監聽過渡完成的事件 transitionend ul.addEventListener('transitionend', function() {// 無縫滾動if (index >= 3) {index = 0;// console.log(index);// 去掉過渡效果 這樣讓我們的ul 快速的跳到目標位置ul.style.transition = 'none';// 利用最新的索引號乘以寬度 去滾動圖片var translatex = -index * w;ul.style.transform = 'translateX(' + translatex + 'px)';} else if (index < 0) {index = 2;ul.style.transition = 'none';// 利用最新的索引號乘以寬度 去滾動圖片var translatex = -index * w;ul.style.transform = 'translateX(' + translatex + 'px)';}// 3. 小圓點跟隨變化// 把ol里面li帶有current類名的選出來去掉類名:用classList.removeol.querySelector('.current').classList.remove('current');// 讓當前索引號 的小li 加上 current:用classList.addol.children[index].classList.add('current');});// 4. 手指滑動輪播圖 // 觸摸元素 touchstart: 獲取手指初始坐標var startX = 0;var moveX = 0; // 后面我們會使用這個移動距離所以要定義一個全局變量var flag = false;ul.addEventListener('touchstart', function(e) {startX = e.targetTouches[0].pageX;// 手指觸摸的時候就停止定時器clearInterval(timer);});// 移動手指 touchmove: 計算手指的滑動距離, 并且移動盒子ul.addEventListener('touchmove', function(e) {// 計算移動距離moveX = e.targetTouches[0].pageX - startX;// 移動盒子: 盒子原來的位置 + 手指移動的距離 var translatex = -index * w + moveX;// 手指拖動的時候,不需要動畫效果所以要取消過渡效果ul.style.transition = 'none';ul.style.transform = 'translateX(' + translatex + 'px)';flag = true; // 如果用戶手指移動過我們再去判斷否則不做判斷效果e.preventDefault(); // 阻止滾動屏幕的行為});// 手指離開 根據移動距離去判斷是回彈還是播放上一張下一張ul.addEventListener('touchend', function(e) {if (flag) {// (1) 如果移動距離大于50像素我們就播放上一張或者下一張if (Math.abs(moveX) > 50) {// 如果是右滑就是 播放上一張 moveX 是正值if (moveX > 0) {index--;} else {// 如果是左滑就是 播放下一張 moveX 是負值index++;}var translatex = -index * w;ul.style.transition = 'all .3s';ul.style.transform = 'translateX(' + translatex + 'px)';} else {// (2) 如果移動距離小于50像素我們就回彈var translatex = -index * w;ul.style.transition = 'all .1s';ul.style.transform = 'translateX(' + translatex + 'px)';}}// 手指離開的時候就重新開啟定時器clearInterval(timer);timer = setInterval(function() {index++;var translatex = -index * w;ul.style.transition = 'all .3s';ul.style.transform = 'translateX(' + translatex + 'px)';}, 2000);});// 返回頂部模塊制作var goBack = document.querySelector('.goBack');var nav = document.querySelector('nav');window.addEventListener('scroll', function() {if (window.pageYOffset >= nav.offsetTop) {goBack.style.display = 'block';} else {goBack.style.display = 'none';}});goBack.addEventListener('click', function() {window.scroll(0, 0);}) })2.classList 屬性
classList屬性是HTML5新增的一個屬性,返回元素的類名。但是ie10以上版本支持。 該屬性用于在元素中添加,移除及切換 CSS 類。
<style>.bg {background-color: black;}</style> </head><body><div class="one two"></div><button> 開關燈</button><script>// classList 返回元素的類名var div = document.querySelector('div');// console.log(div.classList[1]);// 1. 添加類名 是在后面追加類名不會覆蓋以前的類名 注意前面不需要加.div.classList.add('three');// 2. 刪除類名div.classList.remove('one');// 3. 切換類var btn = document.querySelector('button');btn.addEventListener('click', function() {document.body.classList.toggle('bg');})</script> </body>移動端常用開發插件
click 延時解決方案:
移動端 click 事件會有 300ms 的延時,原因是移動端屏幕雙擊會縮放(double tap to zoom) 頁面。
?3. 使用插件。 fastclick 插件解決 300ms 延遲。
<style>div {width: 50px;height: 50px;background-color: pink;}</style><script src="fastclick.js"></script> </head><body><div></div><script>if ('addEventListener' in document) {document.addEventListener('DOMContentLoaded', function() {FastClick.attach(document.body);}, false);}var div = document.querySelector('div');div.addEventListener('click', function() {alert(11);})</script> </body>Swiper 插件的使用(輪播圖)
1.確認插件實現的功能
2.去官網查看使用說明
3.下載插件
4.打開demo實例文件,查看需要引入的相關文件,并且引入
5.復制demo實例文件中的結構html,樣式css以及js代碼
移動端常用開發框架
前端常用的框架有 Bootstrap、Vue、Angular、React 等。既能開發PC端,也能開發移動端
前端常用的移動端插件有 swiper、superslide、iscroll等。
Bootstrap 框架
是一個簡潔、直觀、強悍的前端開發框架,它讓 web 開發更迅速、簡單。 它能開發PC端,也能開發移動端
Bootstrap JS插件使用步驟:
1.引入相關js 文件
2.復制HTML 結構
3.修改對應樣式
4.修改相應JS 參數
本地存儲
特性:
1、數據存儲在用戶瀏覽器中
2、設置、讀取方便、甚至頁面刷新不丟失數據
3、容量較大,sessionStorage約5M、localStorage約20M
4、只能存儲字符串,可以將對象JSON.stringify() 編碼后存儲
- 要實現從 JSON 字符串轉換為 JS 對象,使用 JSON.parse() 方法
- 要實現從 JS 對象轉換為 JSON 字符串,使用 JSON.stringify() 方法
window.sessionStorage
?
<body><input type="text"><button class="set">存儲數據</button><button class="get">獲取數據</button><button class="remove">刪除數據</button><button class="del">清空所有數據</button><script>console.log(localStorage.getItem('username'));var ipt = document.querySelector('input');var set = document.querySelector('.set');var get = document.querySelector('.get');var remove = document.querySelector('.remove');var del = document.querySelector('.del');set.addEventListener('click', function() {// 當我們點擊了之后,就可以把表單里面的值存儲起來var val = ipt.value;sessionStorage.setItem('uname', val);sessionStorage.setItem('pwd', val);});get.addEventListener('click', function() {// 當我們點擊了之后,就可以把表單里面的值獲取過來console.log(sessionStorage.getItem('uname'));});remove.addEventListener('click', function() {// sessionStorage.removeItem('uname');});del.addEventListener('click', function() {// 當我們點擊了之后,清除所有的sessionStorage.clear();});</script> </body>window.localStorage
?記住用戶名
如果勾選記住用戶名, 下次用戶打開瀏覽器,就在文本框里面自動顯示上次登錄的用戶名
<body><input type="text" id="username"> <input type="checkbox" name="" id="remember"> 記住用戶名<script>var username = document.querySelector('#username');var remember = document.querySelector('#remember');if (localStorage.getItem('username')) {username.value = localStorage.getItem('username');remember.checked = true;}remember.addEventListener('change', function() {if (this.checked) {localStorage.setItem('username', username.value)} else {localStorage.removeItem('username');}})</script> </body>總結
以上是生活随笔為你收集整理的PC端和移动端网页特效,fastclick插件,Swiper插件,Bootstrap等框架,本地存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PG SQL截取字符串到指定字符位置
- 下一篇: Win10安装SQL2012或SQL20