web_scroll.rs 678 B

1234567891011121314151617181920212223
  1. use gloo::render::{request_animation_frame, AnimationFrame};
  2. use web_sys::Window;
  3. #[derive(Clone, Copy, Debug, Default)]
  4. #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
  5. pub(crate) struct ScrollPosition {
  6. pub x: f64,
  7. pub y: f64,
  8. }
  9. impl ScrollPosition {
  10. pub(crate) fn of_window(window: &Window) -> Self {
  11. Self {
  12. x: window.scroll_x().unwrap_or_default(),
  13. y: window.scroll_y().unwrap_or_default(),
  14. }
  15. }
  16. pub(crate) fn scroll_to(&self, window: Window) -> AnimationFrame {
  17. let Self { x, y } = *self;
  18. request_animation_frame(move |_| window.scroll_to_with_x_and_y(x, y))
  19. }
  20. }