05. februar 2005 - 17:25Der er
8 kommentarer og 1 løsning
Tilfældig position og skriftstørrelse
Hey! Jeg har lært sådan lidt om JavaScript, men kan næsten intet i det. I dag fik jeg så en ide om at lave noget "kunst" i Javascript. Jeg ville lave mange, fx 100, R'ere i et afgrænset område. Altså alle R'erne skal være i en usynlig boks på fx 400*300px og inde i det område skal der være en masse R'ere. Placeringerne på disse R'ere skal bare være tilfældigt og skriftstørrelsen på alle disse R'ere skal bare være fra alt mellem 10-50px. Jeg prøvede noget, men det lykkedes slet ikke at få noget frem... Måske kan I hjælpe?
Kommunerne har digitaliseret indgangen for borgerne. Men bag skærmen håndteres mange arbejdsgange stadig manuelt mellem systemer, mails og organisatoriske siloer.
yups ... funktionen tager tre argumenter: antal bogstaver, min. skriftstørrelse og max. skriftstørrelse.
I linien: var sp, txt, cont = document.getElementById("container"); erklærer vi, at vi senere vil bruge tre forskellige, lokale variabler (variabler, kun funktionen kan 'se') - og i den sidste variabel lægger vi en reference til div'et.
I linien: for (i=0; i<50; i++) { har jeg været lidt dum, for den burde have heddet: for (i=0; i<numOfChars; i++) { hvilket betyder at det, der står mellem 'tuborgerne' skal udføres 'numOfChars' gange.
Linien: sp = document.createElement("span"); opretter et span (der er 'frit i luften svævende'. Det er endnu ikke indsat i dokumentet).
Linien: txt = document.createTextNode("R"); opretter tilsvarende en tekstnode med indholdet 'R'.
Linien: sp.style.position = "absolute"; sætter spannets position til 'absolute'
Linien: sp.style.fontSize = (Math.round(Math.random()*(maxSize-minSize))+minSize)+"px"; udregner en tilfældig skriftstørrelse mellem min- og max-størrelsen
Linien: sp.appendChild(txt); klistrer tekstnoden ind i spannet
Linien: cont.appendChild(sp); klistrer spannet ind i container-div'et
Linien: sp.style.left = (Math.round(Math.random()*(cont.offsetWidth-sp.offsetWidth)))+"px"; beregner en tilfældig venstre-placering udfra bredden af container-div'et og spannet
Linien: sp.style.top = (Math.round(Math.random()*(cont.offsetHeight-sp.offsetHeight)))+"px"; gør det samme - blot er det her top-placeringen, vi beregner
Funktionen kaldes med sine argumenter i det øjeblik, siden er færdig-loaded: window.onload = function() { populateContainer(50, 10, 50); }
Selvtak. Lige en ekstra bemærkning til udregningen af placeringen af spannet: Hvis du opfatter div'et som et koordinatsystem, skal vi have anbragt spannets øverste, venstre hjørne i et tilfældigt koordinatsæt (left, top).
JavaScript har et matematik-objekt 'Math' med nogle metoder på. Math.round(3.74) vil således afrunde og returnere 3. Math.random() returnerer et tilfældigt decimaltal mellem 0 og 1.
Øverste venstre hjørne af spannet skal altså (i vandret retning) ligge mellem 0 og rammens bredde minus spannets bredde. Så vil bogstavet holde sig indenfor rammen. Et elements bredde kan findes med HTML_ELEMENT.offsetWidth Derfor kommer regnestykket for X-koordinaten altså til at se sådan ud: Math.round( Math.random()*(cont.offsetWidth-sp.offsetWidth) )
Grunden til, vi først sætter left- og top-værdierne så sent i scriptet, er i øvrigt, at vi først skal have klistret teksten ind i spannet og spannet ind i rammen, før det giver mening at spørge om spannets fysiske dimensioner. En god regel er at gøre elementet så færdigt som muligt, inden det klistres ind i dokumentet og dermed bliver synligt - og så foretage de sidste nødvendige justeringer.
Giver det mening, kan du nok selv gennemskue, hvordan vi kommer frem til top (Y) koordinaten ;o)
En enkelt rettelse til div'et. Det skal være positioneret ... enten 'absolute' eller 'relative'. Normalt vil man nok positionere det 'relative', da men så kan lægge det i kodens normale flow - i en tabel-celle eller andet element:
Gør du ikke det, vil span'ene placere sig i forhold til dokumentets koordinatsytems (0,0). Left og top udregnes nemlig udfra det første, positionerede, omkransende element ... i sidste ende <body> Det ser du ikke, sålænge div'et ligger i øverste, venstre hjørne - men først når du flytter på det ;o)
Synes godt om
Ny brugerNybegynder
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.