dioxus_web/events/
scroll.rs1use dioxus_html::HasScrollData;
2use wasm_bindgen::JsCast;
3use web_sys::{Document, Element, Event};
4
5use super::{Synthetic, WebEventExt};
6
7impl HasScrollData for Synthetic<Event> {
8 fn as_any(&self) -> &dyn std::any::Any {
9 &self.event
10 }
11
12 fn scroll_top(&self) -> f64 {
13 if let Some(target) = self.event.target().as_ref() {
14 if let Some(element) = target.dyn_ref::<Element>() {
15 return element.scroll_top() as f64;
16 } else if let Some(element) = target
17 .dyn_ref::<Document>()
18 .and_then(|document| document.document_element())
19 {
20 return element.scroll_top() as f64;
21 }
22 }
23 0f64
24 }
25
26 fn scroll_left(&self) -> f64 {
27 if let Some(target) = self.event.target().as_ref() {
28 if let Some(element) = target.dyn_ref::<Element>() {
29 return element.scroll_left() as f64;
30 } else if let Some(element) = target
31 .dyn_ref::<Document>()
32 .and_then(|document| document.document_element())
33 {
34 return element.scroll_left() as f64;
35 }
36 }
37 0f64
38 }
39
40 fn scroll_width(&self) -> i32 {
41 if let Some(target) = self.event.target().as_ref() {
42 if let Some(element) = target.dyn_ref::<Element>() {
43 return element.scroll_width();
44 } else if let Some(element) = target
45 .dyn_ref::<Document>()
46 .and_then(|document| document.document_element())
47 {
48 return element.scroll_width();
49 }
50 }
51 0
52 }
53
54 fn scroll_height(&self) -> i32 {
55 if let Some(target) = self.event.target().as_ref() {
56 if let Some(element) = target.dyn_ref::<Element>() {
57 return element.scroll_height();
58 } else if let Some(element) = target
59 .dyn_ref::<Document>()
60 .and_then(|document| document.document_element())
61 {
62 return element.scroll_height();
63 }
64 }
65 0
66 }
67
68 fn client_width(&self) -> i32 {
69 if let Some(target) = self.event.target().as_ref() {
70 if let Some(element) = target.dyn_ref::<Element>() {
71 return element.client_width();
72 } else if let Some(element) = target
73 .dyn_ref::<Document>()
74 .and_then(|document| document.document_element())
75 {
76 return element.client_width();
77 }
78 }
79 0
80 }
81
82 fn client_height(&self) -> i32 {
83 if let Some(target) = self.event.target().as_ref() {
84 if let Some(element) = target.dyn_ref::<Element>() {
85 return element.client_height();
86 } else if let Some(element) = target
87 .dyn_ref::<Document>()
88 .and_then(|document| document.document_element())
89 {
90 return element.client_height();
91 }
92 }
93 0
94 }
95}
96
97impl WebEventExt for dioxus_html::ScrollData {
98 type WebEvent = web_sys::Event;
99
100 #[inline(always)]
101 fn try_as_web_event(&self) -> Option<Self::WebEvent> {
102 self.downcast::<web_sys::Event>().cloned()
103 }
104}