修复响应式网站的媒体相关 JavaScript 动画

修复响应式网站的媒体相关 JavaScript 动画
修复响应式网站的媒体相关 JavaScript 动画

了解条件 JavaScript 动画的问题

使用响应式网页设计时,通常需要针对不同的设备类型或屏幕尺寸结合不同的行为。在这种情况下使用 JavaScript 来控制基于媒体查询的动画可能具有挑战性。当两个动画(每个设备一个)无法按预期同时运行时,这是一个常见问题。

此场景中使用了两个 JavaScript 动画:一个用于“导航滚动”(适用于较大屏幕),另一个用于用于较小设备的“cta 滚动”(号召性用语)。困难在于确保每个动画根据屏幕宽度单独播放,同时避免碰撞。

当两个动画设置在不同的脚本标签中并且只有其中一个可以正常运行时,就会出现问题。如果不小心实现,在单个条件下合并它们或组合脚本标签可能会导致进一步的问题,特别是在使用诸如“window.matchMedia()”之类的媒体查询时。

这篇文章将介绍如何使用媒体条件来组织 JavaScript,以便每个动画都按预期执行。为了提供移动设备和更大屏幕之间的无缝过渡,它将重点强调适当的条件语句和媒体查询。

命令 使用示例
window.matchMedia() JavaScript 使用此技术来应用媒体查询。根据屏幕尺寸,它确定文档是否满足给定的 CSS 媒体查询并启动相关的 JavaScript 操作。该脚本可以更轻松地区分大型显示器和移动显示器的动画。
addEventListener("change", callback) 此命令监视对媒体查询状态的修改。当屏幕宽度超过预定阈值(例如 450 像素)时,执行作为回调提供的函数。它允许动态响应而无需刷新页面。
removeEventListener("scroll", callback) 通过消除对不正确的屏幕尺寸进行无意义的事件处理,此命令通过在不再需要时删除滚动事件侦听器来优化速度。当媒体询问交替时,这是势在必行的。
window.pageYOffset 该属性返回文档中上下滚动的像素数量。它用于检测用户是否向上或向下滚动并跟踪滚动位置。
element.style.top 此命令调整元素的顶部 CSS 属性,该属性控制元素在页面上的垂直位置。在这里,它用于确定在用户滚动的位置应显示或隐藏导航栏。
element.style.left 此命令通过调整左侧 CSS 属性来水平移动元素,就像 element.style.top 所做的那样。在移动设备上,它用于将号召性用语按钮滑入和滑出视图。
mediaQuery.matches 此属性验证媒体查询和文档现在是否匹配。为了确保在移动设备而不是桌面上应用适当的动画,必须根据屏幕宽度有条件地运行适当的动画。
prevScrollpos >prevScrollpos > currentScrollPos 为了确定滚动方向(向上或向下),此条件检查先前和当前迭代的滚动位置。确定项目应如何对滚动做出反应(例如,通过显示或隐藏按钮或导航栏)至关重要。
onscroll 通过用户滚动触发的集成事件处理程序。通过比较先前和当前的滚动位置,它执行基于滚动的动画。

根据屏幕尺寸管理 JavaScript 动画

早期的 JavaScript 脚本示例是为了解决具有两种不同动画的问题——一个用于桌面,一个用于移动设备。确保每个动画仅在需要时启动(具体取决于设备的屏幕宽度)是主要挑战。这 window.matchMedia() 利用技术来实现这一点,使代码能够识别满足特定媒体查询条件的实例。这些脚本通过针对桌面(最小宽度:450px)和移动设备(最大宽度:450px)使用不同的条件,确保每个动画根据屏幕尺寸单独运行。

导航栏的大屏幕滚动行为在第一个脚本中处理。根据滚动方向, 导航 当用户向上或向下滚动时,栏要么保持可见,要么消失。使用 上一页Scrollpos当前滚动位置 变量,这是通过比较先前和当前滚动位置来管理的。向上滚动会导致导航栏通过将其顶部位置设置为 0 重新出现,向下滚动会导致导航栏消失,方法是使用负顶部值将其移出视图。

