mboost-dp1

Hente position (css) med js


Gå til bund
Gravatar #1 - karga
22. jul. 2008 12:43
Hejsa

Jeg har lavet et lille script til at hente x/y koordinater, for et element:

function fnGetOffset(objObject) {
iLeft = 0
iTop = 0

while(objObject.tagName != "BODY") {
alert(objObject.tagName + " (" + objObject.id + "/" + objObject.className + "): " + objObject.style.position)
iLeft = iLeft + objObject.offsetLeft
iTop = iTop + objObject.offsetTop
objObject = objObject.parentNode
}
return [iLeft,iTop]
}


Jeg har et halvavanceret stylesheet, der tit gør brug af position: relative, til at positionere elementer absolut på elementet med relative, istedet for at skulle angive koordinater for hjørnet af browseren

Så for at undgå, at jeg får koordinater fra element til body, istedet for kun at få koordinater til et element med position: relative, ville jeg gerne tjekke om elementet har den style på sig, men jeg kan kun hente det ud med objObject.style, der kun giver mig inline style..

Så er der ikke en måde i js, at hente style ud, der kommer fra et stylesheet?
Gravatar #2 - Windcape
22. jul. 2008 19:40
Nej.

Og du skulle måske overveje at lave en design uden en masse relative elementer. Hvad er der nu galt i god gammeldaws boks-opbygning.

(Og så vil jeg gerne slappe dig, for at bruge hungarian notation!!)
Gravatar #3 - karga
22. jul. 2008 20:24
Forklar mig hvad der er galt i at bruge div-layouts, hvor en eller flere elementer (måske?) er relativt positionerede..

Det er da 10 gange lettere, når man gerne vil placere noget absolut (så det ikke påvirker flow og kan køre henover andre elementer, som en slags popup) - og ikke engang "forkert" eller et hack

(Du kan slappe alt det du vil, hvis du bruger fancy udtryk, du ikke forklarer)
Gravatar #4 - Corholio
22. jul. 2008 20:35
#2

Må indrømme at jeg ikke kan se noget galt i at bruge Hungarian Notation.

(som er: http://en.wikipedia.org/wiki/Hungarian_notation)
Gravatar #5 - T-Hawk
22. jul. 2008 20:39
Jeg ville egentlig også gerne vide hvad der er så slemt ved Hungarian Notation. Specielt i Javascript, some jo nærmest selv opfordrer til det ved at være case-sensitive.
Gravatar #6 - Windcape
22. jul. 2008 23:42
Alting!

Det er grimt, unødvendig, ubrugeligt, plus hvis du ændre en type skal du ændre samtlige variable navne.

objObject er dårlig navngivning. Det samme er fnGetOffset , da GetOffset tydeligvis altid vil reffere til en funktion da navnet i sig selv beskriver en handling.

iLeft giver heller ikke mening, Karga mener sikkert at der er en "integer", selvom det burde være "indention".

Så variable navnet burde være "leftIndention" eller "leftMargin", "marginLeft" etc.

Og så er jeg dybt skuffet over at du kalder dig selv professionel uden at vide hvad du laver :p

Lidt info til de tungnemme:

Funktion/Metode navne: Beskriver en handling/funktion
Variablenavne: Beskriver indholdet af den givne variabel
Parametre: Beskriver indholdet af det givne parameter.

Og brug DOKUMENTATION (ie. kode-kommentarer) istedet for hungarian notation, det giver så uendelig meget mere mening, og folk skal ikke GÆTTE til hvad dine personlige notations betyder.
Gravatar #7 - fidomuh
22. jul. 2008 23:58
#2

Og du skulle måske overveje at lave en design uden en masse relative elementer.


Hvorfor?

Hvad er der nu galt i god gammeldaws boks-opbygning.


Hvad er der galt i at bruge position: relative; ?

#Karga

For lige at forstaa dig ret, hvilket output giver "objObject.style" dig saa?

JEg tror det eneste umiddelbart er offsetParent, men den giver dig bare top/left til en "parent" boks..

Lidt besynderligt at JS ikke kan tjekke alle styles egentligt, der burde vaere en object.styles som bare indeholdt alt om den paagaeldende boks :P
Gravatar #8 - Windcape
23. jul. 2008 00:00
Absolut ikke besynderligt, det er et grundlæggende princip i hvordan CSS fungere.

Javascript kan kun tilgå inline styles, så simplet er det.
Det kan godt aflæse det nuværende positionering af et element på skærmen, men ikke hvad en CSS fil har lagt overpå.

Husk at CSS er et style layer som tilføjes oven på DOM, hvor javascript kun kan aflæse selve DOM.

Hvorfor?

Fordi det kan lade sig gøre! Mindre komplex kode, skaber mindre antal problemer.

Brug af position konstrukten i CSS er 9/10 tilfælde et hack som basere sig i

a) Manglende skills/erfaring
b) Fanatisme mod at bruge tables til kolonne layouts
Gravatar #9 - karga
23. jul. 2008 00:52
#6 og #8 du aner jo ikke hvad du taler om :S

