IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze: navigace šipkami a aktivní div

Aktivity
Avatar
Petr Fiedler
Člen
Avatar
Petr Fiedler:28.1.2018 16:06

Zdravím, mám navigační menu, které mě naviguje na různé divy (články) na jedné stránce. Zajímalo by mě, jak udělat:

  1. aby se mi v navigačním menu změnila barva odkazu na div, na kterém mám právě najetou obrazovku
  2. abych mohl mezi divy posouvat šipkama nahoru a dolů
 
Odpovědět
28.1.2018 16:06
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Petr Fiedler
Honza Bittner:28.1.2018 16:40

Do sekce https://www.itnetwork.cz/…otova-reseni jsem psal např. https://www.itnetwork.cz/…highlighting, což je bod 1, který chceš.

Na šipky zase využiješ nějakou detekci těch šipek, na kterou napojíš modifikovaný smooth scroll https://www.itnetwork.cz/…mooth-scroll

Nahoru Odpovědět
28.1.2018 16:40
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Petr Fiedler
Člen
Avatar
Petr Fiedler:28.1.2018 17:33

Díky, zvýraznění aktivního elementu už funguje, ale s tím druhým bodem si fakt nevím rady...

 
Nahoru Odpovědět
28.1.2018 17:33
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Petr Fiedler
Honza Bittner:28.1.2018 18:46

Viz např. https://stackoverflow.com/…1119/3281252, detekci kláves uděláš takto:

$(document).keydown(function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
});

Potom už stačí jen vypočítat, jaký element je zrovna "aktivní", tj. projdeš všechny elementy mezi kterými chceš přepínat a každého se zeptáš, jaké má souřadnice a porovnáš s aktuálním místem scrollování – na to využiješ hodně věcí z první části. Pokud najdeš shodu, vytáhneš si element před tímto, či za ním, a provedeš scroll na to.

Nahoru Odpovědět
28.1.2018 18:46
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Petr Fiedler
Člen
Avatar
Petr Fiedler:28.1.2018 19:40

Splácal jsem tohle, ale nic to nedělá, kde mám chybu?

function sipky()
{
   var menu = $('nav ul');
   var odchylka = 200;
    $("#main section article").each(function(){
      var toto = this;
      var article_top = $(toto).offset().top;
      var article_height = $(toto).innerHeight();
      var article_id = $(toto).attr('id');
      var menu = $('#menu');
      var rychlost = 1000;
      var efekt = "easeInOutExpo";
      var min = article_top - odchylka;
      var max = article_top + article_height - odchylka;

      if ( (scroll_top > min) && (scroll_top < max) )
      {
         $(document).keydown(function(e) {
            var kam
            switch(e.which) {
                case 38: // up
                    kam = $(toto).previousSibling.attr('id');
                    break;

                case 40: // down
                    kam = $(toto).nextSibling.attr('id');
                    break;

            default: return;
            }
            $("html, body").stop().animate(
            { scrollTop: ($('#'+kam).offset().top - menu.height()) },
            rychlost, efekt);
    e.preventDefault();
});
}
});
}
 
Nahoru Odpovědět
28.1.2018 19:40
Avatar
Petr Fiedler
Člen
Avatar
Petr Fiedler:28.1.2018 19:47

Zapomněl definovat scroll_top, ale stejně to pořád píše v konzoli, že $(toto).previ­ousSibling je nedefinovaný.

 
Nahoru Odpovědět
28.1.2018 19:47
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Petr Fiedler
Honza Bittner:28.1.2018 20:58

No, takto bys to dělat neměl. Musel bys totiž jinak volat funkci sipky() pokaždé, co provedeš scroll. A navíc, logiku bys měl obrátit. Tedy po stisknutí klávesy se projdou prvky, ne naopak.

Udělal bych něco jako

$(document).keydown(function(e) {
    // menu, odchylka, rychlost, efekt, ... – proměnné, které znáš a jsou stejné pro všechno ("konstanty")

    switch(e.which) {
        case 38: // up
        case 40: // down
          $("#main section article").each(function(){
            // proměnné s $(this) atp.
            if ((scroll_top > min) && (scroll_top < max)) {
              // ...
            }
          });
        break;
        default: return;
    }
    e.preventDefault();
});
Nahoru Odpovědět
28.1.2018 20:58
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Jurajs
Člen
Avatar
Odpovídá na Petr Fiedler
Jurajs:28.1.2018 20:58

A mam jeden dotaz proč píšeš proměnnou

var toto = this;

do tohoto -> $(toto); Zkus to napsat takhle - toto.previousSi­bling.attr('id');

 
Nahoru Odpovědět
28.1.2018 20:58
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Jurajs
Honza Bittner:28.1.2018 21:07

Protože JavaScript si s this velice rád hraje a vůbec to mnohdy nereferuje na to, co chceš či na co jsi zvyklý z jiných jazyků (block scope). V JS je function scope a chová se to prostě IMO divně, zejména pokud na to nejsi zvyklý.

Nahoru Odpovědět
28.1.2018 21:07
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Jurajs
Honza Bittner:28.1.2018 21:08

Ahh, sorry, asi jsem tě špatně pochopil. :-)

Nahoru Odpovědět
28.1.2018 21:08
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Jurajs
Člen
Avatar
Odpovídá na Honza Bittner
Jurajs:28.1.2018 21:13

Pokud vím tak proměnné se nepíšou v jquery do $() nebo jo? Tam většinou píšu - id, class a nebo elementy ...

 
Nahoru Odpovědět
28.1.2018 21:13
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Jurajs
Honza Bittner:28.1.2018 21:19

Toto ničemu nevadí. Bere to jak string s CSS selektorem, tak i normální element, nebo i typ jQuery. Viz http://api.jquery.com/jquery. :-)

Nahoru Odpovědět
28.1.2018 21:19
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Petr Fiedler
Člen
Avatar
Petr Fiedler:28.1.2018 21:32

Tak jsem to tedy napsal znova tak, aby se prvky projížděly až po stisknutí šipky a výsledek furt žádný... V f12 mi to jako jedinou chybu ukazuje někde v jquery souboru

 
Nahoru Odpovědět
28.1.2018 21:32
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Petr Fiedler
Honza Bittner:28.1.2018 21:53

Zkus to přidat někam online, např. na JSfiddle, ať se na to můžeme podívat. :-)

Nahoru Odpovědět
28.1.2018 21:53
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Petr Fiedler
Člen
Avatar
Petr Fiedler:28.1.2018 22:14

Tak jo, je to tady: https://jsfiddle.net/8nsypg5t/1/

 
Nahoru Odpovědět
28.1.2018 22:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.