22. september 2018 - 13:16 Der er 4 kommentarer og
1 løsning

jquerys show/hide ignorerer @media display-setting

css:
#box > ul { margin: 0; padding: 0; }
#box > ul > li { border: 1px solid red; }
@media (max-width: 600px) {
    #box > ul { display: table; width: 100%; }
    #box > ul > li { display: table-cell; }
}
@media (min-width: 601px) {
    #box > ul { display: block; }
    #box > ul > li { display: inline-block; }
}

html:
<div id="box">
    <ul>
        <li>Punkt 1</li>
        <li>Punkt 2</li>
        <li>Punkt 3</li>
    </ul>
</div>
<button id="btn">Tryk</button>

jquery:
$(document).ready(function(){
    $('#box > ul > li:eq(2)').hide();
    $('#btn').click(function(){ $('#box > ul > li:eq(2)').show(); });
});

Det fungerer som sådan fint nok. Når jeg trykker på knappen så viser siden punkt 3!
Min udfordring er, at hvis jeg gør følgende:
1) Hvis jeg starter vinduet i en bredde på mere end 600 pixels (fx maximeret)
2) Herefter trækker vinduet sammen til en bredde på færre end 600 pixels
3) Trykker på knappen
Så vil "Punkt 3"'s styling for display være "inline-block" i stedet for "table-cell", som de øvrige liste-elementer har.

Det modsatte gør sig gældende , hvis man går fra en størrelse på færre en 600 pixels og øger bredden til mere end 600 pixels.

Jquerys ".hide()" husker altså det display var sat til da den blev gjort usynlig, og sætter den til det igen når den så synliggøres igen, og ignorerer at display-settingen er blevet ændret via @media.

Jeg overvejer selv at bruge add og remove i stedet for hide og show, men måske er det noget der er smartere?
Avatar billede keysersoze Guru
22. september 2018 - 18:29 #1
både hide og show sætter inline styling på de enkelte elementer og inline styling har præcedens over din css-fil - så den rigtige tilgang vil nok være at benytte addClass og removeClass.
22. september 2018 - 18:56 #2
I så fald skal jeg lade jquery holde øje med bredden på min side hele tiden, hvilket jeg ikke er så vild med. Så hellere append'e og remove elementerne efterhånden, så de beholder css stylingen - tror jeg.
22. september 2018 - 19:05 #3
Nu tror jeg, at jeg forstår, hvad du mener...
Jeg skal lave en class i css med display: none !important, som så bruges i stedet for hide og show i jquery.

Css:
.hide { display: none !important; }

jquery:
$(document).ready(function(){
    $('#box > ul > li:eq(2)').addClass('hide');
    $('#btn').click(function(){ $('#box > ul > li:eq(2)').removeClass('hide'); });
});

Er det det du mener?
Avatar billede keysersoze Guru
22. september 2018 - 19:10 #4
ja - og skal du gøre det lidt mere korrekt (kig evt på begrebet BEM) så kald den is-hidden og læg den under din li for så vil du lettere kunne styre hvis is-hidden på lige præcis dette element skulle opføre sig forskelligt responsivt.
22. september 2018 - 19:15 #5
1000 tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester