類對摩天大樓有一種特殊的偏愛。對于一座沒有去過的城市來說,它能給我們留下的最深的印象,莫過于留在各種影像里的天際線。高聳入云的大樓不僅有著極高的辨識度,更是毫無遮掩地彰顯了人類的技術能力:畢竟,在建筑上不斷突破高度的極限是一個相當晚近的趨勢,它需要建筑材料、結構工程、電梯運輸等全方位的技術基礎作為支撐。追求建造更多的高樓,也因此似乎成為一座希望融入世界現代化大潮的城市必須積極投身的事業。
在過去二十年間的中國,與經濟一同飛速發展的還有樓層的高度。根據世界高層建筑與都市人居學會(CTBUH)發布的報告顯示,中國現在擁有世界40%的超高層建筑,150米、200米、300米以上的建筑數量都位居全球第一。不過,今年7月12日,國家發改委發布的《“十四五”新型城鎮化實施方案》指出,要嚴格限制新建250米以上建筑,不得新建500米以上建筑。據《中國新聞周刊》等媒體報道,業內專家人士表示,這一政策變動,可能讓中國的摩天大樓時代終結。而在此之前,自2020年開始,我國已經多次頒布“限高”的政策。
除了安全隱患、成本因素之外,曠日持久的疫情同樣也帶動了全球范圍內對摩天大樓建筑思路的反思。很多人認為,疫情帶來的頻繁居家辦公,可能讓原本就空蕩蕩的摩天大樓的閑置空間進一步增加。甚至有媒體刊發的文章,直接以“疫情之后,摩天大樓時代終結?”為題。
不過,在著名建筑評論家迪耶·薩迪奇看來,這些唱衰摩天大樓的論調可能都不靠譜。在他今年翻譯成中文出版的新著《權力與建筑》中,薩迪奇以一貫詼諧、辛辣而又精準的筆調,調侃了人類對高樓大廈的迷戀。而縱觀歷史,這種“幼稚”的迷戀恐怕并不容易消散。薩迪奇寫道,世上一大荒謬就在于,“那些最自詡理性、冷靜、謹慎的商人,卻總是一頭扎進高樓大廈里,想要造出一座比之前那座更高的大樓”,“他們想建造高樓的不理性沖動,很多時候就只是為了要當世界最高的那一個”。
不過,呼應這本書的標題,這種摩天樓迷戀并非全然是簡單的非理性,其背后有著薩迪奇一直很關注的權力問題。而他的這個著眼點,其實也得到了不少其他作者的呼應。人們出于什么原因追捧摩天大樓?這種追捧背后體現出哪些權力意志?未來,這種追捧會改變嗎?本期讀刊,我們從薩迪奇的這本新書出發,給大家分享有關這一話題的有趣觀點。
高樓綜合征:
為何摩天大樓特別適合展示權力?
薩迪奇在《權力與建筑》中寫了不少有意思的軼事,比如,希特勒的建筑師施佩爾修建的“榮譽廣場”,用其潔白反光的墻面和四處環巡的探照燈營造出了一種奇特的空間壓迫感,讓前來談判的捷克斯洛伐克第二共和國總統哈查面露菜色,也將國土拱手讓給了納粹。再比如,美國的小布什總統幾乎全盤照搬了前功勛總統杰弗遜的總統圖書館設計風格,希望借助前輩的光輝一掃連任失敗的恥辱。
秉持這種解構權力的姿態,薩迪奇將人類對高樓的追逐描述為一種“高樓綜合征”——養寵物的人們可能會以為這是那個用來形容貓咪的癥狀。據說貓的“高樓綜合征”指的是貓由于專注于鳥和其他動物而失去平衡,從高樓上掉下的狀態。不過,對人來說,這種綜合征首先體現在遭遇高樓時的那種“震撼”感。薩迪奇舉了曾經世界上最著名的摩天大樓美國世貿中心雙子塔的例子,“當你穿過雙子塔之間的廣場時,會覺得高樓的重量直接‘壓’了過來,所以你會需要一定的決心才能走過這個廣場...雙子塔似乎把廣場的空氣壓縮了,逼迫你用血肉之軀與之對抗”。
《權力與建筑》,迪耶·薩迪奇著,吳真貞譯,重慶出版社2022年5月。
這段描寫形象地點出了不少人面對摩天大樓時產生的那種敬畏又窒息的感受。特別值得一提的是,雙子塔的設計師、大名鼎鼎的山崎實(Minoru Yamazaki)曾說,即便他常常站在高樓之上,還是有很嚴重的“恐高癥”。薩迪奇覺得,這就像一位米其林大廚說他食鹽過敏一樣給人以矛盾感,但卻從另一個側面體現了摩天樓這種人造物如何反過來讓人所臣服的——它持續給人造成控制感。
即便回溯到摩天大樓最早期的歷史,這種“令人仰望”的效果已經是建筑師們的追求。丹·克魯克香克在《摩天大樓》一書中詳細地爬梳了公認的世界第一座摩天大樓——芝加哥瑞萊斯大廈(Reliance Building)的建造過程。這座在當時風格超前的建筑不僅通過外層玻璃和白釉陶板的設計給予路過的人們極大的視覺沖擊力,還將用于分隔玻璃窗戶的窄條型陶板豎框數量不斷增加,進一步強化大廈的高度“令人仰望”的效果。
當人們檢視世界上最著名的一些摩天大樓時,常常發現它們存在一些“虛高”:在實際的建筑物高度外,開發商會在這些大樓的頂部放置尖頂或者塔樓,讓其高度大幅增加的情況下,還付出了較少的成本。這也就是建筑界常稱的“虛榮高度”(vanity height)。比如著名的迪拜哈利法塔,從塔底到塔頂高828米,但最高的占用樓層只到585米。當然,這個摩天大樓的頂部區域也不一定都是“虛高”,比如一些超高樓會在這個“虛榮高度”的區域安裝用于保持樓梯穩定的阻尼器。
如果僅僅是說“建筑是某種權力意志的外化”,那么似乎人們可以說,能外化權力意志的事物有很多,建筑有什么值得特別一提的呢?薩迪奇認為,對于追求權力——不論是政治還是經濟——的人們來說,建筑有著表達意志的獨特能力。許多研究都表明,人的控制欲會明顯體現在對空間的掌控中。此外,建筑是我們生活里最常見到的、最宏大的文化形式,人們在建筑中生活和交往,仿佛控制了建筑空間就能對他人真正地施加影響。從地基開始目睹一座屬于自己的摩天大樓崛起,似乎宣示著它的陰影覆蓋之處,即自己占有之地。
《大都會》(1927)海報。
“世界是垂直的”:
摩天大樓的權力隱喻
雖然在古代,人們也熱衷于建造更高的建筑,但這種熱情無疑和現代社會最流行的一些觀念更相契合。正如瑞萊斯大廈成為后續諸多未來主義建筑的靈感來源,摩天大樓象征著發展的速度和進步的愿景,被人們認為是指向未來的。用學者史蒂芬·格拉漢姆(Steven Graham)的話來說,大部分用來形容地位、品質、力量、成就的字眼,都和一種“垂直”的觀念相關。比如“supreme”(最高的)一詞,源于拉丁文的“supremus”,是“superus”的最高級形式,而后者的意思即是“在上方者”——這似乎從一個刁鉆的角度解釋了人們通過建筑來彰顯自己權力欲望的動機。
格蘭漢姆寫過一本專著叫《世界是垂直的》,讀者們看到這個書名可能會會心一笑。在某種程度上,它可能指向的正是大名鼎鼎的托馬斯·弗里德曼的那本《世界是平的》,因為格拉漢姆在書中討論的一個關鍵問題,即是當下學界對“垂直權力”的忽視。尤其是人文地理學,在研究權力問題時很大程度上被一種“水平透視的地理空間觀念”主導(比如研究殖民擴張的問題),而忽視了對縱向空間中權力問題的考察。一個例證是,批判都市研究中極具影響力的《布萊克威爾城市指南》(Blackwell Companion to the City)從未提及“垂直”(Vertical)一詞。可以說,探尋摩天大樓背后的權力問題,是一個亟待關注的課題。
《世界是垂直的》翻譯中文譯本書封。
在這本書中,格拉漢姆還提出了不少有關摩天大樓的精妙洞見,這些洞見也相當符合我們的日常經驗。比如,摩天大樓在現代社會基本上是一種最典型的“權力階梯”隱喻,它物質化了大企業最普遍的垂直階層結構,用他引用的意大利記者馬克·達拉莫(Marco d’Eramo)的話來說,人們在攀爬摩天大樓的時候只會向上凝視,一定程度上,這種建筑形式讓你只尊重那些在你上面的人。
格拉漢姆還介紹了兩位學者的觀點。人類學家王愛華(Aihwa Ong)認為,奇觀式的垂直巨型建筑的建造經常被視為亞洲與中東國家及相關精英人士傾注心血之地。如吉隆坡石油雙塔等奇觀式建筑的建造,能以杠桿的方式操作房地產的價值,同時為本地人民制造樂觀的未來愿景。現代城市偏愛打造摩天大樓“林立”的景觀,仿佛本國和其他國家的比較也因此可被樓層的高度指標化,這適應了現代社會追求“競爭”的氛圍。
《云中行走》(2015)劇照。
此外,地理學者瑪利亞·凱卡(Maria Kaika)的觀點也特別值得我們深思。她認為全球范圍內摩天大樓的不斷“增生”也反映出日益集中的財富與權力。摩天大樓成為最能代表一個城市的地標式建筑,恰恰反映了這些城市之于全球精英們已不再重要。他們能夠“不將身份和財富與任何一個單一特定的城市形成聯結”,他們就像這些凝結著資本、金融產業的摩天大樓中的“跨國房客”,可以在這些標志性建筑構筑的全球網絡中自由地流動。在全球資本流動的地圖網絡中,只有摩天大樓這種標志性之物是重要的——而顯然,它們隔絕于普通的民眾。凱卡認為,城市核心區外的居民也就因此得面對一種“傲慢”的、無法接近的權力地景。
這種來自“無法接近”摩天大樓的民眾們的批評,曾經出現在雙子塔剛于紐約落成時,也曾出現在吉隆坡和安哥拉。薩迪奇在《權力與建筑》中就寫道,世貿中心起初在人們眼中就是一塊“孤立而令人生畏”的飛地,周圍的一切都遭遇它的擠壓。吉隆坡則是為了打造石油雙塔,急忙拆除了市中心的一個賽馬場。從各種意義上,摩天大樓制造的敬畏感代表著一種權力的威壓,讓原本的城市區域感覺到不適,而這可能正是權力生效的結果。
也正是因此,城市理論家克里斯托弗·亞歷山大曾經不無調侃地說:“大量證據都表明,高層建筑讓人發瘋”。不過,盡管摩天大樓彰顯的權力會令人不適,但事情可能還沒到最壞的地步。建筑理論家凱基·瓦納利(Kazys Varnelis)提到一個有趣的說法:晚期資本主義社會里,“可見性”并非美德。換而言之,我們如果還能將“特朗普大廈”這樣的大樓當作某種政治經濟的象征進行反思和批判,說明我們依然能夠有效地識別出權力的野心。然而,晚期資本主義社會的發展,傾向于讓這些權力變得更為隱蔽,以至于接受其控制卻不自知。
《摩天營救》(2018)劇照。
疫情之后,“摩天大樓熱”
會就此終結嗎?
隨著全球疫情的持續,居家辦公依然會是人們常常需要面對的境況。不斷增高的空置率使得人們對興建新的摩天大樓似乎望而卻步。衛報2021年的一篇《摩天大樓的時代終結了嗎?》就指出,倫敦近年來的高層建筑規劃申請銳減。除了可能的高空置率外,另一個很重要的因素是人們對親近自然的需求。疫情中生發出的一種“新都市主義”思維使得更多的低層建筑涌現,它們布置在公園、綠地邊,它們代表著綠色和開放,與摩天大樓代表的那種封閉式、一體化、自給自足的空間迥然異趣。
不過,這篇文章也提到,歷史上對摩天大樓終結的預測并不少見。比如上世紀70年代時,著名的未來學家阿爾文·托夫勒 (Alvin Toffler)就質疑過超高層建筑的未來。他在《第三次浪潮》中預測,未來隨著人們工作形態的變化和通信技術的進步,辦公大樓將不復存在,家庭將成為工作的中心單元。他或許難以想象,經歷了八九十年代的摩天大樓建設熱潮,自己在當時看似逆發展潮流而作的預言卻可能被疫情后的世界應驗。不過,很多城市理論家也認為,人們對面對面交往的熱情將會驅動他們在建筑中聚集,這使得摩天大樓這樣能容納大量多樣化人群的空間永遠都有存在的必要。
《摩天營救》(2018)劇照。
學者理查德·史密斯在2021年的一篇學術文章中也指出,疫情之后,摩天大樓依然會保有旺盛的生命力。商業摩天大樓是一種“全球化特定回路的固化”,它們凝結著那些對全球化發展極為重要的產業,比如金融服務業,地方經濟依賴它們與世界經濟發生連接。同時,摩天大樓也常常成為城市中縱向聯系不同產業的地帶。高級服務業并不依賴與所服務者的接近度,但很依賴于與其他關鍵行業的連接,這些在摩天大樓中常常能實現。所以,史密斯認為,盡管大流行會使得我們的工作日趨數字化。人們前往城市核心從事知識經濟工作的頻率會下降,但知識經濟的這種對連接性的需求,使得摩天大樓依然保有自身的價值。
參考鏈接:
1. World’s First COVID-Conscious Skyscraper and Medical Center Unveiled by Miami Mayor, Adventist Health and Royal Palm Companies.
https://www.globenewswire.com/en/news-release/2021/08/19/2283316/0/en/World-s-First-COVID-Conscious-Skyscraper-and-Medical-Center-Unveiled-by-Miami-Mayor-Adventist-Health-and-Royal-Palm-Companies.html
2. Giants in the Sky: Why are Skyscrapers Important?
https://www.latham-australia.com/blog/why-are-skyscrapers-important
3. Why skyscrapers after Covid-19?
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8451974/
4. Vanity Height: How Much of a Skyscraper is Usable Space?
https://www.archdaily.com/425730/vanity-height-how-much-of-a-skyscraper-is-usable-space
5. The big idea: Is the era of the skyscraper over?
https://www.theguardian.com/books/2021/oct/18/the-big-idea-is-the-era-of-the-skyscraper-over
撰文/劉亞光
編輯/李永博 青青子
校對/趙琳
《Highrise Mogul》是關于建造和管理摩天大樓的大亨游戲。白手起家,開始鋪設地板、生成墻壁、放置門、房間、裝飾品、服務、電網等!通過雇傭員工、管理財務、開展公關活動和制定租戶必須遵守的政策來管理高層建筑。成為最無情的房東或是享受作為一名建筑師,選擇權在你手中。
詳情鏈接:http://www.3h3.com/danji/252245.html
設計平面圖,創造最美麗的花園。試著把盡可能多的人擠在一個樓層里,或者為租戶提供一個田園詩般的生活場所,滿足他們需要的所有服務和空間。加入一些細節,如自動售貨機、裝飾品或垃圾桶。選擇建造單間公寓、辦公室、豪華閣樓或商場來吸引游客。也許還可以給員工提供一兩間休息室! 《Highrise Mogul》讓你創造和建造你夢想中的摩天大樓。
作為高層建筑的主人,有幾十件事情需要管理。選擇和實施政策,以鼓勵高收入的租戶,阻止亂丟垃圾或支持可持續消費。雇用或者解雇從清潔工到維修工的人員。開始公共關系活動,以吸引更多的游客和更高價值的租戶。通過你的資產負債表、租戶數量增長和其他統計數據,找出需要調整的新東西。選擇從城市電網購買電力或自己生產。接受并償還貸款。《Highrise Mogul》讓你完全控制你的建筑的每個方面!
《Highrise Mogul》模擬每個人居住、工作或訪問你的摩天大樓。見證數以百計的人工智能租戶、辦公人員、工作人員或來訪的購物者進行他們的業務、消費和決策。每個人的姓名、年齡、個人收入和外表都是不同的。讓租戶和訪客滿意,他們就會讓你的銀行賬戶保持充實。
過一個月的時間,在我遇到了很多“這個我不會做啊?”,“這個到底怎么做“的問題后,它終于成功上線了!下面總結一下整整一個月的時間我是如何開發JDRD,遇到的各種問題以及解決方案。
JDR DESIGN 是京東零售設計中臺的門戶站點,展示京東零售設計服務平臺的產品以及應用場景,特點是動效豐富、圖片細節多、要求整站文案和外鏈可配置。項目最大的困難就是動效開發復雜和開發排期緊湊的問題。
JDR DESIGN 地址:https://jdrd.jd.com/
這是我入職以來負責的第一個項目,需要花大量時間來熟悉新的開發流程,項目排期非常緊湊,并且在排期完后又新增了窄版、骨架屏、首頁圖標動效、入場動畫、產品頁頭部動效等新的需求,每天高強度的加班,回想起來雖然很難,但是非常有挑戰性,非常有收獲。
作為一個 9012 年的 PC 端項目,我們自然也需要非常先進的技術選型來幫助我們提升研發生產力,所以一個優秀的前端框架和一個高效的前端工程化工具,自然是必不可缺的選擇。選擇團隊自研的 Nerv 進行開發,Nerv 是一個基于 virtual dom 的類 Reac t組件框架,比 React 更小的體積更高的性能,還保持了對 IE 瀏覽器的兼容,滿足了 JDRD 需要兼容IE10的要求。
自動化前端構建工具選擇了團隊自研的前端工程化工具 Athena,簡化 webpack 配置工作,幫助我們在項目中實現自動化編譯、代碼處理、依賴分析、文件壓縮、文件 MD5 戳等需求。
在前端架構方面,根據上述的技術選型以及常見的前端體系,基于本項目的需求進行了些調整,整體架構設計如下:
Athena 和 Nerv 上文已經介紹過,下面介紹一下另外幾個:
整個開發流程總結如下圖所示:
既然是總結,開發過程中的流程當然沒有這么完整,漏掉了一部分(已紅色標注),導致開發到后面因為前面漏掉的環節,浪費了很多的時間。
數據埋點:交互稿其實有詳細介紹哪些地方需要點擊跳轉的事件,開發時應該在定義點擊跳轉時就給數據埋點轉參。
除了在開發流程中的問題外,最頭疼的就是動效的開發了,下文會詳細介紹。
性能優化的初衷就是加快網站的加載速度,讓用戶能夠更快的看到內容,上面介紹到前端工程化工具 Athena 已經做到合并、壓縮了靜態資源文件,那還有什么方法能夠縮小請求的靜態資源體積,加快首屏的加載速度呢,我們嘗試了以下性能優化手段。
樓層懶加載就是按樓層劃分組件,并進行代碼切割,在頁面滾動時按需加載組件。
Nerv-loadable 是一個專門用于動態 import 的 React 高階組件,你可以把任何組件改寫為支持動態 import 的形式,利用 import() 來進行動態加載。
const NewsBannerLoadable=Loadable({
loader: ()=>
import(/* webpackChunkName: "news_banner" */
'./news_banner'),
loading: loadingPlaceholder.bind(null, loadingBlock),
delay: 0
});
上面的代碼在首次加載時,會先展示一個 loadingBlock,然后動態加載 news_banner 的代碼,組件代碼加載完畢之后,便會替換掉 loadingBlock。Lazyload 通過監聽 window 對象或者父級對象的 scroll 事件,觸發 load,實現懶加載,讓組件進入頁面可視區時才加載該組件。需要注意的是 lazyload 需要設置高度,才會撐起懶加載的區域。
<Lazyload {...this.lazyloadOptions} height={this.floorHeight.newsBanner}>
<NewsBannerLoadable />
</Lazyload>
以首頁為例,有四處組件是不需要首次加載的,而是使用動態加載:多端適配、物料、應用場景、設計思考。首次加載實際上只需要加載首屏的頭部、視頻、banner 即可。切分之后,首屏 js 體積縮減了 50KB。
整站圖片非常多,為了保持清晰度而且全部采用二倍圖引入,消耗資源比較大,為了加快加載速度,我們選擇讓滾動條滾動到圖片的可視區后才加載該圖片。
使用 Lazyload 實現,和上述組件懶加載介紹的一樣,包裹著需要懶加載的圖片,就可以實現圖片懶加載。
圖片懶加載之外還有個優化,就是圖片加載中、加載失敗、加載成功的狀態的判斷,根據不同狀態展示圖片的內容。
使用 Lazyimg 實現這個功能:
除了上面兩點外,還可以從 webpack 打包進行性能優化,webpack 打包后會生成一個或多個包含源代碼最終版本的“打包好的文件”,它們由 chunks 組成,SplitChunks 插件可以將公共依賴項提取到現有的 entry chunk 或全新的代碼塊中,進行代碼切割,減小 chunks 包的大小。
以往的傳統網站一般會在加載中展示一個 loading 態,也可以達到占位的效果,但是 loading 動畫和真實模塊耦合度低,界面效果不夠優美,JDRD 則是選用骨架屏進行占位,以灰色豆腐塊的形式盡量縮小真實模塊結構與加載占位之間的視覺差異。
骨架屏的兩個用途:
使用 Lazyload 懶加載樓層組件,加載中使用 Loadable 提前占位,占位符設置為骨架屏。
設置組件的 state.loaded 初始值為 false ,數據加載成功時 state.loaded=true ,render 函數里如果 loaded===false ,則顯示骨架屏。
骨架屏的實現方式有兩種,一是下載并引入骨架屏插件(如 antd ),根據不同模塊引入對應的骨架屏組件,這種方式和 loading 動畫一樣,耦合度低,但是全局通用,節省代碼量。二是根據視覺稿寫骨架屏的樣式。JDRD 選擇的是第二種,骨架屏和真實模塊實現高度耦合。每個頁面結構不一樣,對應的骨架屏也是完全不同,骨架屏暫時不能抽成公共組件全局通用。
首頁定稿設定的寬度為 1240px ,對小屏不夠友好,我們增加了一版窄版樣式兼容小屏。
寬版和窄版開發的重點是定好通用的變量,包括字號粗細、寬窄版寬度、窄版尺寸比。這些通用樣式規范需要和設計師統一規范,兼容窄版的開發就會變得非常簡單。
只需要在兩個地方判斷寬窄版,給最頂層的標簽加上 wide/narraw 類,在 narrow 下添加窄版的自定義樣式。
!function(e) {
window.pageConfig={};
pageConfig.isWide=function() {
var n=e,
i=document,
o=i.documentElement,
t=i.getElementsByTagName("body")[0],
a=n.innerWidth || o.clientWidth || t.clientWidth;
return a >=1300
} ();
var n=[];
pageConfig.isWide ? (n.push("wide")) : n.push("narrow");
var i=document.getElementsByTagName("html")[0];
i.className=n.join(" ")
} (window, void 0);
先引入 Events.js ,然后在 componentDidMount 里生命周期函數里綁定 ‘ isWideChange ‘ 事件,在文檔視圖寬度達到寬窄版臨界點時調用。
componentDidMount() {
window._.eventCenter.on('isWideChange', evt=> {
this.setState({//更新state,更新視圖
isWide: evt.detail.isWide
});
});
}
為了突出設計理念,首頁圖標動效包含大量位移、旋轉、縮放、形變、路徑動畫等細節,由始末動畫+循環動畫合成,傳統做法是 css3 實現,這需要逐幀寫動畫細節,工作量非常大,我們嘗試使用 Lottie 直接解析從 AE 導出的 json 格式的動畫(方案由燕婷提出),發現能夠完全還原AE動畫。
Lottie 是 Airbnb 開源的一套跨平臺的完整的動畫效果解決方案,可實時渲染 After Effects 動畫,從而使應用程序可以像使用靜態圖像一樣輕松地使用動畫。這樣實現起來就非常簡單了。分以下兩步:
lottie-web 文檔中的方法非常全面,JDRD 圖標動效使用加載動畫、播放指定幀區間、反向播放動畫方法,就實現了起始動畫 20 幀+循環動畫 60 幀+起始動畫反向播放 20 幀的動畫合成操作。
項目示例代碼如下:
npm install lottie-web //安裝lottie-web
import lottie from 'lottie-web' //引入lottie-web到項目中
//lottie-web常用方法
this.anim=lottie.loadAnimation({ //加載動畫
container: element,
renderer: 'svg',
loop: true,
autoplay: true,
path: 'data.json'
});
this.anim.playSegments([[0,60]], true); //播放指定幀區間
this.anim.setDirection(-1);//動畫反向播放
this.anim.play();//播放動畫
this.anim.pause()//暫停動畫
經過以上兩步,Lottie 已經將一個 AE 格式的動畫渲染在 web 頁面上。
這里有 2 個需要注意的點:
以上就是用 Lottie 實現的動畫,看到這里,是不是覺得 so easy,但是 Lottie 并不是萬能的,不能解析所有的動畫特性,開發前需要先看下支持列表。并和設計師確認是否都支持。
JDRD 整站采用了骨架屏占位,那么入場動畫最大的問題就是如何讓它不和骨架屏沖突,解決方法就是樓層懶加載里面,再加一層入場動畫的組件懶加載,兩層懶加載的設置 offset 差,就可以做到在可視區外加載樓層組件,在可視區內播放入場動畫。具體實現如下:
// 在距離底部200px時,加載樓層組件
getMaterialLoadable(){
return this.getFloor(
<Lazyload lazyloadOptions={offset: 200} height={1000}>
<MaterialLoadable />
</Lazyload>
);
}
// 在距離底部-200px時,加載入場動畫組件,這時因為樓層組件已經加載過了,頁面顯示是真實組件而不是骨架屏
<Lazyload lazyloadOptions={offset: -200}>
<div className="w">
<IndexTitle showLine={true} title={this.state.title}></IndexTitle>
{this.renderMaterial()}
</div>
</Lazyload>
另外一個難點是序列動畫的效果,序列動畫就是將列表元素的動畫執行時機錯開,具體實現參考css3 animation 屬性眾妙。實現代碼如下:
@for $i from 1 to 6 {
.list__item:nth-child(#{$i}) {
animation-delay: (-1+$i)*0.1s; /*計算每個元素的 animation-delay */
}
}
產品頁的頭部動效分兩部分,氛圍動效 + 波浪動效。
氛圍動效的實現比較簡單,也是使用 Lottie 實現,這里遇到了 Lottie 不支持的特性,就是漸變,對于不支持的特性,我們可以拿到需要自定義樣式的標簽的 id,自定義樣式,如圖所示:
#__lottie_element_369 {
stop[offset="0%"] {
stop-color: #FDFDFF;
}
stop[offset="100%"] {
stop-color: #F7F7FB;
}
}
自定義樣式的時候,這里有個坑一定要注意,SVG 的 ID 是會變的,例如開發時,這個 ID 是 100,測試時這個 ID 有可能變成 101,這個是偶現的,目前還沒有找到 ID 值 + 1 的原因,但是為了讓自定義的樣式生效,需要給 ID 為 100 和 ID 為 101 的標簽都加上樣式。
通過引入正弦波浪動效庫 sine_wave 實現。sine_wave 使用 canvas 元素生成多個可配置的正弦波,這樣我們就可以通過配置參數得到想要的正弦波浪,具體實現如下:
new SineWaves({
el: document.getElementById( `waves`),//dom
speed: 0.75,//速度
width: function() {//canvas寬度
return document.body.clientWidth;
},
height: 68,//canvas高度
ease: 'Linear',//動畫曲線
waves: [//需要配置的正弦波浪
{
"timeModifier":1,//速度
"lineWidth":1,//線條寬度
"amplitude":30 * window.devicePixelRatio,//波浪高度
"wavelength":125 * window.devicePixelRatio,//波長
"strokeStyle":"rgba(221,221,233,1)",//顏色
"type": function(x, waves) {//自定義波浪類型
return waves.sine(x); // Combine two together
}
}
],
rotate: 0,//旋轉角度
wavesWidth: '400%',//波浪寬度
});
根據文檔介紹的參數來看,有兩個參數是實現 3D 旋轉波浪效果的關鍵:
type: function(x, waves) {
return waves.sine(x+8); // Combine two together
}
開發過程中發現 sine_waves 的一個顯示問題,它以默認二倍屏的方式定義的 canvas,這樣在一倍屏下波浪是有問題的,解決方法是在參數波浪高度 amplitude 和波長 wavelength 根據 window.devicePixelRatio 來定義。
{
"amplitude":30 * window.devicePixelRatio,//波浪高度
"wavelength":125 * window.devicePixelRatio,//波長
}
最后介紹的就是全局細節動效的優化,為了讓整站的動效流暢,平滑的過渡,做了以下工作:
本文從項目架構、開發流程、項目優化 3 個方面闡述 JDRD 官網的開發過程,中間遇到了太多問題,在問題的解決過程中記錄和總結,是收獲滿滿的喜悅,也發現了一些可以優化的模塊,讓下次能夠做得更好,在開發過程中的多些思考和探究,最優化的設計項目。
感謝閱讀!
凹凸實驗室原鏈接:https://aotu.io/notes/2020/02/21/jdrd-summary/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。