Avatar billede or.han Nybegynder
05. februar 2005 - 17:25 Der 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?
Avatar billede olebole Juniormester
05. februar 2005 - 20:52 #1
<ole>

Du kunne prøve noget à la:

<script type="text/JavaScript">
function populateContainer(numOfChars, minSize, maxSize) {
    var sp, txt, cont = document.getElementById("container");
    for (i=0; i<50; i++) {
        sp = document.createElement("span");
        txt = document.createTextNode("R");
        sp.style.position = "absolute";
        sp.style.fontSize = (Math.round(Math.random()*maxSize)+minSize)+"px";
        sp.appendChild(txt);
        cont.appendChild(sp);
        sp.style.left = (Math.round(Math.random()*(cont.offsetWidth-sp.offsetWidth)))+"px";
        sp.style.top = (Math.round(Math.random()*(cont.offsetHeight-sp.offsetHeight)))+"px";
    }
}

window.onload = function() {
    populateContainer(50, 10, 50);
}
</script>

<div id="container" style="width:400px;height:300px;font-family:verdana,sans-serif;border:1px solid red"></div>

/mvh
</bole>
Avatar billede olebole Juniormester
05. februar 2005 - 20:54 #2
Njaahhh ... sådan holder den nok bedre:

<script type="text/JavaScript">
function populateContainer(numOfChars, minSize, maxSize) {
    var sp, txt, cont = document.getElementById("container");
    for (i=0; i<50; i++) {
        sp = document.createElement("span");
        txt = document.createTextNode("R");
        sp.style.position = "absolute";
        sp.style.fontSize = (Math.round(Math.random()*(maxSize-minSize))+minSize)+"px";
        sp.appendChild(txt);
        cont.appendChild(sp);
        sp.style.left = (Math.round(Math.random()*(cont.offsetWidth-sp.offsetWidth)))+"px";
        sp.style.top = (Math.round(Math.random()*(cont.offsetHeight-sp.offsetHeight)))+"px";
    }
}

window.onload = function() {
    populateContainer(50, 10, 50);
}
</script>

<div id="container" style="width:400px;height:300px;font-family:verdana,sans-serif;border:1px solid red"></div>
Avatar billede or.han Nybegynder
05. februar 2005 - 21:22 #3
TAK OLEBOLE! Men for at jeg skal forstå din kode, kan du så ikke lige forklare bare hvad de forskellige ting gør?
Avatar billede olebole Juniormester
05. februar 2005 - 22:03 #4
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);
}
Avatar billede olebole Juniormester
05. februar 2005 - 22:04 #5
PS: Husk lige at rette de 50 i for-løkken, som jeg viste  ;o)
Avatar billede or.han Nybegynder
05. februar 2005 - 23:57 #6
du er fandme sej! tak tak!
Avatar billede olebole Juniormester
06. februar 2005 - 01:32 #7
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)
Avatar billede olebole Juniormester
06. februar 2005 - 01:36 #8
*host-host*
  Math.round(3.74) vil således afrunde og returnere 4
  Math.round(3.34) vil også afrunde og returnere 3  ;D
Avatar billede olebole Juniormester
06. februar 2005 - 01:44 #9
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:

<div id="container" style="position:relative;width:400px;height:300px;font-family:verdana,sans-serif;border:1px solid red"></div>

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)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester