2015-04-25 17 views
5

Ho seguente codice che funziona bene quando la dimensione dello schermo è 770px e al di sotto (come determinato da punti di interruzione):Rimuovere/aggiungere classi CSS sul punto di interruzione con matchmedia.js

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); 

Il problema è quando la finestra è ridimensionato a 770px e fino a perdere le mie lezioni.

Come eseguire l'aggiornamento per cambiare classe al ridimensionamento della finestra?

risposta

2

È necessario memorizzare nella cache i selettori. Vedere jsfiddle così:

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); 
+0

Niente. Con la tua soluzione ora le classi restano indipendentemente dalla larghezza del punto di interruzione. – user642523

+0

crea jsfiddle semplice con il tuo codice. quando si seleziona il selettore della cache (ad es. 'viewAll = $ j (...)' salva solo il riferimento a tutti i nodi e si è liberi di aggiungere/rimuovere classi su quegli elementi. Anche se tutto ciò che si desidera è modificare alcuni stili usando le media query direttamente nel css. – vittore

+0

aggiunto jsfiddle per mostrare che questo codice funziona davvero. – vittore

1

indovinare che cosa si sta andando per sta cambiando la pagina di progettazione, quando i cambiamenti dei media, con l'aggiunta di classi.

Semplicemente usando query CSS e dei media sarà raggiungere questo obiettivo:

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

, ma se si vuole veramente troppo che essere maneggiato con javascript te lo consiglia di utilizzare un'altra classe come marcatore, come .adapt e modificando il codice per:

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); 
0

vorrei suggerire per salvare le classi necessarie in un attributo 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')); 
} 

presumo $j crea un oggetto jQuery.

Il codice HTML sarà simile:

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

È possibile utilizzare element.className += "button" per aggiungere classe e .className = "" per rimuovere classe, ecco il codice è necessario:

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); 
Problemi correlati