第二个脚本处理移动设备上的“号召性用语”(CTA) 按钮。所有屏幕尺寸都会显示 CTA 按钮,但仅在屏幕宽度小于 450 像素时才会显示动画。当用户向上滚动时,按钮从屏幕左侧滑入;当他们向下滚动时,该按钮从视图中消失。与导航栏具有相同的滚动位置比较逻辑,这种行为具有可比性。但是,它不是更改顶部值,而是修改按钮的左侧位置,使其根据滚动方向出现或消失。

这两个脚本旨在彼此分开工作。然而,它们被封装在条件表达式中,用于验证屏幕宽度以防止冲突。和 mediaQuery.matches,媒体查询可以直接在 JavaScript 中使用,允许脚本在两个动画之间动态转换,而不会相互干扰。通过将无关的动画保留在指定的屏幕宽度内,这种模块化方法提高了效率并保证了桌面和移动设备上的无缝操作。

使用 JavaScript 处理基于媒体查询的条件动画

该解决方案通过结合使用 JavaScript 来处理依赖于屏幕宽度的条件动画 窗口.matchMedia 功能。

var prevScrollpos = window.pageYOffset;
var mediaQueryNav = window.matchMedia("(min-width: 450px)");
var mediaQueryCta = window.matchMedia("(max-width: 450px)");

window.onscroll = function() { scrollFunction(); };

function scrollFunction() {
  var currentScrollPos = window.pageYOffset;
  if (mediaQueryNav.matches) {
    // Navigation scroll for larger screens
    if (prevScrollpos > currentScrollPos) {
      document.getElementById("navigation").style.top = "0";
    } else {
      document.getElementById("navigation").style.top = "-90px";
    }
  }
  if (mediaQueryCta.matches) {
    // CTA scroll for mobile screens
    if (prevScrollpos > currentScrollPos) {
      document.getElementById("header-button").style.left = "0.25in";
    } else {
      document.getElementById("header-button").style.left = "-10in";
    }
  }
  prevScrollpos = currentScrollPos;
}

针对不同屏幕尺寸使用单独事件侦听器的模块化方法

该版本更加高效和模块化,因为它为每个媒体查询使用不同的滚动事件侦听器。

var prevScrollpos = window.pageYOffset;
var mediaQueryNav = window.matchMedia("(min-width: 450px)");
var mediaQueryCta = window.matchMedia("(max-width: 450px)");

mediaQueryNav.addEventListener("change", handleNavScroll);
mediaQueryCta.addEventListener("change", handleCtaScroll);

function handleNavScroll(e) {
  if (e.matches) {
    window.addEventListener("scroll", navScrollFunction);
  } else {
    window.removeEventListener("scroll", navScrollFunction);
  }
}

function handleCtaScroll(e) {
  if (e.matches) {
    window.addEventListener("scroll", ctaScrollFunction);
  } else {
    window.removeEventListener("scroll", ctaScrollFunction);
  }
}

function navScrollFunction() {
  var currentScrollPos = window.pageYOffset;
  if (prevScrollpos > currentScrollPos) {
    document.getElementById("navigation").style.top = "0";
  } else {
    document.getElementById("navigation").style.top = "-90px";
  }
  prevScrollpos = currentScrollPos;
}

function ctaScrollFunction() {
  var currentScrollPos = window.pageYOffset;
  if (prevScrollpos > currentScrollPos) {
    document.getElementById("header-button").style.left = "0.25in";
  } else {
    document.getElementById("header-button").style.left = "-10in";
  }
  prevScrollpos = currentScrollPos;
}

// Initial call to apply the correct event listeners
handleNavScroll(mediaQueryNav);
handleCtaScroll(mediaQueryCta);

将条件逻辑应用于媒体查询的统一滚动处理程序

此方法使用单个滚动事件侦听器,并根据媒体查询进行条件检查来处理两个动画。

var prevScrollpos = window.pageYOffset;
var mediaQuery = window.matchMedia("(max-width: 450px)");

window.onscroll = function() { scrollHandler(); };

