Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Chowające się menu
WiruSSS
post
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 7
Dołączył: 3.02.2007

Ostrzeżenie: (0%)
-----


Witam

Na wstępie chcialbym zaznaczyć, że stworzenie tego nie nastręcza mi problemów. Bardziej nie daje mi spokoju czy aby nie robię tego jakoś naokoło, nieoptymalnie. Być może istnieje jakiś wygodniejszy nieoczywisty dla mnie sposób?

http://jsfiddle.net/WiruSSS/zPXUK/
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
PrinceOfPersia
post
Post #2





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


Cytat
Dla jasności jeszcze raz napiszę: Czy da się owy efekt uzyskać w prostszy sposób

na pewno da się skrócić kod. To co mi się rzuca w oczy, to straszne ilości zduplikowanego kodu:

Cytat
var menu = $(this).children(),
direction = ($(this).position().left > 0 ? 'right' : 'left'),
anim = {};


to masz z 3 razy w różnych funkcjach powtórzone.

tak samo to:
Cytat
menu.find('li:' + (direction === 'left' ? 'first' : 'last') + '-child').hide();
menu.find('li:' + (direction === 'left' ? 'last' : 'first') + '-child').show();
menu.animate(anim)


a powtarzanie sie jest bez sensu, bo będziesz chciał coś zmienić - 3 razy więcej roboty.
W zasadzie dobrze byłoby wydzielić powtarzający się kod do jakiejś osobnej funkcji pomocniczej, np.:
Kod
function getMenuParams(self) {
  var menu = $(self).children(), direction = ($(self).position().left > 0 ? 'right' : 'left'), anim = {};
  return {menu:menu, direction:direction, anim:anim};
}


a potem zamiast:
Kod
var menu = $(this).children(),
            direction = ($(this).position().left > 0 ? 'right' : 'left'),
            anim = {};

wywołujesz tylko funkcję i przypisujesz zmienne z funkcji:
Kod
var p = getMenuParams(this);
var menu = p.menu, direction = p.direction, anim = p.anim;


Cytat
Czy muszę rozgraniczać się do zdarzenia chowania menu osobno a do zdarzenia wysuwania menu osobno?

Nie musisz. Możesz zrobić to w jednej funkcji. Na dobrą sprawę showMenu i hideMenu robią dokładnie to samo, różnią się tylko jedną linijką:
w hide jest
Kod
anim[direction] = -menu.width() + 'px';

a w show
Kod
anim[direction] = 0;


czyli możesz zamiast zrobić osobne funkcję dać jedną funkcję showHideMenu, i showHideMenu(true) oznacza pokazanie, showHideMenu schowanie:
Kod
    showHideMenu: function (isShowing) {
        "use strict";
                var p = getMenuParams(this);
                var direction = p.direction, anim = p.anim, menu = p.menu;

        anim[direction] = isShowing? 0 : -menu.width() + 'px';

        menu.find('li:' + (direction === 'left' ? 'first' : 'last') + '-child').hide();
        menu.find('li:' + (direction === 'left' ? 'last' : 'first') + '-child').show();
        menu.animate(anim);
    },

coś jak to (nie chce mi się tego testować czy wszystko się odpala, ale w zarysie tak mniej więcej).

No i żeby zrobić "lukier składniowy", możesz zostawić funkcje showMenu / hideMenu, ale w ten sposób, że będą odwoływać się do showHideMenu:

Kod
showMenu: function() {
  this.showHideMenu(true);
},

hideMenu: function() {
  this.showHideMenu(false);
},

tym sposobem dalej będziesz mógł pisać hideMenu() / showMenu().

EDIT:
albo zrób tak jak kolega napisał, z utworzeniem konstruktora i osobnego obiektu do każdego menu. Whatever works (IMG:style_emoticons/default/wink.gif) Ważne, żeby nie powtarzać zbyt dużej ilości kodu (bo tak jak teraz masz jest tragicznie pod kątem powtarzania). Zresztą wsadzenie czegoś w jeden obiekt wcale nie przeczy temu co napisałem.


Cytat
Chociaż i tego rzadko używam bo w programowaniu obowiązuje zasada - deklaruje zmienne jak najbliżej miejsca w którym zostaną użyte.

w JavaScript do zalecanych praktyk należy deklarowanie zmiennych na początku funkcji - chyba wiesz dlaczego (dla postronnych - chodzi o to, że zasięg zmiennych deklarowanych przez 'var' jest na całą funkcję (a nie na blok kodu, jak to jest np. w C++)

Cytat
- nie CSS decyduje o tym po której stronie ma być slider. Tu mieszasz reprezentację z logiką. To skrypt ma decydować po której stronie ma być slider.

to po której stronie/w którym miejscu ma być slider, to właśnie warstwa reprezentacji i powinno to być ustawiane w HTML/CSS.


Go to the top of the page
+Quote Post

Posty w temacie
- WiruSSS   Chowające się menu   12.09.2013, 13:23:08
- - kamil4u   Robisz to dobrze - tak jak się powinno. Inne uwagi...   12.09.2013, 15:22:39
- - lukasz1985   Ja bym nie robił takich rzeczy z definicjami zmien...   12.09.2013, 16:06:57
- - WiruSSS   ..hmm ..nie do końca się zrozumieliśmy ...to jest ...   12.09.2013, 16:45:40
- - lukasz1985   Wow... ok, z mojej strony powiem tak: Cytat..a jes...   12.09.2013, 19:36:58
- - WiruSSS   ..no niestety z moim programowaniem tak jest, zajm...   12.09.2013, 20:49:29
- - lukasz1985   Kilka spraw odnośnie tego kodu: - nie dajesz osob...   14.09.2013, 21:49:36
- - WiruSSS   Cytat- nie CSS decyduje o tym po której stronie ma...   14.09.2013, 23:26:35
- - lukasz1985   Źle to robisz, nie powiem Ci czemu bo do tego wyst...   15.09.2013, 10:46:33
- - WiruSSS   Ale to, że robię to inaczej niż zrobiłby to kto in...   15.09.2013, 17:54:54
- - PrinceOfPersia   CytatDla jasności jeszcze raz napiszę: Czy da się ...   16.09.2013, 07:20:12
- - lukasz1985   Ok. To bawcie się w deklarowanie zmiennych konfigu...   17.09.2013, 10:32:40
- - PrinceOfPersia   Zamiast się mądrzyć i odsądzać od czci i wiary inn...   17.09.2013, 11:33:12
- - lukasz1985   Funkcja jest obiektem w JS. Ale skoro tego nie wie...   17.09.2013, 11:39:56
- - PrinceOfPersia   Właśnie w idealny sposób pokazałeś, że nie umiesz ...   17.09.2013, 11:49:32
- - lukasz1985   To po co wcześniej ta uwaga: Cytatnie pisałem o o...   17.09.2013, 12:24:01
- - WiruSSS   ...ale się gorąco zrobiło. W zasadzie skypt miał b...   17.09.2013, 18:16:55
- - lukasz1985   Jeśli chcesz mieć frajdę z tego co robisz - rób el...   18.09.2013, 12:12:30


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 03:03