這篇文章主要介紹了CSS pointer-events屬性的使用,有一定的參考價值,有需要的朋友可以參考一下,希望對你們有所幫助。
在前端的開發中,我們都是直接與使用者接觸,應該盡量讓使用者感到操作暢快愉悅,獲得類似native的感覺。其中動畫是最常用的方法。
這裡的需求是,彈層的設計,這個彈層希望可以像 native 上的彈層一樣,點選按鈕出現,點選遮罩或按鈕時關閉,并且出現和關閉時有動畫效果(fade,slide等)。
問題
在關閉彈層時,以fadeOut動畫效果為例,我這裡是利用opacity從1 -> 0的過程模拟逐漸消失的動畫過程,container是彈層元件最外層容器:.container {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 9999;
animation: .5s fadeOut forwards;
}
@keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
問題是opacity為0隻是container内的元素透明不可見的,container仍然存在于dom節點中。當我們給彈層的蒙層mask綁定關閉事件時,由于container的z-index非常大,點選事件都會觸發在mask上。
transitionend和animationend事件
為了解決上述問題,同時讓使用者體驗更好,我們可以通過監聽transitionend和animationend事件等動畫效果執行完再将container節點隐藏(display:none)。這樣就不會出現mask攔截點選事件的問題了。
簡介
采用CSS技術生成的動畫效果,我們可以在JS中捕獲動畫或變換的結束事件:transitionend和animationend事件标準的浏覽器事件。transitionend 事件會在 CSS transition 結束後觸發。
animationend 事件會在一個 CSS 動畫完成時觸發(不包括完成前就已終止的情況,例如元素變得不可見或者動畫從元素中移除)。
代碼示例:
function showMessage() {
console.log('Transition 已完成');
}
var element = document.getElementById("container");
element.addEventListener("transitionend", showMessage, false);
浏覽器相容性
以transitionend事件為例,animationend事件相似。
可以看出,在WebKit浏覽器裡仍然需要使用webkit字首,是以我們需要根據各種浏覽器分别檢測事件。
缺點
我的需求是,這個彈層元件可能會頻繁調用,即使用者關閉彈層後,會再次打開。
使用這種方案,通過監聽動畫結束事件,在display:none和display:block之間切換,但是這會增加浏覽器渲染(重繪和重排)成本,且要考慮浏覽器相容性,需要根據各種浏覽器分别檢測事件。
pointer-events CSS 屬性
有沒有更優雅更簡單的解決呢?下面介紹我們的主角:pointer-events。
需要注意的是,這個pointer-events不同于Pointer Events(用于處理來自裝置(包括滑鼠,筆,觸摸屏等)的硬體指針輸入的事件和相關接口)。
簡介
The ‘pointer-events’ property specifies under what circumstances a given graphics element can be the target element for a pointer event. It affects the circumstances under which the following are processed:user interface events such as mouse clicks
dynamic pseudo-classes (i.e., :hover, :active and :focus; [CSS2], section 5.11)
hyperlinks
簡而言之,pointer-events CSS 屬性指定在什麼情況下 (如果有) 某個特定的圖形元素可以成為滑鼠事件的 target。
規範
Its extension to HTML elements, though present in early drafts of CSS Basic User Interface Module Level 3, has been pushed to its level 4.
它主要針對的是SVG,但已經擴充到其他html元素。
文法
pointer-events: auto;
pointer-events: none;
pointer-events: visiblePainted;
pointer-events: visibleFill;
pointer-events: visibleStroke;
pointer-events: visible;
pointer-events: painted;
pointer-events: fill;
pointer-events: stroke;
pointer-events: all;
比如說,pointer-events: visibleFill;
這個隻适用于SVG,隻有在元素的visibility屬性為visible時,且滑鼠指針在元素内部時,元素才會成為滑鼠事件的目标,fill屬性不影響事件處理。
其他隻适用于SVG的屬性介紹不再贅述,可以參考 這裡 。
在這裡我們更關注[auto|none]兩個屬性值。這兩個屬性值用在其他html元素上也很有意思。
當值為auto時。與pointer-events屬性未指定時的表現效果相同,對于SVG内容,該值與visiblePainted效果相同。
當值為none時,元素永遠不會成為滑鼠事件的target。換而言之,值none表示滑鼠事件“穿透”該元素并且指定該元素“下面”的任何東西。
浏覽器相容性
css3特效代碼大全