Search code examples
javascriptjqueryresponsive-designmatchmedia

Disabling jQuery hover effect for menu below 1025px using matchMedia


I run a WordPress site with a custom header. Therefore, I decided to rely on jQuery.

I have a menu (#sitenavigation) that appears when I hover over a container it's in (#menuhover). I only want this to work in viewports that are 1025px and wider using matchMedia. In viewports smaller than that, the buttons that appear (#close-navgation-mobile and #open-navigation-mobile) successfully open and close this menu.

The problem I'm having is successfully disabling the mouseenter/mouseleave functions in viewports smaller than 1025px. How can I edit this code to accomplish this?

$(document).ready(function () {
  if (window.matchMedia("(min-width: 1025px)").matches) {
    $("#menuhover").mouseenter(function () {
      $("#site-navigation").stop(true, false);
      $("#site-navigation").animate({ left: "-2rem", opacity: "1" }, 300);
    });
    $("#menuhover").mouseleave(function () {
      $("#site-navigation").stop(true, false);
      $("#site-navigation").css({ left: "-480px", opacity: "0" });
    });
  } else {
    $("#menuhover").mouseenter(function (event) {
      event.preventDefault();
    });
    $("#menuhover").mouseleave(function (event) {
      event.preventDefault();
    });
  }

  $("#open-navigation-mobile").on("click", function () {
    $("#site-navigation").animate({ left: "-1rem", opacity: "1" }, 250);
    $("#close-navigation-mobile").css({ display: "flex" });
    $("#open-navigation-mobile").css({ display: "none" });
  });
  $("#close-navigation-mobile").on("click", function () {
    $("#site-navigation").animate({ left: "-100vw", opacity: "0" }, 250);
    $("#close-navigation-mobile").css({ display: "none" });
    $("#open-navigation-mobile").css({ display: "flex" });
  });
  $(window).on("beforeunload", function () {
    $("#site-navigation").animate({ left: "-100vw", opacity: "0" }, 250);
    $("#close-navigation-mobile").css({ display: "none" });
    $("#open-navigation-mobile").css({ display: "flex" });
  });
});

I tried the event.preventDefault(); method to not fire the mouseleave/mouseenter functions in viewports smaller than 1025px, expecting nothing to happen when my mouse hovered over #menuhover. Unfortunately, it activated the #sitenavigation menu.


Solution

  • Does it work for you?

         if (window.matchMedia("(min-width: 1025px)").matches) {
            $("#menuhover").mouseenter(function () {
              $("#site-navigation").stop(true, false);
              $("#site-navigation").animate({ left: "-2rem", opacity: "1" }, 300);
            }).mouseleave(function () {
              $("#site-navigation").stop(true, false);
              $("#site-navigation").css({ left: "-480px", opacity: "0" });
            });
          } else {
            $("#menuhover").on('mouseenter mouseleave', function() {
                return false
             });
          }