1. Jeg har (desværre) set kolleger, der koder usandsynligt ringe, så ens "skills" har intet at gøre med det at tjene penge på programmering - hvad der måske er mere skræmmende, er at en pæn portion af dem jeg kender, der faktisk koder rigtigt godt, de er ikke professionelle, andet end et projekt i ny og næ

2. Det er muligt det er grimt, unødvendigt og ubrugeligt, når du bruger det der ungarske gullash, men kunne det tænkes i din ideelle verden, at andre mennesker tænker anderledes end du gør? Når jeg sætter et i foran en variabel siger jeg blot til mig selv at det er et tal, ikke om det er float, double eller integer, bare et tal
Og NEJ, det er ikke unødvendigt.. det gør, for mig, at variabelnavne kan være utroligt korte og præcise, da jeg ikke skal tænke på om funktionsnavnet evt. er det samme som en variabel - eksempel: Funktionen Offset kan ikke bare smides ind i en variabel, der hedder Offset, men hvis funktionen hedder fnOffset og variablen hedder arrOffset, så kan man læse en sammenhæng mellem de to, men de er totalt adskilte
Navne som objObject kommer, hvis jeg ikke ved nøjagtigt hvad objectet peger på at tagName (kalder divs for objDiv, hvis de ikke har andet "pænere" og mere beskrivende navn

3. Kommentarer er fine, men i en overflod af kommentarer, bruger man dobbelt så lang tid på det.. og hvis man har bare lidt evner og engelsk egenskaber, så kan man læse koden direkte - jeg kommenterer, når jeg ser en funktion i det og ikke bare for at gøre det, fordi det siger manden

4. CSS-layouts er bare "the way to go" - ved ikke om det er css-layouts du ikke kan lide, eller kun det at bruge positionering?
Og hvis man har en god portion erfaring med css, så behøver der ikke være et eneste hack.. personligt vil jeg hellere finde en anden måde, end at bruge et hack og i mit cms er der ikke en eneste af slagsen, selvom det efterhånden er et rimeligt avanceret system, så jeg må åbenbart være en del af de 10% du snakker om..?
Tror ikke på du har lavet vitterligt avancerede layouts før, hvis du mener positonering er dumt/unødvendigt..

5. Når nu du er så glad for dokumentation, hvorfor kommer du så ikke med nogle links til alle dine påstande? Det kan jo ikke bruges til noget, når du bare sviner til og så går videre..

Men hvorfor jeg gider skrive det her ved jeg ikke, du plejer jo altid bare at tage det bid for bid og svare på en endnu mere tom måde.. :S
Gravatar #10 - karga
23. jul. 2008 00:56
#7 objObject.style giver et objekt.. desværre.. den har jeg også tænkt på et par gange.. men det objekt giver kun adgang til inline style

offsetParent giver en referance til det øvre element, der er positioneret til.. ehm, svært at forklare hehe.. og jeg kan faktisk ikke forklare hvorfor nogle elementer skal springes over, hvor parentNode ikke gør det

Nå men nu vil jeg squ i seng, har lige brugt et par timer på at finde ud af hvor meget jeg har glemt fra min gymnasietid :S kunne ikke engang finde en simpel formel for et parabelt tidsforløb :S
Gravatar #11 - Windcape
23. jul. 2008 01:34
Når jeg sætter et i foran en variabel siger jeg blot til mig selv at det er et tal, ikke om det er float, double eller integer, bare et tal

Det ved programmør nummer 2 ikke! (Desuden, så er det standard at lille i er integer, og stort I er interface -- for dem som nu engang elsker hungarians)

3. Kommentarer er fine, men i en overflod af kommentarer, bruger man dobbelt så lang tid på det..

Du skal dokumentere mindst ligeså lang tid som du koder. (Note: kode != hele udviklingsprocessen).

Links? Læs nogle bøger, tag en uddanelse, arbejde hos firmaer med dokumentationsstandarder og processor.
Gravatar #12 - Windcape
23. jul. 2008 01:38
Navne som objObject kommer, hvis jeg ikke ved nøjagtigt hvad objectet peger på at tagName (kalder divs for objDiv, hvis de ikke har andet "pænere" og mere beskrivende navn

Prøv også at beskrive ting mere humant (på engelsk)

<div> er et block element, som typisk indeholder indhold. dvs. det er en kontainer (container).

thus: <div id="maincontent"> =

var mainContentContainer = document.getElementById("mainContent");
Gravatar #13 - m_abs
23. jul. 2008 02:12
#1
Jeg har lavet et lille script til at hente x/y koordinater, for et element:

I vores produkt bruger vi jquery plus plugins, et af dem hedder dimension som kan det jeg tror du prøver at opnå.

Du kunne kigge på, hvordan han gør det i funktionen "offset".
http://brandonaaron.net/docs/dimensions/#api-offse...

#8
Javascript kan kun tilgå inline styles, så simplet er det.
Det kan godt aflæse det nuværende positionering af et element på skærmen, men ikke hvad en CSS fil har lagt overpå.

Det er så ikke helt sandt.

Der er en DOM level 2 function der hedder getComputedStyle som levere et elements samlede stil. Desværre er den ikke universelt understøttet.

Sektionen med overskriften "Reading applied element styles" http://www.howtocreate.co.uk/tutorials/javascript/...
Gravatar #14 - Corholio
23. jul. 2008 05:57
#6

God dammit, man går i seng, og vågner til en Marathon-debat.

Det er grimt, unødvendig, ubrugeligt, plus hvis du ændre en type skal du ændre samtlige variable navne.


Ikke det store problem når man benytter sig af en nogenlunde kompetent IDE.

objObject er dårlig navngivning. Det samme er fnGetOffset , da GetOffset tydeligvis altid vil reffere til en funktion da navnet i sig selv beskriver en handling.


Enig, dårlig navngivning, men nu er Hungarian notation per definition med til at beskrive mere end intention (så som type).

iLeft giver heller ikke mening, Karga mener sikkert at der er en "integer", selvom det burde være "indention".


Smååååååå sko :-P

Funktion/Metode navne: Beskriver en handling/funktion
Variablenavne: Beskriver indholdet af den givne variabel
Parametre: Beskriver indholdet af det givne parameter.


Enig... hvis man altså ikke benytter sig af Hungarian notation.

Og brug DOKUMENTATION (ie. kode-kommentarer) istedet for hungarian notation, det giver så uendelig meget mere mening, og folk skal ikke GÆTTE til hvad dine personlige notations betyder.


Nej, ikke istedet for, men som et supplement. Dokumentation af kode er alpha omega, men der er også sådan ting som Unit Test, man kan supplere med. En kombination af de 2 burde nok være hvad man sigter efter. Jeg giver dig dog ret i at det er dårlig stil at lade andre udviklere gætte funktionalitet ud fra notationsform.

Men igen... dette er skrevet før jeg har fået noget koffein i kroppen, så der taget forbehold for alt.
Gravatar #15 - karga
23. jul. 2008 08:52
#11 objObject bliver brugt her netop fordi jeg ikke ved noget om det element der kommer ud, da det jo bare kører op igennem hierakiet

Hvis jeg skal behandle en række elementer, inden i en div jeg bruger til at rette fokus på de elementer i den div, så kalder jeg skam også objektet objContainer, men hvis jeg kan give div'en et bedre navn, så gør jeg det, f.eks. er jeg igang med en billedbrowser, der indeholder en div-container med en masse divs inden i, der så igen har et billede inde i sig. Der kalder jeg containeren for objImages - objektet, der indeholder billeder - samtidig med jeg kalder div-elementerne inde i containeren for objImage (bare et hurtigt eksempel)

Lige netop dette projekt er det udelukkende mig der skal håndtere koden.. og hvis du kunne se mit skrivebord, ville du vide jeg bruger vældigt meget tid på at planlægge forløbet med flowcharts og 10.000 krusseduller

#14 så må du jo lære at være vågen i døgnets 24 timer ;)
Gravatar #16 - fidomuh
23. jul. 2008 10:27
#8

Absolut ikke besynderligt, det er et grundlæggende princip i hvordan CSS fungere.


....? Det er et grundlaeggende princip i CSS at man kun kan aflaese *NOGEN* styles?
For mig at se er de blot en fejl i CSS at "tagget" ikke er med ...
( Tagget bliver jo, sjovt nok, sendt til renderen, saa JavaScript burde kunne lege med her. )

Det kan godt aflæse det nuværende positionering af et element på skærmen, men ikke hvad en CSS fil har lagt overpå.

Husk at CSS er et style layer som tilføjes oven på DOM, hvor javascript kun kan aflæse selve DOM.


Jow, men saa vil jeg stadig sige at det er en design-fejl i CSS eller DOM, at alle tags ikke er repraesenteret.

Fordi det kan lade sig gøre!


Relative elementer kan fint lade sig goere.
Jeg ville have en generel grund, ikke lige noget der specifikt relaterer til JS DOM aflaesning.

Mindre komplex kode, skaber mindre antal problemer.


Og mindre funktionalitet, mindre alt muligt andet.
Kompleksitet er en uundgaaelighed, uanset om man arbejder for at undgaa det.

Din kode bliver kompleks naar du kommer op i en vis stoerrelse og vil have specielle funktioner - at forsoege at undgaa at bruge relative elementer kan jeg slet ikke se nogen pointe i.
Slet ikke naar alle tuder vildt og voldsomt over at man skal bruge EM stoerrelser og alting skal skalere med browseren.

Brug af position konstrukten i CSS er 9/10 tilfælde et hack som basere sig i


Okay?
Jeg kender ellers mange der bruger "position: relative;" som er ganske gode programmoerer.

Men hvorfor mener du dette?

a) Manglende skills/erfaring


Er jo tydeligvis ikke problemet for Karga, dog kunne det vaere et problem for dig - naar du siger det er umuligt, men en anden linker til en maade at goere det paa? :-p
Det er dumt at kaste med sten naar man selv er programmoer. ... Eller noget i den stil ;)

b) Fanatisme mod at bruge tables til kolonne layouts


Personligt bruger jeg en blanding af tables og divs, men jeg har stadig divs der er position: relative; ..

Jeg kan ikke umiddelbart se hvordan jeg faar divs til at overlappe uden at bruge relativ positionering - hvis du har et bud siger du bare til, saa skal jeg nok se om det virker :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login