搜尋
首頁web前端js教程在ionic3中如何實現隨機佈局瀑布流

在ionic3中如何實現隨機佈局瀑布流

Jun 14, 2018 pm 05:20 PM
ionic佈局瀑布流

這篇文章主要給大家介紹了關於ionic3實戰教程之隨機佈局瀑布流的實現方法,文中通過示例代碼和圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面一起學習學習吧。

前言

最近一段時間由於專案需要接觸到了ionic3,發現真是一個利器啊!ionic專案提供了一套豐富的圖標庫,在ionic3中也進行了升級。

公司的一個專案中由於要用到一個瀑布流的特效,找了半天竟然沒有找到相關的資源,沒有辦法,只能迎著頭皮上了~

#話不多說,先上圖

#相信看過圖片的同學都明白什麼意思了吧。對,就是瀑布流!

但是今天我們的瀑布流可不是一般的瀑布流。讓我們接著看:

自動排版

#我們的要求是做那種隨機凌亂的感覺,所以我們需要做一個機制,來將圖片選擇最優的一種排列方式來展示到頁面上,也就是保證圖片與相鄰圖片的比例是最合適的然後在實現排列.

angular4

相信這個效果如果在平常的jq插件中似乎也不難實現,確實,網路上也能搜到一些jq的插件。但是我們的技術堆疊是angular4呀~

在ng中我們的DOM操作基本上都是放在指令中的,相信用過angularjs1.x的同學並不陌生了吧~,在angular4中也是一樣。

好了,讓我們貼程式碼~

#建立指令

我們假設你已經在你的ionic中建立好了相關的元件,並且已經擁有的圖片數據,如果沒有相關基礎的同學建議大家先去看看ionic3 與angular4的入門。

這是我的一個元件html的頁面,也許眼尖的同學已經發現了我們的指令[imagr-sort]="item",對的,我們的指令是需要你目前的圖片的angular資料的。

建立一個指令ts

ionic g directive image-sort執行建立我們的指令。

建立完了我們的自訂指令就是這個樣子,空空如也啊~

##寫我們的邏輯

1.1接收並且注入一些東西:

看圖!

既然我們在範本中有輸入

([[imagr-sort]="item"]);那麼我們也當然應該在指令中接收到輸入的資料;如截圖中紅色箭頭所示,我將輸入的資料保存了起來->sourceArr;

然後我們在angular4中如果要取得到dom宿主的一些屬性了,元素了等等就要用到ElementRef,Renderer2是angular4中的一個類似渲染器的東西吧,這個具體的我還沒搞懂,大家可以多看看這塊的資料,我主要是在這個指令中用於更改Dom的一些結構。

關於我們的imgLength ,我待會再說

1.2實際點!圖片是從異步加載過來的!

我們先思考這樣一個問題:

我們的指令是在angular資料渲染的時候就開始執行的,這個是基本大家都懂。

but!我們的圖片可都是非同步載入的呢~,所以自然而然我們要有一個圖片載入的過程:

嗯,相信各位早就想到了---- >

image.onload,不錯,是它~

也是時候說下之前的imgLength了,這個變數來記錄記載完成的圖片的數量,用來辨別是否當前圖片都已經加載完畢了,為我們後續的動作做依據。

image.onerror,這個相信大家也看明白了吧,這個是圖片載入失敗的一個函數,我在裡面做的操作是將載入失敗的圖片從原始的DOM中,angular的數據剔除。

這裡面就用到了我們angular的渲染器this.render2();

相關功能方法大家可以去原始碼裡面看一下,基本上所有常用的Dom操作都有實作。

for循環呢是因為我們的圖片資料是多條的,所以我們要等待每一張圖片都順利的載入完成。

ps:注意在onerror與onload的函數中使用this要在imgOnlod中使用變數參考let _self = this;

圖片載入完成開始我們的改造工程

1.3將我們的適口依照網格劃分

imageStartStort()!

上圖

大家看1圖紅圈內,我是自己劃分出五個橫向網格標準,以便我們待會將圖片比例做對比。

1.4將我們的圖片定義網格佔用

#我們建立了一個陣列allImageArr=[];用於保存目前處理過的所有圖片的資料。

還記的我們之前獲得的angular的資料吧,我們透過循環它來將圖片劃分網格佔用。

我們的循環中都做了些什麼?

      1.圖片的寬度而高,並且求出每張圖片的比例。

      2.將所得的圖片比列與我們自己定義的網格比例進行區間劃分。

      3.按照我們劃分的網格來計算出佔有網格的圖片的新的寬度,所佔網格數儲存並且記錄保存到我們的自定義的allImageArr中,並且在原有的angular資料中加入gridding數字那個記錄對應的網格數。

執行this.pictureColumnSort方法;

我們的圖片已經分割完成了,接下來,我們來熱情的一刻~

## 1.5圖片排列,跟據網格派選最適合的鄰居~

pictureColumnSort()!

上圖


#這一個過程其實也沒啥好說的,主要就是循環,查看每個圖片的網格數,將最合適的進行相鄰排序(執行下一步:goExchange函數),最後匹配不上的單獨做一個5分網格戰術出來.

格式可以是多種:3 2,1 4,1 1 3,1 3 1,2 3.。 。 。 。 。

怎麼高興怎麼來~

沒啥好說的就是循環篩選,大家看看圖就好。

1.6無序變有序,除了交換應該沒有更好的選擇了吧


#goExchange()! 上圖

看看1.5中的程式碼,我們呢是在每次匹配到了合適的圖片之後執行這個函數,因為我們需要把匹配到的圖片換位置啊!

這個函數中收到的repeatI與repeatA就是1.5中的雙重循環的索引,這個索引決定了我們換圖片的位置。

程式碼所示的原理就是將配對到的圖片換到我們目前圖片的後面,將原來後面的圖片補到換過來圖片的位置,有點繞可能是我的比哦打能力不好,哈哈。

沒啥好說的這個函數,就是換位置。 #########1.7取長補短,完成! #########setHeight()!上圖################再循環(程式碼應該還有不少改進的地步,循環用的不少~) ;######這個地步已經我們呢的佈局頁面完成了,但是我們的圖片的尺寸實際上是不規則的,不忍直視,###所以我們在這個函數中將差異抹平,取長補短。 ######其實我們的圖片一定會有一點拉伸,所以我們也是取了平衡的一個中間點,來進行適當的拉伸。 ######這個函數肯定其實還可以做一些適當的限制來精細化圖片的尺寸調整。至此我們也算是寫完了整個指令邏輯。 ######完成! ioinc serve############

至於中間的調用的過程有一點我要說明:

setTimeout(() => {
  _self.setHeight(angularImageList, ele);
  });

整個調用我也是晚班無奈的情況下才使用的,如果不加整個調用在setHeight函數中設置的angular,數據會莫名其妙的出現圖片位置更換錯誤,至今誤解,如果大佬們能看到整個有好的解決方法也分享一下。

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

vue中如何實作methods方法之間呼叫

vux如何實作上拉刷新功能

jQuery如何實作圖片輪播

#

以上是在ionic3中如何實現隨機佈局瀑布流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器