摘要:需求很簡(jiǎn)單,而且和知乎的顯示全部收起功能非常相似,但是了一下沒有找到類似的,因此決定自己實(shí)現(xiàn)一個(gè)看了知乎的網(wǎng)頁代碼。
Update 2016.12.7
已封裝為插件
原生 js 插件$ npm install foldcontent-zhihu@">=3.0.12" --save Usage
jquery 插件 $ npm install foldcontent-zhihu-jquery@">=1.0.1" --save Usage
Update 2016.11.23
此前demo 定義兩個(gè)按鈕,一個(gè)固定定位,一個(gè)絕對(duì)定位,因此滾動(dòng)至底部時(shí)會(huì)出現(xiàn)兩個(gè)按鈕同時(shí)出現(xiàn)的問題,用戶體驗(yàn)不是很好,因此更改為只有一個(gè)按鈕,判斷滾動(dòng)至底部時(shí)添加 classname 更改樣式。且精簡(jiǎn)了代碼ヾ(≧?≦*)ゝ
scroll 事件性能優(yōu)化問題。
鼠標(biāo)滾動(dòng)時(shí) scroll 事件觸發(fā)的間隔大約為 10~20 ms,相對(duì)于其他的鼠標(biāo)、鍵盤事件,它被觸發(fā)的頻率很高,間隔很近。因此如果 scroll 事件涉及大量的位置計(jì)算、元素重繪等工作,且這些工作無法在下個(gè) scroll 事件觸發(fā)前完成,就會(huì)導(dǎo)致瀏覽器掉幀
因此需要減少綁定給 scroll 中具體想要執(zhí)行的業(yè)務(wù)邏輯的執(zhí)行次數(shù)
并將對(duì)象初始化、不變的高度值等緩存在 scroll 事件外部
存在 bug : 當(dāng)以很快的速度滾動(dòng)時(shí),有可能執(zhí)行不到 scroll 綁定的事件(ó﹏ò),有沒得更好的優(yōu)化方案?
示例代碼及 github 均已更新 ?(ˊ?ˋ*)?
Update 2016.11.22
優(yōu)化代碼結(jié)構(gòu),存在命名不規(guī)范、jquery 方法和原生 js 方法混用、代碼未封裝、設(shè)計(jì)冗余等問題。。。review 代碼被批了。。。
起初是要做一個(gè)公司內(nèi)部的 mongoDB 日志查詢網(wǎng)站,前端用 bootstrap,后端用 nodejs 做了一個(gè)簡(jiǎn)單的頁面,不得不說頁面還是很粗陋的,因?yàn)橐粭l日志的內(nèi)容很多,如果直接顯示的話內(nèi)容太過冗長(zhǎng),往往滾動(dòng)幾次才能看完一條日志,而且經(jīng)常查詢的就是固定的幾個(gè) key,直接展示不利于迅速debug。
問題確定了,要實(shí)現(xiàn)的就是顯示日志時(shí)只顯示經(jīng)常查詢的幾個(gè)鍵值對(duì),點(diǎn)擊展開時(shí)顯示全部日志,點(diǎn)擊收起時(shí)變回原狀。
需求很簡(jiǎn)單,而且和知乎的顯示全部&&收起功能非常相似,但是 Google 了一下沒有找到類似的 demo,因此決定自己實(shí)現(xiàn)一個(gè)!
Here we go看了知乎的網(wǎng)頁代碼。原理是點(diǎn)擊顯示全部時(shí),如果這條答案超出瀏覽器視窗,則收起按鈕變成固定定位,js 計(jì)算出 right 值,bottom固定為12px;當(dāng)這條答案底部滾動(dòng)至瀏覽器視窗內(nèi),收起按鈕變回絕對(duì)定位。ps 發(fā)現(xiàn)知乎是不是改版了,之前答案底部出現(xiàn)在瀏覽器視窗內(nèi)后這個(gè)位置是有收起按鈕的?,按鈕從固定定位變?yōu)榻^對(duì)定位并更改樣式,就像旁邊的作者保留權(quán)利這樣的風(fēng)格~(圖一直傳不上來。。暫時(shí)放棄了)
現(xiàn)在的做法是直接隱藏掉固定定位的收起按鈕。
其實(shí)我的實(shí)現(xiàn)方法和知乎的不甚相同,因?yàn)樗?js 代碼我真心……沒看懂!誰能告訴我這種情況應(yīng)該怎么調(diào)試(ノ°ο°)ノ
所以想了另一種思路,在答案右下角定義一個(gè)按鈕 A,判斷答案頂部和底部的相對(duì)位置 x 和 y ,其中 y = x + 答案的高度(js 獲取)。當(dāng)答案出現(xiàn)在瀏覽器視窗內(nèi),即 x = $(window).height() 時(shí),給 A 添加固定定位,動(dòng)態(tài)定義 right 值;當(dāng)答案即將滾出瀏覽器視窗,即 y = $(window).height() 時(shí),A 變?yōu)橄鄬?duì)定位,right 值始終為 20px。當(dāng) A 的文本內(nèi)容為收起時(shí),點(diǎn)擊 A 文本內(nèi)容變?yōu)檎归_,去掉固定定位。
此處省去連接數(shù)據(jù)庫(kù)等無關(guān)工作,僅用兩段有趣的文字作為 demo ~
首先,文字內(nèi)容分為 all-content 和 part-content 兩部分,分別為折疊前和折疊后要展示的內(nèi)容,因?yàn)檫€未搞懂知乎折疊答案后顯示哪一部分內(nèi)容的算法,所以簡(jiǎn)單粗暴地分了折疊前和折疊后的內(nèi)容。。此處有一個(gè) TODO ?
var doc = $(document); var win = $(window); // 多次使用, 緩存起來 doc.on("click", ".unfold", function () { var unfold = $(this); if (unfold.text() !== "收起") { unfold.text("收起").siblings(".part-content").hide().siblings(".all-content").show(); var panel = unfold.parent(); var panelScroll = panel.offset().top + panel.height(); var scrollHeight = doc.scrollTop() + win.height(); var right = win.width() / 2 - 350 + 20 > 20 ? win.width() / 2 - 350 + 20 : 20; // 點(diǎn)擊展開按鈕時(shí)即判斷是否出現(xiàn)收起按鈕 if (scrollHeight - panelScroll < 50) { unfold.addClass("fold-fix").css("right", right); } // 綁定在 scroll 事件上 var cb = { onscroll: function() { var panelScroll = panel.offset().top + panel.height(); var scrollHeight = doc.scrollTop() + win.height(); var right = win.width() / 2 - 350 + 20 > 0 ? win.width() / 2 - 350 + 20 : 20; if (scrollHeight - panelScroll < 50 && panel.offset().top - scrollHeight < -90 && unfold.text() !== "展開") { unfold.addClass("fold-fix").css("right", right); } else { changeStyle(unfold); } win.off("scroll", cb.onscroll); setTimeout(function() { win.on("scroll", cb.onscroll); }, 50); } }; win.on("scroll", cb.onscroll); } else { var fold = $(this); changeStyle(fold); fold.text("展開").siblings(".part-content").show() .siblings(".all-content").hide(); } }); function changeStyle(i) { i.removeClass("fold-fix").css("right", "20px"); }
此處涉及一個(gè)知識(shí)點(diǎn):網(wǎng)頁元素的絕對(duì)位置 && 相對(duì)位置
網(wǎng)頁元素的絕對(duì)位置,指該元素的左上角相對(duì)于整張網(wǎng)頁左上角的坐標(biāo)。jquery 中 offset() 方法返回元素相對(duì)于文檔的偏移。該方法返回的對(duì)象包含兩個(gè)整型屬性:top 和 left。x.offset().top 即為 x 元素的絕對(duì)高度;
網(wǎng)頁元素的相對(duì)位置,指該元素左上角相對(duì)于瀏覽器窗口左上角的坐標(biāo)。絕對(duì)位置減去頁面的滾動(dòng)條滾動(dòng)的距離就是相對(duì)位置。x.offset().top - $(document).scrollTop() 即為 x 元素的相對(duì)高度。
本例需要瀏覽器視窗剛剛滾動(dòng)至答案a的絕對(duì)定位按鈕出現(xiàn)的效果,因此此節(jié)點(diǎn)為答案底部的相對(duì)高度減去瀏覽器視窗高度正好等于負(fù)的按鈕 A 的高度。即 a.offset().top + a.height() - $(document).scrollTop() - $(window).height() = - 按鈕高度
阮一峰老師的用Javascript獲取頁面元素的位置這篇文章講解得十分清晰,如果要深入了解這個(gè)知識(shí)點(diǎn)建議看一下這篇文章,說不定就有茅塞頓開的感覺哦 ?(ˊ?ˋ*)?
如何動(dòng)態(tài)設(shè)置固定定位的折疊按鈕 的 right 值呢?
答案的固定寬度是 700px,因此瀏覽器視窗寬度減去 700px 再除以 2 便始終是答案的 right 值,因?yàn)榘粹o為絕對(duì)定位時(shí) right: 20px; 因此 right: $(window).width()/2 - 350 + 20 就保證了固定定位和絕對(duì)定位時(shí)按鈕都在一條垂直線上,過渡銜接很自然。
當(dāng)瀏覽器窗口不斷縮小時(shí),上面計(jì)算出的固定定位時(shí)按鈕的 right 值可能為負(fù),這顯然不符合需求,因此要設(shè)置當(dāng)計(jì)算出的 right 值為負(fù)時(shí)設(shè)置 right 值為 20px。
catch the code源代碼已上傳至 my github (???) ?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/50222.html
摘要:需求很簡(jiǎn)單,而且和知乎的顯示全部收起功能非常相似,但是了一下沒有找到類似的,因此決定自己實(shí)現(xiàn)一個(gè)看了知乎的網(wǎng)頁代碼。 showImg(https://segmentfault.com/img/remote/1460000008488966);showImg(https://segmentfault.com/img/remote/1460000008488967); Update 20...
今天我們講講項(xiàng)目中實(shí)戰(zhàn)就是文字展開收起組件的實(shí)現(xiàn)過程,講解這個(gè)就是為了讓多給大家一個(gè)思路,想法。 簡(jiǎn)單來說文字展開收起組件產(chǎn)生的需求背景,就是為省略顯示,然后有展開收起的按鈕可以操作。我們看顯示效果上圖: 上圖是文字收起的圖示,超過一定的字?jǐn)?shù)那就收起省略顯示,并出現(xiàn)查看全部按鈕。 上圖顯示的就是操作了查看全部按鈕之后,文字需要全部顯示出來并有收起按鈕。還是來看一張gif圖的顯示最后該組件...
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:一些有用的一些有用的,包括轉(zhuǎn)換小箭頭三角形媒體查詢等中文指南是當(dāng)下最熱門的前端資源模塊化管理和打包工具。 nodejs 入門 nodejs 入門教程,大家可以在 github 上提交錯(cuò)誤 2016 年最好用的表單驗(yàn)證庫(kù) SMValidator.js 前端表單驗(yàn)證工具分享 淺談前端線上部署與運(yùn)維 說到前端部署,可能大多數(shù)前端工程師在工作中都是使用的公司現(xiàn)成的部署系統(tǒng),與SRE對(duì)接、一起完...
摘要:一些有用的一些有用的,包括轉(zhuǎn)換小箭頭三角形媒體查詢等中文指南是當(dāng)下最熱門的前端資源模塊化管理和打包工具。 nodejs 入門 nodejs 入門教程,大家可以在 github 上提交錯(cuò)誤 2016 年最好用的表單驗(yàn)證庫(kù) SMValidator.js 前端表單驗(yàn)證工具分享 淺談前端線上部署與運(yùn)維 說到前端部署,可能大多數(shù)前端工程師在工作中都是使用的公司現(xiàn)成的部署系統(tǒng),與SRE對(duì)接、一起完...
閱讀 1816·2021-08-13 15:06
閱讀 3106·2021-08-05 10:02
閱讀 3378·2019-08-30 15:55
閱讀 2393·2019-08-30 13:46
閱讀 2493·2019-08-30 13:01
閱讀 1331·2019-08-29 17:17
閱讀 2830·2019-08-29 15:27
閱讀 1439·2019-08-29 11:12