用 CSS 隱藏頁面元素有許多種方法。你可以將 opacity 設為 0、將 visibility 設為 hidden、將 display 設為 none 或將 position 設為 absolute 然後將位置設為不可見區域。
你有沒有想過,為什麼我們要有這麼多技術來隱藏元素,而它們看起來都實現的是同樣的效果?每一種方法實際上與其他方法之間都有一些細微的不同,這些方法決定了在一個特定的場合下使用哪一個方法。這篇教學將涵蓋到那些你需要記住的細小不同點,讓你根據不同情況選擇上面這些方法中適合的方法來隱藏元素。
opacity 屬性的意思是設定一個元素的透明度。它不是為改變元素的邊界框(bounding box)而設計的。這意味著將 opacity 設為 0 只能從視覺上隱藏元素。而元素本身依然佔據它自己的位置並對網頁的佈局起作用。它也將響應用戶互動。
.hide { opacity: 0; }
如果你打算使用 opacity 屬性在讀屏軟體中隱藏元素,很不幸,你並不能如願。元素和它所有的內容會被讀屏軟體閱讀,就像網頁上的其他元素一樣。換句話說,元素的行為就和它們不透明時一致。
我還要提醒一句,opacity 屬性可以用來實現一些效果很棒的動畫。任何 opacity 屬性值小於 1 的元素也會建立一個新的堆疊上下文(stacking context)。
看下面的例子:
看 @SitePoint 提供的範例「用 opacity 隱藏元素」
# codepen.io/SitePoint/pen/bedZrR/
# 當你的滑鼠移到被隱藏的第 2 個的區塊上,元素狀態平滑地從完全透明過渡到完全不透明。區塊也將 cursor 屬性設定為了 pointer,這說明了用戶可以與它互動。
第二個要說的屬性是 visibility。將它的值設為 hidden 將隱藏我們的元素。如同 opacity 屬性,被隱藏的元素仍然會對我們的網頁佈局起作用。與 opacity 唯一不同的是它不會響應任何用戶互動。此外,元素在讀取螢幕軟體中也會被隱藏。
這個屬性也能夠實現動畫效果,只要它的初始和結束狀態不一樣。這確保了 visibility 狀態切換之間的過渡動畫可以是時間平滑的(事實上可以用這一點來用 hidden 實現元素的延遲顯示和隱藏——譯者註)。
.hide { visibility: hidden; }
下面的範例示範了 visibility 與 opacity 有怎樣的不同:
# 看 @SitePoint 提供的範例「用 visibility 隱藏元素」
# codepen.io/SitePoint/pen/pbJYpV/
注意,如果一個元素的visibility 被設定為hidden,同時想要顯示它的某個子孫元素,只要將那個元素的visibility 明確設定為visible 即可(就如例子裡面的.o-hide p——譯者註)。試著只 hover 在隱藏元素上,不要 hover 在 p 標籤裡的數字上,你會發現你的滑鼠遊標沒有變成手指頭的樣子。此時,你點擊滑鼠,你的 click 事件也不會被觸發。
而在
標籤裡面的
標籤則依然可以捕捉所有的滑鼠事件。一旦你的滑鼠移動到文字上,
本身變得可見並且事件註冊也隨之生效。
display 屬性依照詞義真正隱藏元素。將 display 屬性設為 none 確保元素不可見且連盒模型也不產生。使用這個屬性,被隱藏的元素不佔據任何空間。不僅如此,一旦 display 設為 none 任何對該元素直接打使用者互動操作都不可能生效。此外,讀螢幕軟體也不會讀到元素的內容。這種方式產生的效果就像元素完全不存在。
任何這個元素的子孫元素也會被同時隱藏。為這個屬性新增過渡動畫是無效的,它的任何不同狀態值之間的切換總是會立即生效。
不過請注意,透過 DOM 依然可以存取到這個元素。因此你可以透過 DOM 來操作它,就像操作其他的元素。
.hide { display: none; }
看下面的例子:
@SitePoint 提供的範例「用 display 隱藏元素」
# codepen.io/SitePoint/pen/zBGbjb/
# 你將會看到第二個區塊元素內有一個
元素,它自己的 display 屬性被設定成 block,但是它仍然不可見。這是 visibility:hidden 和 display:none 的另一個不同之處。在前一個例子裡,將任何子孫元素visibility 明確設定成visible 可以讓它變得可見,但是display 不吃這套,不管自身的display 值是什麼,只要祖先元素的display 是none,它們就都不可見。
现在,将鼠标移到第一个块元素上面几次,然后点击它。这个操作将让第二个块元素显现出来,它其中的数字将是一个大于 0 的数。这是因为,元素即使被这样设置成对用户隐藏,还是可以通过 JavaScript 来进行操作。
假设有一个元素你想要与它交互,但是你又不想让它影响你的网页布局,没有合适的属性可以处理这种情况(opacity 和 visibility 影响布局, display 不影响布局但又无法直接交互——译者注)。在这种情况下,你只能考虑将元素移出可视区域。这个办法既不会影响布局,有能让元素保持可以操作。下面是采用这种办法的 CSS:
.hide { position: absolute; top: -9999px; left: -9999px; }
下面的例子阐明了怎样通过绝对定位的方式隐藏元素,并让它和前面的那个例子效果一样:
看 @SitePoint 提供的例子“用 position 属性隐藏元素”
codepen.io/SitePoint/pen/QEboZm/
这种方法的主要原理是通过将元素的 top 和 left 设置成足够大的负数,使它在屏幕上不可见。采用这个技术的一个好处(或者潜在的缺点)是用它隐藏的元素的内容可以被读屏软件读取。这完全可以理解,是因为你只是将元素移到可视区域外面让用户无法看到它。
你得避免使用这个方法去隐藏任何可以获得焦点的元素,因为如果那么做,当用户让那个元素获得焦点时,会导致一个不可预料的焦点切换。这个方法在创建自定义复选框和单选按钮时经常被使用。(用 DOM 模拟复选框和单选按钮,但用这个方法隐藏真正的 checkbox 和 radio 元素来“接收”焦点切换——译者注)
隐藏元素的另一种方法是通过剪裁它们来实现。在以前,这可以通过 clip 属性来实现,但是这个属性被废弃了,换成一个更好的属性叫做 clip-path。Nitish Kumar 最近在 SitePoint 发表了“介绍 clicp-path 属性”这篇文章,通过阅读它可以了解这个属性的更多高级用法。
记住,clip-path 属性还没有在 IE 或者 Edge 下被完全支持。如果要在你的 clip-path 中使用外部的 SVG 文件,浏览器支持度还要更低。使用 clip-path 属性来隐藏元素的代码看起来如下:
.hide { clip-path: polygon(0px 0px,0px 0px,0px 0px,0px 0px); }
下面是一个实际使用它的例子:
看 @SitePoint 提供的例子“用 clip-path 属性隐藏元素”
http://codepen.io/SitePoint/pen/YWXgdW/
如果你把鼠标悬停在第一个元素上,它依然可以影响第二个元素,尽管第二个元素已经通过 clip-path 隐藏了。如果你点击它,它会移除用来隐藏的 class,让我们的元素从那个位置显现出来。被隐藏元素中的文字仍然能够通过读屏软件读取,许多 WordPress 站点使用 clip-path 或者之前的 clip 来实现专门为读屏软件提供的文字。
虽然我们的元素自身不再显示,它也依然占据本该占据的矩形大小,它周围的元素的行为就如同它可见时一样。记住用户交互例如鼠标悬停或者点击在剪裁区域之外也不可能生效。在我们的例子里,剪裁区大小为零,这意味着用户将不能与隐藏的元素直接交互。此外,这个属性能够使用各种过渡动画来实现不同的效果。
在这篇教程里,我们看了 5 种不同的通过 CSS 隐藏元素的方法。每一种方法都与其他几种有一点区别。知道你想要实现什么有助于你决定采用哪一个属性,随着时间推移,你就能根据实际需求本能地选择最佳方式了。如果你对于隐藏元素的这些方法还有任何问题,请在评论中留言。
以上是5種用 CSS 隱藏頁面元素的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!