Autor Zpráva
opsadik
Profil *
Zdravím, mám problém s hlavním menu na webu. Většina webu je all in one page, takže na jednotlivé části odkazuju přes kotvy. V mobilní verzi využívám hamburger menu, které po rozkliknutí překryje celou obrazovku. Teď ale řeším problém s tím, jak menu zavřít po kliknutí na odkaz, aby mobilní uživatel pochopil, že už je na požadované kotvě. Na hamburger menu používám následující JS
function menu() {
  var x = document.getElementById("menu");
  if (x.style.display === "flex") {
    x.style.display = "none";
  } else {
    x.style.display = "flex";
  }
}
Jednoduše řečeno - po kliknutí na hamburger se změní display u <ul id="menu"> mezi none a flex. Když k linku v menu přidám onclick="menu()", tak se vše v mobilu jeví správně, ale problém nastává při zobrazení v počítači. Tam je menu viditelné po celou dobu (bez hamburgeru) a po kliknutí na link se sice uživatel dostane na požadovanou část stránky, ale zároveň s tím vcelku logicky zmizí i menu.

Dá se nějakým způsobem omezit funkčnost skriptu jen na mobilní zařízení, aby menu na desktopu nemizelo? Případně dělám něco špatně?
Kajman
Profil
Co nenestavovat přímo display, ale dát menu elementu třídu, zda má být rozbalené nebo ne. A display podle rozbalenosti pomocí css měnit jen pro mobily.
opsadik
Profil *
Můžu poprosit to nějak líp rozepsat? Úplně si nedovedu představit, co tím myslíte.
anonym_
Profil *
opsadik:
classList.toggle místo .style.display. A pak v CSS nastavit breakpointem, kdy má být menu viditelné vždy (třída .hidden nic neudělá), nebo skryté (třída .hidden bude mít display: none).

Pokud ani teď nevíš, hledej media queries.
Kajman
Profil
opsadik:
Přesně tak to bylo myšleno, funkci menu stačí upravit na
function menu() {
  var x = document.getElementById("menu");
  if(x) {
    x.classList.toggle('hamburger_on');
  }
}

A tam, kde v css máte media queries blok, který rozhoduje, zda na mobilu zobrazit ikonu hamburgeru, tak do stejné podmínky dáte něco jako
#menu {display:none}
#menu.hamburger_on {display:flex}
(První řádek v té sekci nejspíš už máte.)
opsadik
Profil *
Děkuji moc, už to funguje podle mých představ.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0