Удалите / добавьте классы CSS на точку останова с matchmedia.js

У меня есть следующий код, который отлично работает, когда размер экрана 770px и ниже (определяется точками останова):

    var handleMatchMedia = function (mediaQuery) {
      if (mediaQuery.matches) {

         $j(".view-all a").removeClass("button");
         $j(".view-all").removeClass("view-all");

    } else {

        $j(".view-all a").addClass("button");
        $j(".view-all").addClass("view-all");
    }
},

mql = window.matchMedia('all and (max-width: 770px)');

handleMatchMedia(mql); 
mql.addListener(handleMatchMedia); 

Проблема в том, когда окно изменено в 770px и до я теряю свои уроки.

Как добиться изменения класса при изменении размера окна?

4 ответа

Вам нужно кэшировать ваши селекторы. Смотрите также jsfiddle:

var viewAll = $j(".view-all")
  , buttons = $j(".view-all a")
  , handleMatchMedia = function (mediaQuery) {
     if (mediaQuery.matches) {
       buttons.removeClass("button");
       viewAll.removeClass("view-all");
    } else {
       buttons.addClass("button");
       viewAll.addClass("view-all");
    }
  }
  , mql = window.matchMedia('all and (max-width: 770px)');

handleMatchMedia(mql); 
mql.addListener(handleMatchMedia); 

Угадай, что ты собираешься - это изменить дизайн страницы при смене медиа, добавив классы.

Простое использование CSS и медиа-запросов позволит добиться этого:

@media all and (max-width: 770px) {
  .viewall a {
    color: blue;
  }
}

но если вы действительно хотите, чтобы он тоже обрабатывался с помощью javascript, я рекомендую использовать другой класс в качестве маркера, например .adapt и изменив код на:

var handleMatchMedia = function (mediaQuery) {
    if (mediaQuery.matches) {
       $j(".adapt a").removeClass("button");
       $j(".adapt").removeClass("view-all");
    } else {
       $j(".adapt a").addClass("button");
       $j(".adapt").addClass("view-all");
    }
},

mql = window.matchMedia('all and (max-width: 770px)');

handleMatchMedia(mql); 
mql.addListener(handleMatchMedia); 

Я бы предложил сохранить необходимые классы в data-770-classes приписывать.

if (mediaQuery.matches) {
   buttons.removeClass(buttons.attr('data-770-classes'));
   viewAll.removeClass(viewAll.attr('data-770-classes'));
} else {
   buttons.addClass(buttons.attr('data-770-classes'));
   viewAll.addClass(viewAll.attr('data-770-classes'));
}

Я предполагаю $j создает jQuery объект.

HTML будет выглядеть так:

<div class="view-all" data-700-classes="view-all">...</div>

Ты можешь использовать element.className += "button" добавить класс и .className = ""чтобы удалить класс, вот код, который вам нужен:

var viewAll = document.getElementsByClassName("view-all")[0];
var buttons = viewAll.getElementsByTagName("a");
var handleMatchMedia = function (mediaQuery) {
  if (mediaQuery.matches) {
     buttons.className += "button";
     viewAll.className = "";
  } else {
     buttons.className += "button";
     viewAll.className += "view-all";
  }
}
var mql = window.matchMedia('all and (max-width: 770px)');

handleMatchMedia(mql); 
mql.addListener(handleMatchMedia); 
Другие вопросы по тегам