function scrollHandler() {
  var currentScrollPos = window.pageYOffset;
  if (mediaQuery.matches) {
    // CTA scroll for mobile
    if (prevScrollpos > currentScrollPos) {
      document.getElementById("header-button").style.left = "0.25in";
    } else {
      document.getElementById("header-button").style.left = "-10in";
    }
  } else {
    // Navigation scroll for larger screens
    if (prevScrollpos > currentScrollPos) {
      document.getElementById("navigation").style.top = "0";
    } else {
      document.getElementById("navigation").style.top = "-90px";
    }
  }
  prevScrollpos = currentScrollPos;
}

优化 JavaScript 以实现响应式动画

开发响应式网站的一个重要组成部分是确保过渡和动画在不同尺寸的设备上有不同的响应。在使用媒体查询和 JavaScript 时,有效的条件管理至关重要,特别是当动画仅在特定屏幕尺寸上启动时。这就是动态事件监听器和 window.matchMedia() 发挥作用。借助这些工具,开发人员可以确保动画仅在满足特定条件时启动,从而改善桌面和移动平台上的用户体验和性能。

处理同时运行的大量动画给依赖媒体的 JavaScript 动画带来了另一个困难。在这种情况下,将功能划分为更易于管理的模块化事件侦听器可以创造奇迹。分离各种功能并根据特定媒体查询激活它们比立即执行所有脚本更有效。这可确保每个脚本在适当的设备上按预期运行,并有助于节省不必要的浏览器负载。

在处理响应式动画时,移动设备的性能优化尤其重要。由于移动设备的处理能力通常低于台式机,因此可以通过降低脚本复杂性来提高移动设备的性能。这个例子利用了 滚动 事件处理程序有效地保证了移动特定动画(例如“cta滚动”)的顺利运行,而不会增加设备资源的负担。此外,它保证较大的设备仅加载与屏幕尺寸成比例的动画。

有关 JavaScript 动画和媒体查询的常见问题

  1. 如何在 JavaScript 中使用媒体查询?
  2. JavaScript 允许您应用媒体查询 window.matchMedia()。您可以使用这种方式根据屏幕的宽度运行不同的脚本。
  3. 如何根据屏幕尺寸控制动画?
  4. 使用 window.matchMedia() 确定屏幕宽度以控制动画。然后,根据需要添加或删除事件侦听器。这保证了根据屏幕尺寸,仅播放相关动画。
  5. 优化滚动动画的最佳方法是什么?
  6. 通过减少滚动事件内部执行的操作数量, window.onscroll 可以更有效地用于滚动动画优化。当检测到滚动时,才会执行所需的动画逻辑。
  7. 如何在 JavaScript 中处理多个动画?
  8. 可以通过将多个动画划分为不同的条件和事件侦听器来管理它们。这降低了冲突的可能性,因为每个动画都是单独运行的。
  9. 什么是 prevScrollposcurrentScrollPos 在滚动动画中做什么?
  10. 这些变量监视用户滚动的位置。上一个滚动位置存储在 prevScrollpos,当前滚动位置存储在 currentScrollPos。通过比较它们可以判断用户是向上还是向下滚动。

关于基于媒体查询的动画的最终想法

总之,创建响应式网站需要管理各种设备的 JavaScript 动画。开发人员可以使用以下工具根据屏幕宽度触发特定的动画,从而提供最佳的用户体验 window.matchMedia()

如果实施正确,网站可以增强其在各种设备上的视觉行为和性能。实现此目的的一种方法是有选择地应用滚动动画并将它们隔离。此方法保证桌面和移动动画之间的无缝过渡,并有助于防止脚本冲突。

JavaScript 媒体查询和动画参考
  1. 本文的灵感来自响应式网页设计和 JavaScript 使用的最佳实践 Mozilla 开发者网络 (MDN) 。 MDN 提供了有关如何有效使用的深入文档 window.matchMedia() 以及 JavaScript 中的其他媒体查询技术。
  2. 有关优化基于滚动的动画的其他资源来自 CSS 技巧 ,提供有关如何 滚动动画 工作并可以针对不同的屏幕尺寸进行定制。
  3. 跨不同设备管理 JavaScript 的性能优化技巧和策略来自 粉碎杂志 ,它强调了模块化脚本对于响应式 Web 应用程序的重要性。