一說起隱藏HTML頁面上的元素,很多人第一反應(yīng)就是設(shè)置元素的css屬性display:none;值,這是一種最常見的隱藏頁面元素方法。本篇文章我們就一起看看使用CSS隱藏頁面元素的方法,以及它們的區(qū)別。
本篇文章中的例子直接放到github地址中,感興趣的同學(xué)可以自取。
https://github.com/zhouxiongking/article-pages/blob/master/articles/hideElement/hideElement.html
CSS
正如上文說的一樣,最簡單也最粗暴的方法就是設(shè)置元素的display屬性為none;
display:none;
設(shè)置為display:none;的元素將不會再占用頁面空間,其占用的空間會被其他元素所占有,從而會引起瀏覽器的重排和重匯。
另外一種方法是設(shè)置元素的visibility屬性為hidden。
visibility: hidden
這種做法雖然能夠隱藏元素,但是該元素仍會占用頁面空間,因此只會導(dǎo)致瀏覽器的重匯而不會引起重排。
如果希望元素隱藏后不會引起頁面布局的變化,則推薦使用visibility:hidden;方式。
設(shè)置元素透明度opacity屬性為0,也可以隱藏頁面元素。
opacity:0
在呈現(xiàn)上與visibility:hidden;方式一樣,同樣會占據(jù)頁面空間。
對頁面布局的影響主要是看是否會引起瀏覽器的重匯和重排,對應(yīng)的差異如下圖所示。
頁面布局差異
display:none;的元素會直接從頁面上消失,因此在該元素上綁定的事件不會生效。
visibility: hidden;的元素不會觸發(fā)綁定的事件。
opacity:0; 的元素會觸發(fā)綁定的事件,例如點(diǎn)擊會觸發(fā)click函數(shù)。
我們可以通過以下的例子來看看。
首先我們定義兩個div,分別設(shè)置為visibility: hidden;和opacity:0,在兩個div上分別綁定一個click事件。
定義div元素
綁定的事件
當(dāng)我們在兩個元素都進(jìn)行點(diǎn)擊時,可以在控制臺看到如下輸出結(jié)果。
結(jié)果
從上述結(jié)果可以看出和上述結(jié)論一致。
display:none;的元素會直接從頁面消失,因此定義transition效果完全無效。
visibility:hidden;的元素會在transition設(shè)置的時間內(nèi)消失,但是沒有動畫效果。
opacity:0;的元素可以和正常元素一樣,從頁面以動畫效果消失。
同樣我們可以通過以下這個例子來看看。
首先,我們定義兩個div,并設(shè)置其transition屬性。
div元素
定義transition效果
我們通過將鼠標(biāo)移至元素上,可以看到兩者的差異,從而驗(yàn)證了上述結(jié)論的正確性。
本篇文章主要講解了使用CSS隱藏元素的幾種常用方法,并講解了它們之間的區(qū)別,以便大家在特定的場景中進(jìn)行選擇。
平常的樣式排版中,我們經(jīng)常遇到將某個模塊隱藏,下面我整理了一下隱藏元素的多種方法以及對比(有的占據(jù)空間,有的不占據(jù)空間。有的可以點(diǎn)擊,有的不能點(diǎn)擊。):
( 一 ) display: none;
特點(diǎn):元素不可見,不占據(jù)空間,無法響應(yīng)點(diǎn)擊事件。
.hide{ display: none; }
( 二 ) opacity: 0; ( IE8以下版本:filter:Alpha(opacity=50) )
特點(diǎn):改變元素透明度,元素不可見,占據(jù)頁面空間,可以響應(yīng)點(diǎn)擊事件。
.hide{ opacity: 0; filter:Alpha(opacity=0); }
( 三 ) visibility: hidden;
特點(diǎn):元素不可見,占據(jù)頁面空間,無法響應(yīng)點(diǎn)擊事件。
.hide{ visibility: hidden; }
( 四 ) transform: scale(0);
( 1 ) zoom: 0.1; transform: scale(0);
特點(diǎn):元素不可見,IE 6 7 9 不占據(jù)頁面空間,IE8 谷歌 火狐 歐朋 等瀏覽器占據(jù)空間,無法響應(yīng)點(diǎn)擊事件。
.hide{ zoom: 0.1; transform: scale(0); -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); -o-transform: scale(0); }
( 2 ) position: absolute; zoom: 0.1; transform: scale(0);
特點(diǎn):元素不可見,不占據(jù)頁面空間,無法響應(yīng)點(diǎn)擊事件。
.hide{ position: absolute; zoom: 0.1; transform: scale(0); -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); -o-transform: scale(0); }
( 五 ) width: 0; height: 0; 配合overflow: hidden;
特點(diǎn):元素不可見,不占據(jù)頁面空間,無法響應(yīng)點(diǎn)擊事件。但 padding值 和 margin值 依然存在,需要將內(nèi)外邊距都調(diào)整為0。
.hide{ display: inline-block; width: 0; height: 0; padding: 0; margin: 0; overflow: hidden; }
( 六 ) position: absolute; left: -200%; 或者 top: -200%;等,父級需要相對定位,這種left top值可以根據(jù)具體的實(shí)際情況去定義
特點(diǎn):元素不可見,不占據(jù)頁面空間,無法響應(yīng)點(diǎn)擊事件。
. father{ position: relative; overflow: hidden; } .hide{ position: absolute; left: -200%;//或top: -200%; }
( 七 ) clip-path: polygon(0px 0px,0px 0px,0px 0px,0px 0px)
特點(diǎn):元素不可見,占據(jù)頁面空間,無法響應(yīng)點(diǎn)擊事件。
.hide{ float: left; width: 150px; margin: 20px; clip-path: polygon(0px 0px, 0px 0px, 0px 0px, 0px 0px); }
( 八 ) margin: top | right | bottom | left ;父級添加overflow: hidden; (margin的值 一定要小于(子級的寬度加上邊距的總和的負(fù)數(shù)))
特點(diǎn):元素不可見,不占據(jù)頁面空間,無法響應(yīng)點(diǎn)擊事件。
.father{ width: 400px; height: 400px; overflow: hidden; } .hide{ display: inline-block; width: 200px; height: 200px; margin-left: -200px; }
以上就是幾種隱藏元素的方法,我在以前的面試中,也碰到了面試官提出的一些關(guān)于隱藏元素css的對比,查閱了一些資料,做了以下整理:
( 一 ) display: none 和 visibility: hidden 的區(qū)別
1. 占據(jù)頁面空間( display: none 將元素隱藏后,在頁面是是不占有空間位置的,而visibility: hidden 將元素隱藏后,還保留著元素大小的空間位置 ) ;
2. display: none 影響了 reflow和repaint(回流與重繪),而visibility: hidden并沒有影響
3. 某個模塊添加了display: none; 它下面的任何子級都會被隱藏,而添加了visibility: hidden,子級一旦有添加visibility: visible的css,該子級將不會被隱藏。
( 二 ) display: none 和 opacity: 0的區(qū)別
1. 占據(jù)頁面空間( display: none 將元素隱藏后,在頁面是是不占有空間位置的,而opacity: 0 只是改變了元素的透明度將其隱藏,還保留著元素大小的空間位置 ) ;
2. display: none 不會被子類繼承,但是子類一樣不會顯示。 opacity: 0 會被子類繼承,但不能像visibility的屬性一樣,給子類添加opacity:1,并不能將子類顯示。
3. css3 transition 屬性對display:none 并無效果,但對opacity 則有效果。(附加一句,對visibility: hidden也無效果)
人人都是產(chǎn)品經(jīng)理【起點(diǎn)學(xué)院】,BAT實(shí)戰(zhàn)派產(chǎn)品總監(jiān)手把手系統(tǒng)帶你學(xué)產(chǎn)品、學(xué)運(yùn)營。
2012年,path首先使用了漢堡菜單作為產(chǎn)品的導(dǎo)航方式來替代原本的標(biāo)簽頁的導(dǎo)航方式。一時引起了各大廠商的跟風(fēng),Youtube、facebook等App都紛紛把自己的導(dǎo)航改成了抽屜式導(dǎo)航。但由于沒有統(tǒng)一的規(guī)范,各個產(chǎn)品的抽屜導(dǎo)航設(shè)計(jì)也各不相同,為了控制Android平臺日益混亂的抽屜交互方式,2013 Google I/O大會之后,Google將Navigation Drawer納入了Android Design規(guī)范當(dāng)中,隨后大量應(yīng)用開始采用這種交互模式【1】。
不過慢慢的,包括youtube和facebook在內(nèi)的很多app都將抽屜式導(dǎo)航換回了原來的標(biāo)簽頁導(dǎo)航,從此,對于抽屜式導(dǎo)航的爭辯就一直沒有斷過。并且慢慢的,對于抽屜式導(dǎo)航的批評漸漸多于肯定【2】。我摘取其中的兩則批評如下。
...上圖的 APP 將選項(xiàng)卡(tab row)變成抽屜式導(dǎo)航菜單(drawer menu),用戶在相應(yīng)功能間的切換率急劇下降。...很多用戶還沒有建立起相應(yīng)的心理模型(尤其是抽屜式或者漢堡包菜單)盡量將 APP 的核心功能放在用戶可以看得到地方。
——能露出來, 就別藏著
觸摸操作中,手勢永遠(yuǎn)要比點(diǎn)擊優(yōu)先級低。現(xiàn)代觸摸操作習(xí)慣畢竟只流行了幾年,然而傳統(tǒng)PC上的操作習(xí)慣已經(jīng)實(shí)行了將近20年。所以通過滑動來切換Tab不會比點(diǎn)擊切換來的直觀。
——石頭們
總結(jié)一下,對于抽屜式導(dǎo)航的批評主要有如下幾點(diǎn):
1. 可見性不好:
2. 操作復(fù)雜。抽屜式導(dǎo)航的切換可以直接點(diǎn)擊,如果Tab放在上方可以直接滑動切換。但是抽屜式導(dǎo)航的切換就要先呼出側(cè)邊欄,然后再點(diǎn)擊,相對比而言,操作更加繁瑣。
3. 與現(xiàn)有的交互方式?jīng)_突。抽屜式導(dǎo)航可以從屏幕左邊緣向右滑動喚出,與iOS的后退操作沖突。但是這本來就是Android的設(shè)計(jì)規(guī)范,并不一定適用于iOS,所以我覺得的這個批評不成立。
但是,正如那句老話“垃圾是放錯地方的資源”,我始終相信,沒有不好的交互設(shè)計(jì),只有不適合產(chǎn)品使用場景的交互設(shè)計(jì)。所以抽屜式導(dǎo)航也是有它的正確使用方法的。
首先關(guān)于這個入口的問題,我覺得暫時是無解的,但是這是可以通過長期的用戶教育來實(shí)現(xiàn)的。正如現(xiàn)在的開關(guān)鍵(一個圓圈加一條杠),這個設(shè)計(jì)其實(shí)并不能一目了然地讓人知道這是開關(guān)鍵,但是經(jīng)過長期的使用,現(xiàn)在大部分人都會知道這是開關(guān)鍵。所以,這個問題就只能交給時間來解決了。
但是除此之外,上面的批評1,2總結(jié)一下就是切換麻煩(批評3不太站得住腳)。只是,如果產(chǎn)品的導(dǎo)航不需要頻繁切換呢?如果有其他的切換入口呢?那么問題就迎刃而解了。那么有沒有產(chǎn)品是這樣的呢?答案是:當(dāng)然有。下面我就結(jié)合一些例子來講講抽屜式導(dǎo)航的正確使用方式。
抽屜式導(dǎo)航的使用場景首先一點(diǎn)是:導(dǎo)航的模塊是有主次之分的。相對比于常用的標(biāo)簽式導(dǎo)航而言,抽屜式導(dǎo)航的模塊之間主次區(qū)分更加明顯。
基于以上三點(diǎn),標(biāo)簽式導(dǎo)航模塊之間的區(qū)分不是特別大。
但是對于抽屜式導(dǎo)航而言,以上三點(diǎn)都不成立。所以,相對而言,抽屜式導(dǎo)航的第一個模塊的重要程度要遠(yuǎn)遠(yuǎn)大于其他的模塊。也就是說,當(dāng)不同導(dǎo)航模塊之間存在明顯的主次之分時,才可以考慮使用抽屜式導(dǎo)航。
舉個例子,豆瓣一刻的導(dǎo)航模塊如下:
一刻的導(dǎo)航
如上圖,因?yàn)槎拱暌豢痰馁Y訊都是嚴(yán)格按照每天為單位的,一刻的目的也是希望你當(dāng)天閱讀完當(dāng)天的內(nèi)容。所以,一刻的核心使用場景是當(dāng)日事當(dāng)日畢,當(dāng)天的內(nèi)容(即“今日一刻”模塊)的優(yōu)先級遠(yuǎn)遠(yuǎn)大于其他模塊。其他模塊是為次要場景設(shè)計(jì)的,即使?jié)B透率不高,對于產(chǎn)品的影響也不大。
對于次要的模塊,我們并不需要嚴(yán)格保證模塊的滲透率。但是,假如我們可以提高次要模塊的滲透率,又何樂而不為呢?既然抽屜式導(dǎo)航的可見性不高,操作繁瑣,那為什么不可以另辟蹊徑?設(shè)置一個可以見高,操作便捷的入口呢?答案當(dāng)然是肯定的。
對于豆瓣一刻來說,模塊之間的優(yōu)先級如下:今日一刻>往期內(nèi)容>熱門作者、欄目瀏覽、我的喜歡。所以,往期內(nèi)容模塊的使用場景是僅次于今日一刻模塊,但是又遠(yuǎn)遠(yuǎn)高于其他模塊。所以,針對這個模塊,可以設(shè)置更加便捷的快捷入口。豆瓣一刻的處理方式如下圖:
次要內(nèi)容快捷入口
在每日一刻內(nèi)容列表的最下方設(shè)置了一個按鈕,作為往期內(nèi)容模塊的快捷入口。這樣的快捷入口,一方面不會干擾最主要的內(nèi)容,因?yàn)樗O(shè)置在頁面最后面。另一方面,當(dāng)用戶閱讀到最后的時候,假如用戶還有強(qiáng)烈的閱讀愿望,那么這個入口簡直就是沙漠中的甘泉。
最最巧妙的一點(diǎn),為什么這里不用上拉刷新而是使用按鈕呢?因?yàn)樯侠⑿碌膬?nèi)容往往是銜接在當(dāng)前頁面下的,同時上拉刷新的操作成本很低。但是,往期內(nèi)容模塊與今日一刻的區(qū)分度又比較大,銜接在當(dāng)前頁面下并不合適,操作太便利的話又顯示不出模塊之間的區(qū)分度。所以,這里采用按鈕而不是上拉刷新。
當(dāng)然,為了解決可見性的問題,還需要在首次啟動應(yīng)用的時候進(jìn)行引導(dǎo)。對于抽屜式導(dǎo)航的引導(dǎo),有兩種方式:
兩種引導(dǎo)各有利弊,當(dāng)然好處就是都可以起到引導(dǎo)作用。而壞處來說:
相對而言,這種脅迫會對用戶的控制欲造成一些傷害,用戶體驗(yàn)會打一點(diǎn)折扣。
自動打開指引
浮層指引
最后一個方法也是為了解決可見性不高的問題,就是利用讓人又愛又恨的小紅點(diǎn),英文名稱叫Badge Notification。小紅點(diǎn)有兩種形式:一種是帶數(shù)字的,另一種是不帶數(shù)字。帶數(shù)字的一般是跟消息有關(guān)系,比如還有兩條消息未處理,那么小紅點(diǎn)就會顯示一個“2”;不帶數(shù)字的一般就是引導(dǎo)作用,告訴用戶這里有東西需要你查看。
普通小紅點(diǎn)
帶數(shù)字的小紅點(diǎn)
由于小紅點(diǎn)對于用戶來說確實(shí)體驗(yàn)不太好,很多人都會有強(qiáng)烈的強(qiáng)迫癥要消滅這些小紅點(diǎn)。所以,針對用戶的這種心理,小紅點(diǎn)反而成為了產(chǎn)品的一種非常高效、簡潔的引導(dǎo)方式。
不過,有句話要說的是:小紅點(diǎn)雖好,可不要貪杯喲。適當(dāng)適量的引導(dǎo)可以處于一種“既觸發(fā)了用戶的強(qiáng)迫癥又避免讓用戶厭惡”的狀態(tài)。如果一旦超過這個度,產(chǎn)品就有可能會被拋棄,所以謹(jǐn)慎使用小紅點(diǎn)。
再次重復(fù)一下那句話,垃圾是放錯地方的資源。沒有錯誤的控件,只有使用不當(dāng)?shù)目丶K耘c其指責(zé)抽屜式導(dǎo)航的種種錯誤,不如找一個恰當(dāng)?shù)膱鼍叭コ休d它,讓它發(fā)揮自己的閃光之處。以上就是我對于抽屜式導(dǎo)航使用的一些心得。
【1】交互設(shè)計(jì)新手必看!探秘抽屜導(dǎo)航的前生今世 http://www.woshipm.com/ucd/92222.html
【2】哪些因素阻礙國內(nèi) BAT 的移動應(yīng)用采用 Material Design?-Kenny MacCormick的回答-知乎 https://www.zhihu.com/question/37376355/answer/71940532
本文由 @Autumn阿秋原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理 ,未經(jīng)許可,禁止轉(zhuǎn)載。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。