摘要:我們巧妙的提示框打算使用屬性選擇器也就是方括號表示法。相對性這是用在提示框的父元素上的。向上向下提示框要用到關鍵幀,而向左向右提示框使用關鍵幀。注意,在這些關鍵幀中,我們只定義了提示框所需的終止狀態。
原文:https://webdesign.tutsplus.co...
原作:Jase Smith
翻譯:Stypstive
當你的用戶需要漂亮的圖標給出額外的文字信息時,亦或是當他們在點擊了按鈕之后需要確認自己沒點錯時,又或是帶圖片和字幕的復活節彩蛋,提示框是用來增強用戶界面的絕佳手段。現在,讓我們來做幾個動畫提示框,沒有別的,只有HTML和CSS。
樣例這是我們之后要做的:
http://jsfiddle.net/kcschaefe...
在我們沉浸在寫代碼的過程中之前,讓我們先來看看我們的意圖是什么。主要目的是為了獲得一種簡單的添加提示框的方法,這樣一來,我們之后就能夠通過增加一個自定義的 tooltip 屬性來做到這一點。
visible text or icon, etc.
關于可訪問性和功能的記注
如果你在尋找兼容508的提示框,或者需要帶容器沖突偵測和/或HTML內容 vs 純文本的智能提示框,有許多實用第三方腳本的解決方案能滿足你的要求。
"用JavaScript來做完全可訪問的交互組件是命令式的" - Sara Soueidan, 打造一個完全可訪問的幫助提示框...比你想的要難
這篇教程不會特地解決可訪問性的需求。你了解你的用戶,知道他們需要什么,所以有關這方面,也要記得考慮他們的需求。
讓我們設定幾個預期不需要JavaScript
我們將會使用屬性選擇器(而不是類名),以及CSS內建的模式匹配
加到現有的DOM元素(你的標簽中不需要新的元素)
代碼例子中是沒有前綴的(如有需要,為你的目標瀏覽器加上供應商前綴)
假設通過 mouseover/hover 來觸發提示框
僅僅是純文本提示框(HTML,圖片等等都不支持)
當喚起提示框時,有巧妙的動畫
好了,老司機要開車了!哦,等等。我們還要先處理一個問題,是關于"不需要額外標簽"的。畢竟,這很巧妙。 我們的提示框真的不需要額外的DOM元素,因為它們完全是基于偽元素的(::before 和 ::after),我們可以通過CSS來控制。
如果你已經在其它樣式集中使用了一個元素的偽元素,又希望在這個元素是加一個提示框,那么你可能需要稍稍做一些重構。
沒什么比得上來一場提示框盛會了!等等。小壞蛋!還有一個警告:CSS定位。為了提示框正常運作,它們的父元素(我們把提示框添加在它后面)需要是
position: relative,或者
position: absolute,或
position: fixed
基本上,什么都行,只要不是 position: static — 這是瀏覽器賦給幾乎所有元素的默認定位模式。提示框是絕對定位的,所以它們需要知道它們的絕對值在什么邊界內是有意義的。 默認的定位指令 static 不會聲明它的邊界,也不會給我們的提示框以上下文來進行相對定位。所以提示框會使用之后,最近的,有聲明邊界的父元素。
你還需要根據你如何使用提示框來決定哪個定位指令最為合適。這篇教程假設父元素是 postion: relative 如果你的UI依靠一個絕對定位的元素,那么在那個元素上部署一個提示框,也會需要一些重構(額外的標簽)。
讓我們開始吧。
屬性選擇器:快速回顧大多數CSS規則印象中都是用類名寫的,比如 .this-thing ,但是CSS有幾個類型的選擇器。我們巧妙的提示框打算使用屬性選擇器——也就是方括號表示法。
[foo] { background: rgba(0, 0, 0, 0.8); color: #fff; }
當瀏覽器看到諸如此類的東西時:
Check it out!
瀏覽器會知道,它需要應用 [foo] 規則了,因為 標簽有一個叫做 foo 的屬性。在這個例子中,span自身會有一個半透明的黑色背景,以及白色文字。
HTML元素有著各種各樣的內置屬性,但是我們也可以給出我們自己的屬性。比如 foo ,又或者是 tooltip 。默認情況下,HTML不知道這些東西是什么意思,但是有了CSS,我們可以告訴HTML這些自定義屬性是什么意思。
為什么用屬性選擇器?我們后面會使用屬性選擇器,主要是出于側重分離的目的。使用屬性而不是類名,并不會讓我們在詳細程度上獲得更多益處,類和屬性在詳細程度上是相同的。 然而,通過使用屬性,我們可以把我們的內容放在一塊兒,因為HTML屬性可以有值,而類名沒有值。
在這個例子的代碼中,來權衡一下類名 .tooltip 對比屬性 [tooltip] 。類名是 [class] 屬性的值中的一個,而tooltip屬性可以存放一個值,它就是我們要顯示的文字。
lorem ipsum lorem ipsum現在讓我們來看看提示框煉金術
我們的提示框會使用兩種不同的屬性:
tooltip: 這個屬性存放了提示框的內容(一個純文本字符串)
flow: 可選;這個屬性允許我們控制如何顯示提示框。我們可以支持很多方位,但是我們會覆蓋4各常用方位:上,左,右,下
現在,讓我們為所有的提示框做好準備工作。步驟1-5的規則會應用到所有的提示框上,無論我們給 flow 屬性什么值。步驟6-7對于不同的 flow 值會有所區分。
1) 相對性這是用在提示框的父元素上的。讓我們來給定一個定位指令,這樣提示框的組成部分(即::before 和 ::after 偽元素)的絕對定位就可以以父元素做參照進行定位,而不是以整個頁面或祖父元素或DOM樹上方的其它外圍元素作為參照進行定位。
[tooltip] { position: relative; }2) 偽元素準備時間
是時候準備偽元素了。在這里,我們要對 ::before 和 ::after 設置常用屬性。content 屬性是真正讓偽元素工作的屬性,不過我們稍后再討論它。
[tooltip]::before, [tooltip]::after { line-height: 1; user-select: none; pointer-events: none; position: absolute; display: none; opacity: 0; /* opinions */ text-transform: none; font-size: .9em; }3) 丁克帽
我不知道丁克帽是不是說得通,我只是一直這么叫它。它是一個尖尖的小三角形,通過指向它的調用者,為提示框提供對話氣泡的感覺。 注意到我們在邊界顏色這一塊,使用了 tranparent ;由于上色要根據提示框的 flow 值來,所以之后再加上顏色。
[tooltip]::before { content: ""; z-index: 1001; border: 5px solid transparent; }
content: "";聲明中的值是一個空字符串,這并不是筆誤。字符串里面,我們不想要任何東西,但是我們需要這個屬性,使得偽元素得以存在。
為了生成一個三角形,我們定義了一個實現邊框,在空的盒子(沒有內容)上加了一些厚度,而不設定盒子的寬度和高度,僅僅對盒子的每一條邊都給一個邊框顏色。
4) 氣泡!這里是重點了。注意到 content: attr(tooltip) 這一部分是說:“這個偽類應該使用 tooltip 屬性的值作為這個偽類的內容。”這也是為什么使用屬性而不是類名會這么贊的原因。
[tooltip]::after { content: attr(tooltip); /* magic! */ z-index: 1000; /* most of the rest of this is opinion */ font-family: Helvetica, sans-serif; text-align: center; /* Let the content set the size of the tooltips but this will also keep them from being obnoxious */ min-width: 3em; max-width: 21em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; /* visible design of the tooltip bubbles */ padding: 1ch 1.5ch; border-radius: .3ch; box-shadow: 0 1em 2em -.5em rgba(0, 0, 0, 0.35); background: #333; color: #fff; }
注意看丁克帽和氣泡的 z-index 值。這些值可以是任意的。但是要記住,z-index 值是相對的。 解釋:一個z-index值為1001的元素,在一個z-index為3的元素內部。僅僅意味著,z-index: 3 容器內部,1001元素是最頂層的元素。
氣泡的z-index應該至少比丁克帽的z-index低一檔。如果它和丁克的一樣高,或更高的話,如果你提示框使用了 box-shadow 的話,結果在丁克帽上回得到不一致的顏色效果。
5)交互動作我們的提示框是通過把鼠標移動到帶提示框的元素上面,來激活的。差不多是這樣。
[tooltip]:hover::before, [tooltip]:hover::after { display: block; }
如果你回顧在第2不中的樣式部分,你會看到我們對提示框的組成部分,使用了 opacity: 0; 以及 display: none; 。我們這么做是為了當提示框顯示和隱藏時,可以使用CSS動畫效果。
display屬性是不能做成動畫的,但是opacity屬性可以!我們留到最后來處理動畫的問題。如果你對動畫提示框沒興趣,只要把第2步中的 opacity: 0; 刪掉,無視第7步即可。
最后一件要應用到所有提示框上的是,如果提示框沒有內容,能有一個方法來抑制提示框。如果你使用某種動態系統(Vue.js, Angular, 或者 React, PHP等等)來生成提示框的話,我們就不需要笨笨的空白氣泡了!
/* don"t show empty tooltips */ [tooltip=""]::before, [tooltip=""]::after { display: none !important; }6) 流控制
這一步會變得更加復雜,因為我們會使用一些不那么常見的選擇器,來幫助我們的提示框基于 flow 值(或沒有flow屬性)來確定位置。
“奇怪的東西出現在了 Circle-K 的門口” — Ted Theodore Logan
在我們寫樣式之前,讓我們看看將要用到一些選擇器模式。
[tooltip]:not([flow])::before, [tooltip][flow^="up"]::before { /* ... properties: values ... */ }
這是在告訴瀏覽器:“對于所有帶有 tooltip 屬性來說,其中沒有 flow 屬性的元素,或者有flow元素,但它的值是以"up"開頭的:將這些樣式套用到這類元素的::before偽元素上。”
我們在這里使用了一個模式,這樣一來,這些東西可以擴展到其它流上,而步需要重復這么多的CSS。這個模式 flow^="up" 使用了 ^= (開頭)匹配符。 如果你想增加其它流控制的話,通過這個模式,也可以將樣式應用在 up-right 和 up-left 方向上(代碼中)。我們在這里不會討論這些流控制,不過你可以在CodePen上,我原來的提示框演示中看到如何使用它們。
以下是教程中所講到的4個流所對應的CSS代碼塊。
上/* ONLY the ::before */ [tooltip]:not([flow])::before, [tooltip][flow^="up"]::before { bottom: 100%; border-bottom-width: 0; border-top-color: #333; } /* ONLY the ::after */ [tooltip]:not([flow])::after, [tooltip][flow^="up"]::after { bottom: calc(100% + 5px); } /* Both ::before & ::after */ [tooltip]:not([flow])::before, [tooltip]:not([flow])::after, [tooltip][flow^="up"]::before, [tooltip][flow^="up"]::after { left: 50%; transform: translate(-50%, -.5em); }下
[tooltip][flow^="down"]::before { top: 100%; border-top-width: 0; border-bottom-color: #333; } [tooltip][flow^="down"]::after { top: calc(100% + 5px); } [tooltip][flow^="down"]::before, [tooltip][flow^="down"]::after { left: 50%; transform: translate(-50%, .5em); }左
[tooltip][flow^="left"]::before { top: 50%; border-right-width: 0; border-left-color: #333; left: calc(0em - 5px); transform: translate(-.5em, -50%); } [tooltip][flow^="left"]::after { top: 50%; right: calc(100% + 5px); transform: translate(-.5em, -50%); }右
[tooltip][flow^="right"]::before { top: 50%; border-left-width: 0; border-right-color: #333; right: calc(0em - 5px); transform: translate(.5em, -50%); } [tooltip][flow^="right"]::after { top: 50%; left: calc(100% + 5px); transform: translate(.5em, -50%); }7) 讓一切都動起來
動畫是很神奇的。動畫可以做到:
讓用戶感覺舒服
讓用戶感受到你的用戶界面的空間感
注意到該看到的東西
讓用戶界面中本來非黑即白的生硬效果變得柔和
我們的提示框屬于最后那一種。如果僅僅是讓一個文字泡泡出現然后突然消失,效果是不令人滿意的,我們可以讓它更柔和一些。
關鍵幀 (@keyframes)我們需要兩個關鍵幀 (@keyframe) 動畫。向上/向下提示框要用到tooltips-vert關鍵幀,而向左/向右提示框使用tooltips-horz關鍵幀。 注意,在這些關鍵幀中,我們只定義了提示框所需的終止狀態。我們并不需要知道它們從何處來 (提示框本身就有狀態信息)。我們只想控制它們要到哪兒去。
@keyframes tooltips-vert { to { opacity: .9; transform: translate(-50%, 0); } } @keyframes tooltips-horz { to { opacity: .9; transform: translate(0, -50%); } }
現在,當一個用戶的鼠標移到觸發元素 (具有[tooltip]屬性的元素) 上時,我們需要將這些關鍵幀應用到提示框上。因為我們采用了不同的流來控制提示框的顯示方式,我們需要在樣式中對它們進行定義。
使用:hover將控制傳遞給動畫[tooltip]:not([flow]):hover::before, [tooltip]:not([flow]):hover::after, [tooltip][flow^="up"]:hover::before, [tooltip][flow^="up"]:hover::after, [tooltip][flow^="down"]:hover::before, [tooltip][flow^="down"]:hover::after { animation: tooltips-vert 300ms ease-out forwards; } [tooltip][flow^="left"]:hover::before, [tooltip][flow^="left"]:hover::after, [tooltip][flow^="right"]:hover::before, [tooltip][flow^="right"]:hover::after { animation: tooltips-horz 300ms ease-out forwards; }
我們不能對display屬性進行動畫,但是可以通過操作opacity屬性,在提示框上加上淡入效果。我們也可以動畫transform屬性,它可以給提示框加上微妙的動作,觸發的元素就像飛入某點的一樣。
主要forward關鍵詞在動畫的聲明中,這告訴動畫當完成時不重置,而是繼續停留在結束。
結論棒極了!我們在這個教程里已經覆蓋了很多,一堆提示框效果。
http://jsfiddle.net/kcschaefe...
我們僅僅摸索了用css做提示框的表面。好好享受它們,繼續試驗,調制出你自己的方子!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/50934.html
摘要:我們巧妙的提示框打算使用屬性選擇器也就是方括號表示法。相對性這是用在提示框的父元素上的。向上向下提示框要用到關鍵幀,而向左向右提示框使用關鍵幀。注意,在這些關鍵幀中,我們只定義了提示框所需的終止狀態。 原文:https://webdesign.tutsplus.co...原作:Jase Smith翻譯:Stypstive 當你的用戶需要漂亮的圖標給出額外的文字信息時,亦或是當他們在點擊...
摘要:一個叫的人用純重繪并模擬了種不同的移動設備包括可以給你的網站添加不相關的獨立組件的一個庫。每一個組件都是針對移動設備定制的,并且它有很多你在傳統的框架中看不到的功能。如果你用開發移動優先的網站,并想要網站正常運行在低版本的上,可以考慮。 眾所周知,CSS是非常棒的,它使網站看起來很漂亮,可以為網站添加動畫,并讓呈現和內容分離。去了解CSS的一切是非常難做到的,它只會變得更加困難,因為我...
摘要:獲取下一個元素節點,存在的話,取消現有選中狀態,設置下一個元素節點為選擇中,調用運動框架實現動畫,添加定時器,調用該函數,實現自動播放。移出時,開啟定時器,繼續輪播。輪播間隔時間單位為毫秒,默認為,在內部,以下部分進行修改或添加。 轉載自我的個人博客 歡迎大家批評指正 包括5部分: 小練習1-處理用戶輸入 小練習2-日期對象的使用 小練習3:輪播圖 小練習4:輸入提示框 小練習...
摘要:獲取下一個元素節點,存在的話,取消現有選中狀態,設置下一個元素節點為選擇中,調用運動框架實現動畫,添加定時器,調用該函數,實現自動播放。移出時,開啟定時器,繼續輪播。輪播間隔時間單位為毫秒,默認為,在內部,以下部分進行修改或添加。 轉載自我的個人博客 歡迎大家批評指正 包括5部分: 小練習1-處理用戶輸入 小練習2-日期對象的使用 小練習3:輪播圖 小練習4:輸入提示框 小練習...
摘要:庫一個用來在中創建炫酷的浮動粒子的庫一個用來在中創建物體和空間的庫快速實現全屏滾動特性打字機效果滾動到某個元素位置時觸發一個功能語法高亮使用創建漂亮的圖表能夠明顯加速網站加載時間,鼠標時預加載資源另一個圖表庫一個基于動畫和平移的雪碧圖庫實現 Javascript 庫 Particles.js? 一個用來在 web 中創建炫酷的浮動粒子的庫 Three.js? 一個用來在 web 中創...
閱讀 2984·2021-10-19 11:46
閱讀 979·2021-08-03 14:03
閱讀 2934·2021-06-11 18:08
閱讀 2905·2019-08-29 13:52
閱讀 2744·2019-08-29 12:49
閱讀 480·2019-08-26 13:56
閱讀 924·2019-08-26 13:41
閱讀 849·2019-08-26 13:35