摘要:背景之前做了一個網頁,網頁中的所有輸入框都被設計為獲得鼠標焦點時外邊框不變藍。而且輸入框的邊框設置在了父元素上,所有當輸入框獲得焦點時,看到的應該是父元素上的邊框變藍,而不是里面的的邊框變藍。
背景
之前做了一個網頁,網頁中的所有輸入框都被設計為“獲得鼠標焦點時外邊框不變藍”。突然某一天,產品覺得這樣用戶體驗不好,不能很明顯地告訴用戶當前鼠標停在哪里,于是要求改為“當輸入框獲得鼠標焦點時,外邊框自動變藍;失去焦點時外邊框恢復原樣”。
瀏覽器自動會給輸入框input、textarea的outline 屬性設置一個默認值,效果就是當輸入框獲得鼠標焦點時外邊框會自動帶上顏色,失去焦點時外邊框顏色消失。由于不同瀏覽器outline 屬性的默認值不同,導致外邊框的顏色也不同。如果不想要瀏覽器的outline默認設置,只需要將 outline 屬性設置為none 即可。
所以一開始聽到這個需求,感覺特別簡單,不就是純 CSS 的問題嘛!我只要將所有輸入框的 outline 屬性設置為瀏覽器默認的值就好了,但我想的太天真了。。。。
1、如何復制瀏覽器默認的 outline 樣式由于網頁中已有的輸入框的樣式遍布在各個文件中,有一種非常機械的辦法,那就是到每個文件中去刪除掉輸入框的 outline:none樣式,這樣輸入框就會使用瀏覽器默認的 outline 樣式了。但是這樣做要改的地方太多了,會瘋掉的!再想想有沒有更省事的方法,有了!在最基本的base.css樣式文件中給輸入框添加一個focus時候的outline樣式不就解決了么。那么問題來了,該將outline 設置何值,才能自動使用瀏覽器默認的outline樣式呢?
我第一個想到的方法是將 outline設置為auto,但發現只有webkit 內核的瀏覽器才支持這個屬性值,firefox 不支持,因為auto 并不是標準的outline 值。所以要想直接復制瀏覽器默認的outline樣式是做不到的。難道我要針對每個瀏覽器設置不同的outline 值,為了這么一點破需求費那么大工夫?!算了,省事點的方式還是直接摒棄瀏覽器的默認outline樣式,統一將outline設置為一種樣式好了。
2、避開 outline,選擇 border但我發現了新問題,通過設置outline樣式為輸入框添加外邊框,效果并不好。因為 outline 沒有類似 border-radius的屬性來改變邊角的弧度。這樣就導致了一個問題:當輸入框設置了border顏色,同時border-radius為3px以上時,能明顯的看到outline 外邊框并沒有和border 重合。看來設置 outline 來達到邊框變藍效果并不是最好的選擇,為什么不選用設置 border 來達到同樣的效果呢?只要將border再設置下 border-shadow,那么看起來也是和outline效果一樣的,而且border還能設置border-radius,顯示效果更滿足需求。
3、如何讓任何一個元素都能 focusable通過設置 border 解決了大多數輸入框,但發現又有了新問題。
網頁中有些輸入框其實并不是單一使用 input/textarea來實現的,這類“輸入框”看起來和一般輸入框并無兩樣,但其實 HTML 結構是一個 div 里面包含著一個 input/textarea 來實現的。而且輸入框的邊框設置在了父元素 div 上,所有當輸入框獲得焦點時,看到的應該是父元素 div 上的邊框變藍,而不是里面的input/textarea 的邊框變藍。
要想獲得焦點時父元素 div的邊框變藍,肯定可行的方法是通過 JS 來實現:給input/textarea 綁定一個 focus 和 一個blur事件,在focus 事件處理函數中將父元素div的邊框置藍,在blur事件處理函數中將父元素div的邊框恢復原樣。這種方法時絕對可行的,但是我總覺得應該有更簡單的,純粹使用 css 實現的方法。
如果想單純通過css 實現,首先想到的是用選擇器div:focus。但是發現div上無法使用:focus偽類。于是我就猜想:可能并不是所有的元素都是 focusable的,那么得找一份說明哪些元素 focusable的規范。
哪些元素是 focusable的?搜索結果:
根據 DOM Level 2 HTML規范,focusable 的DOM元素都會有一個原生的focus()方法,只有 focusable 的DOM 元素才有 focus 事件,才能使用:focus偽類。擁有原生的focus()方法的DOM元素包括幾種:HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement and HTMLAnchorElement。很明顯,規范中遺漏了HTMLButtonElement and HTMLAreaElement。
雖然規范這么定義,但瀏覽器在實現時卻是另外一套。瀏覽器給任何一個 HTMLElement 都定義focus()方法,但并不是任何一個HTMLElement 都能獲得焦點(獲得焦點術語叫 active, 具體請參考:http://help.dottoro.com/ljqmdirr.php)。一般來說,任何一個時刻HTML 文檔中只會有一個active元素,但并不是任何一個元素都能成為active元素。能成為active 的元素包括:
表單元素(form controllers):input/option/textarea/button
鏈接元素(links):a標簽、area標簽(必須要帶 href 屬性,包括 href 屬性為空)
可以被編輯的元素(包括通過添加 contenteditable = "true"屬性變成可編輯的情況)
設置了 tabindex 屬性(tabindex 值非-1)的元素
window:當頁面窗口從隱藏變成前置可見時,focus 事件就會觸發
根據搜索結果,要想將父元素div變成focusable,只需要在元素上設置 tabindex 屬性,然后通過:focus偽類設置父元素div 獲得焦點時的border樣式。但我發現當鼠標點擊里面的 input 元素時,父元素div并沒有獲得焦點,獲得焦點的是子元素input。
所以最后還是沒能通過純 css 的方法來解決這個問題,無奈之下我還是通過js去解決了。。。。。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/111188.html
摘要:背景之前做了一個網頁,網頁中的所有輸入框都被設計為獲得鼠標焦點時外邊框不變藍。而且輸入框的邊框設置在了父元素上,所有當輸入框獲得焦點時,看到的應該是父元素上的邊框變藍,而不是里面的的邊框變藍。 背景 之前做了一個網頁,網頁中的所有輸入框都被設計為獲得鼠標焦點時外邊框不變藍。突然某一天,產品覺得這樣用戶體驗不好,不能很明顯地告訴用戶當前鼠標停在哪里,于是要求改為當輸入框獲得鼠標焦點時,外...
這篇文章主要是闡述了selenium可視化數據抓取有效的方法實現,文中根據舉例編碼講到的十分詳盡,對大家學習培訓還是工作具有很強的參照學習培訓使用價值,需求的小伙伴們下邊伴隨著小編就來互相學習了解一下吧。 Selenium是一個自動化技術檢測工具,運用它能夠推動電腦瀏覽器實行特殊動作,如鼠標點擊、下拉框等操作,同時也可以獲取電腦瀏覽器現階段獲得界面的程序代碼,保證由此可見即可獲得。對于有些J...
此篇文章主要是詳細介紹了pythonGUI多列輸入文本Text的控制方式,具有非常好的實用價值,希望能幫助到大家。如有誤或者未考慮到真正的地區,望鼎力相助 Text的屬性wrap fromtkinterimport* root=Tk() root.geometry('200x300') te=Text(root,height=20,width=15) #將多...
文章主要是詳細介紹了pythonGUI多做輸入文本Text的控制方式,具有非常好的實用價值,希望能幫助到大家。如有誤或者未考慮到真正的地區,望鼎力相助 Text的屬性wrap fromtkinterimport* root=Tk() root.geometry('200x300') te=Text(root,height=20,width=15) #將多做輸...
閱讀 780·2021-11-23 09:51
閱讀 844·2021-11-23 09:51
閱讀 2514·2021-11-15 18:01
閱讀 3873·2021-10-11 11:07
閱讀 2409·2021-09-22 15:30
閱讀 1082·2021-09-22 14:59
閱讀 1564·2019-08-30 15:55
閱讀 1762·2019-08-30 15:52