Avatar billede pitzen Nybegynder
30. juli 2008 - 11:07 Der er 48 kommentarer og
2 løsninger

Problem med to-spaltet div-layout (height)

Hej!

Jeg har lavet et layout i div og css, men er stødt på et problem. left og right skal være lige lange uanset hvad. Dvs. hvis der er meget indhold i left, skal right bare blive tilsvarende længere og omvendt. Det kan jeg ikke hitte ud af :/

Nogen der lige kan kringle den?

Desuden, er der nogen der ved hvordan man får et textarea til at justerer højden efter indholdet?

#wrap{
    margin:0 auto;
    width: 763px;
    border: 1px solid #FFFFFF;
    border-top: 0;
    border-bottom: 0;
}

#topstykke{
    height: 70px;
    background-color: #D9D8CB;
}

#banner{
    height: 149px;
}

#menu{
    height: 33px;
    background: url(../graphics/menu_bg.jpg) repeat-x;
}

#right{
    margin-left: 260px;
    background-color: #D9D8CB;
    padding-left: 20px;
}

#left{
    float: left;
    width: 220px;
    padding: 20px;
    background-color: #9C9B8B;
    height: 100%;
}

#footer{
    clear: both;
    height: 20px;
    background-color: #BEBDAF;
    border-top: 1px solid #FFFFFF;
    padding: 5px 10px 0 10px;
}

<div id='wrap'>
    <div id='topstykke'>
    </div>
    <div id='banner'>
        Topbanner
    </div>
    <div id='menu'>
        Menu
    </div>
    <div id='left'>
        Submenu
    </div>
    <div id='right'>
        Content
    </div>
    <div id='footer'>
        Footer
    </div>
</div>
Avatar billede w13 Novice
30. juli 2008 - 12:08 #1
Ang. textarea, så kan du måske bruge følgende JavaScript-kode:

<script type="text/javascript">
function resizeTextarea(o){
    o.style.height = 10 + (o.value.split("\n").length * 12 * 1.3) + "px";
}
</script>

<textarea style="height:22px;overflow:hidden;font-size:12px" onkeyup="resizeTextarea(this)"></textarea>

Ang. de 2 spalter, så tror jeg også, du skal bruge JavaScript til at løse det. Jeg er ikke sikker på, du kan gøre det i ren HTML/CSS.
Avatar billede w13 Novice
30. juli 2008 - 12:13 #2
Men det er vel bare at skrive:

<script type="text/javascript">
window.onload = function(){
  adjustHeight(document.getElementById("left"),document.getElementById("right"));
}
function adjustHeight(o1,o2){
  if (o1.offsetHeight > o2.offsetHeight) o2.style.height = o1.offsetHeight + "px";
  else o1.style.height = o2.offsetHeight + "px";
  }
}
</script>
Avatar billede Slettet bruger
30. juli 2008 - 12:16 #3
http://www.alistapart.com/articles/multicolumnlayouts
virker ganske fint. Lavet i ren CSS.
Avatar billede zips Juniormester
30. juli 2008 - 12:16 #4
Avatar billede Slettet bruger
30. juli 2008 - 12:23 #5
Det mest bøvlede pjeler at være hvis indholdet på siden ikke er ret langt og man så ønsker at diverse farver på kolonnerne rækker helt ned. Mn det kan lade sig gøre at lave uden brug af javascript. Hvilket jeg egentlig også foretrækker.
Avatar billede pitzen Nybegynder
30. juli 2008 - 12:43 #6
Når jeg smider følgende ind, får jeg en syntaks fejl:

<script type="text/javascript">
window.onload = function(){
  adjustHeight(document.getElementById("left"),document.getElementById("right"));
}
function adjustHeight(o1,o2){
  if (o1.offsetHeight > o2.offsetHeight) o2.style.height = o1.offsetHeight + "px";
  else o1.style.height = o2.offsetHeight + "px";
  }
}
</script>
Avatar billede w13 Novice
30. juli 2008 - 12:48 #7
Nå ja, i linje 78, hvor der står "}". Den skal bare væk, så det bliver:

<script type="text/javascript">
window.onload = function(){
  adjustHeight(document.getElementById("left"),document.getElementById("right"));
}
function adjustHeight(o1,o2){
  if (o1.offsetHeight > o2.offsetHeight) o2.style.height = o1.offsetHeight + "px";
  else o1.style.height = o2.offsetHeight + "px";
}
</script>

Så virker det fint. Har også testet det.
Avatar billede pitzen Nybegynder
30. juli 2008 - 13:40 #8
Ja det fungerer! :)

Mht. til resize funktionen - Jeg får følgende fejl:

Streng konstanten blev ikke afsluttet. Og det er lige ved '\n' det kikser.

Desuden må dette også gerne ske onload. Hvilket vel også er simpelt!?
Avatar billede w13 Novice
30. juli 2008 - 13:44 #9
Så bruger du den nok forkert, for det virker fint hos mig. Prøv evt. at vise koden.

Du kan i øvrigt sætte det til at blive kørt onload ved at rette det andet script til:

<script type="text/javascript">
window.onload = function(){
  adjustHeight(document.getElementById("left"),document.getElementById("right"));
  resizeTextarea(document.getElementById("textareaets_id"));
}
function adjustHeight(o1,o2){
  if (o1.offsetHeight > o2.offsetHeight) o2.style.height = o1.offsetHeight + "px";
  else o1.style.height = o2.offsetHeight + "px";
}
</script>

Så skal du selvfølgelig bare rette "textareaets_id". :)
Avatar billede pitzen Nybegynder
30. juli 2008 - 13:56 #10
Jeg får ikke længere fejlen. Men jeg kan stadig ikke få boksen til at resize. Jeg tror det skyldes at det ikke e ren helt plain box (se nedenstående link)

Men der er et lille problem med kolonne-højde løsningen. Se evt her:
http://86.58.155.197/luxweb/sites/temp1/index.php?id=1&edit=1
Avatar billede pitzen Nybegynder
30. juli 2008 - 13:58 #11
For lige at uddybe problemet med kolonnerne, så er venstre kolonne for lille her:
http://86.58.155.197/luxweb/sites/temp1/index.php?id=14

og højre i dette tilfælde:
http://86.58.155.197/luxweb/sites/temp1/index.php?id=2

Jeg er sikker på det skyldes padding, for hvis jeg fjerne dette virker det perfekt. Men det burde bare virke da paddingen er ens for begge divs
Avatar billede w13 Novice
30. juli 2008 - 13:58 #12
Det har noget med det at gøre, ja. Det er et IFrame.

2 sek.
Avatar billede w13 Novice
30. juli 2008 - 13:59 #13
Det med padding, så er det et problem ja.

Når jeg aflæser højden med JavaScript, regnes padding med.

Når jeg så sætter højden, så lægges padding til denne.
Avatar billede pitzen Nybegynder
30. juli 2008 - 14:03 #14
Ville det så være smartest at trække paddingen fra igen? Selvom det ikk eer så flexibelt..
Avatar billede w13 Novice
30. juli 2008 - 14:05 #15
Iframeproblemet kunne måske løses med:

<script type="text/javascript">
window.onload = function(){
  adjustHeight(document.getElementById("left"),document.getElementById("right"));
  resizeIFrame(document.getElementById("cms_ifr"));
  document.getElementById("cms_ifr").onkeyup=function(){resizeIFrame(document.getElementById("cms_ifr"))};
}
function adjustHeight(o1,o2){
  if (o1.offsetHeight > o2.offsetHeight) o2.style.height = o1.offsetHeight + "px";
  else o1.style.height = o2.offsetHeight + "px";
}
</script>

Og så resizeTextarea()-koden:

<script type="text/javascript">
function resizeIFrame(o){
    o.style.height = o.contentWindow.document.getElementsByTagName("body")[0].offsetHeight + "px";
}
</script>

<textarea style="height:22px;overflow:hidden;font-size:12px"></textarea>

Men det er lidt et skud i tågen.
Avatar billede w13 Novice
30. juli 2008 - 14:08 #16
Ja, det ville det måske. Ellers kan du prøve at rette:

function adjustHeight(o1,o2){
  if (o1.offsetHeight > o2.offsetHeight) o2.style.height = o1.offsetHeight + "px";
  else o1.style.height = o2.offsetHeight + "px";
}

til:

function adjustHeight(o1,o2){
  var iPadding = 0;
  if(o1.offsetHeight > o2.offsetHeight){
    iPadding = parseInt(o2.style.padding.toLowerCase().replace("px",""));
    o2.style.height = (o1.offsetHeight - iPadding) + "px";
  }else{
    iPadding = parseInt(o1.style.padding.toLowerCase().replace("px",""));
    o1.style.height = (o2.offsetHeight - iPadding) + "px";
  }
}
Avatar billede pitzen Nybegynder
30. juli 2008 - 14:22 #17
contentWindow.document er null eller ikke et objekt, får jeg nu mht. til iframe!

Mht. til adjustHeight virker det ikke selvom løsningen eller var smart :/ Jeg trækker bare paddingen fra manuelt :)
Avatar billede w13 Novice
30. juli 2008 - 14:24 #18
Prøv evt. at fjerne:

document.getElementById("cms_ifr").onkeyup=function(){resizeIFrame(document.getElementById("cms_ifr"))};

Måske er det fordi denne linje køres, inden IFramen er klar.
Så skal du se, om det udvider sig, når du skriver i det.
Avatar billede w13 Novice
30. juli 2008 - 14:28 #19
Nej, det er også rigtigt - man kan ikke hente padding, hvis det er sat med et eksternt CSS-dokument. :(
Avatar billede pitzen Nybegynder
30. juli 2008 - 14:32 #20
Jeg får ingen fejl nu, men feltet udvider sig ikke:

http://86.58.155.197/luxweb/sites/temp1/index.php?id=1&edit=1
Avatar billede w13 Novice
30. juli 2008 - 14:32 #21
Hmm. Men du vil nok kunne gøre således :P

function adjustHeight(o1,o2){
  var iPadding = 0;
  if(o1.offsetHeight > o2.offsetHeight){
    o2.style.height = (o1.offsetHeight) + "px";
    o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +"px";
  }else{
    o1.style.height = (o2.offsetHeight) + "px";
    o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + "px";
  }
}
Avatar billede w13 Novice
30. juli 2008 - 14:33 #22
Hvad hvis du lige retter:

  document.getElementById("cms_ifr").onkeyup=function(){resizeIFrame(document.getElementById("cms_ifr"))};

til:

  document.getElementById("cms_ifr").onkeyup=function(){alert("onkeyup")};

Så skulle den fortælle os, om den kan mærke, når man trykker på en tast.
Avatar billede pitzen Nybegynder
30. juli 2008 - 14:37 #23
den registrer ikke key up :S
Avatar billede pitzen Nybegynder
30. juli 2008 - 14:38 #24
Kolonne problemet virkede med den nye løsningen.. genialt :)
Avatar billede w13 Novice
30. juli 2008 - 14:45 #25
Så er det keyup, der er problemet. Ok.

Prøv at rette:

document.getElementById("cms_ifr").onkeyup=function(){resizeIFrame(document.getElementById("cms_ifr"))};

til:

alert("contentWindow eksisterer: "+document.getElementById("cms_ifr").contentWindow);
alert("contentWindow.document eksisterer: "+document.getElementById("cms_ifr").contentWindow.document);
document.getElementById("cms_ifr").contentWindow.document.getElementsByTagName("body")[0].onkeyup=function(){parent.resizeIFrame(document.getElementById("cms_ifr"))};
Avatar billede w13 Novice
30. juli 2008 - 14:46 #26
Så skal den komme med 2 alerts, når siden loades.
Hvad siger de?
Avatar billede pitzen Nybegynder
30. juli 2008 - 14:52 #27
Desværre..

Er det mig der fucker up?

    <script type='text/javascript'>
    function resizeIFrame(o){
        o.style.height = o.contentWindow.document.getElementsByTagName('body')[0].offsetHeight + 'px';
        alert('contentWindow eksisterer: '+document.getElementById('cms_ifr').contentWindow);
        alert('contentWindow.document eksisterer: '+document.getElementById('cms_ifr').contentWindow.document);
        document.getElementById('cms_ifr').contentWindow.document.getElementsByTagName('body')[0].onkeyup=function(){parent.resizeIFrame(document.getElementById('cms_ifr'))};
    }
    </script>
    <script type='text/javascript'>
    window.onload = function(){
      adjustHeight(document.getElementById('left'),document.getElementById('right_edit'));
      resizeIFrame(document.getElementById('cms_ifr'));
    }
    function adjustHeight(o1,o2){
      var iPadding = 0;
      if(o1.offsetHeight > o2.offsetHeight){
        o2.style.height = (o1.offsetHeight) + 'px';
        o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +'px';
      }else{
        o1.style.height = (o2.offsetHeight) + 'px';
        o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + 'px';
      }
    }
    </script>
Avatar billede w13 Novice
30. juli 2008 - 14:54 #28
Ja, lidt. ;) Se 30/07-2008 14:05:19 hvad jeg lægger i window.onload-funktionen.

Det skal vist være:

    <script type='text/javascript'>
    function resizeIFrame(o){
        o.style.height = o.contentWindow.document.getElementsByTagName('body')[0].offsetHeight + 'px';
    }

    window.onload = function(){
      adjustHeight(document.getElementById('left'),document.getElementById('right_edit'));
      resizeIFrame(document.getElementById('cms_ifr'));
      alert('contentWindow eksisterer: '+document.getElementById('cms_ifr').contentWindow);
      alert('contentWindow.document eksisterer: '+document.getElementById('cms_ifr').contentWindow.document);
      document.getElementById('cms_ifr').contentWindow.document.getElementsByTagName('body')[0].onkeyup=function(){parent.resizeIFrame(document.getElementById('cms_ifr'))};
    }
    function adjustHeight(o1,o2){
      var iPadding = 0;
      if(o1.offsetHeight > o2.offsetHeight){
        o2.style.height = (o1.offsetHeight) + 'px';
        o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +'px';
      }else{
        o1.style.height = (o2.offsetHeight) + 'px';
        o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + 'px';
      }
    }
    </script>
Avatar billede w13 Novice
30. juli 2008 - 14:55 #29
Men så har du nok også testet onkeyup-tingen forkert. Prøv lige allerførst med:

    <script type='text/javascript'>
    function resizeIFrame(o){
        o.style.height = o.contentWindow.document.getElementsByTagName('body')[0].offsetHeight + 'px';
    }

    window.onload = function(){
      adjustHeight(document.getElementById('left'),document.getElementById('right_edit'));
      resizeIFrame(document.getElementById('cms_ifr'));
      document.getElementById("cms_ifr").onkeyup=function(){alert("onkeyup")};
    }
    function adjustHeight(o1,o2){
      var iPadding = 0;
      if(o1.offsetHeight > o2.offsetHeight){
        o2.style.height = (o1.offsetHeight) + 'px';
        o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +'px';
      }else{
        o1.style.height = (o2.offsetHeight) + 'px';
        o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + 'px';
      }
    }
    </script>
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:01 #30
tegnet ')' var ventet
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:03 #31
har fundet den fejl.

Nu kommer contentWindow.document er null eller ikke et objekt igen
Avatar billede w13 Novice
30. juli 2008 - 15:04 #32
Ja, linjen:

      document.getElementById('cms_ifr').contentWindow.document.getElementsByTagName('body')[0].onkeyup=function(){parent.resizeIFrame(document.getElementById('cms_ifr'))};

skal være:

      document.getElementById('cms_ifr').contentWindow.document.getElementsByTagName('body')[0].onkeyup=function(){parent.resizeIFrame(document.getElementById('cms_ifr')))};

Men du bør nok prøve den sidste først. Tror du afprøvede den forkert før. Hvis dén virker, er den langt bedre end den, du prøver nu.
Avatar billede w13 Novice
30. juli 2008 - 15:05 #33
Hmm.. Vi må debugge. Hvad siger den til:

alert(document.getElementById("cms_ifr"));

?

Og til:

alert(document.getElementById("cms_ifr").contentWindow);

Og:

alert(document.getElementById("cms_ifr").contentWindow.document);

Og:

alert(document.getElementById("cms_ifr").contentWindow.document.getElementsByTagName("body")[0]);
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:13 #34
den siger:
[object]
og

undefinied
og

contentWindow.document er null eller ikke et objekt igen
og

contentWindow.document er null eller ikke et objekt igen
Avatar billede w13 Novice
30. juli 2008 - 15:18 #35
Vis mig lige, hvor du skriver det. Altså hele JS-koden.
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:19 #36
<script type='text/javascript'>
    function resizeIFrame(o){
        o.style.height = o.contentWindow.document.getElementsByTagName('body')[0].offsetHeight + 'px';
    }

    window.onload = function(){
      adjustHeight(document.getElementById('left'),document.getElementById('right_edit'));
      alert(document.getElementById('cms_ifr').contentWindow.document.getElementsByTagName('body')[0]);
    }
    function adjustHeight(o1,o2){
      var iPadding = 0;
      if(o1.offsetHeight > o2.offsetHeight){
        o2.style.height = (o1.offsetHeight) + 'px';
        o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +'px';
      }else{
        o1.style.height = (o2.offsetHeight) + 'px';
        o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + 'px';
      }
    }
    </script>
Avatar billede w13 Novice
30. juli 2008 - 15:27 #37
Hm. Det forstår jeg ikke lige..
Avatar billede w13 Novice
30. juli 2008 - 15:30 #38
Hvad med:

<script type='text/javascript'>
    function resizeIFrame(o){
        o.style.height = o.contentWindow.document.getElementsByTagName('body')[0].offsetHeight + 'px';
    }

    window.onload = function(){
      adjustHeight(document.getElementById('left'),document.getElementById('right_edit'));
      document.getElementById("cms_ifr").onload=function(){
        alert(document.getElementById('cms_ifr').contentWindow.document.getElementsByTagName('body')[0]);
      }
    }
    function adjustHeight(o1,o2){
      var iPadding = 0;
      if(o1.offsetHeight > o2.offsetHeight){
        o2.style.height = (o1.offsetHeight) + 'px';
        o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +'px';
      }else{
        o1.style.height = (o2.offsetHeight) + 'px';
        o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + 'px';
      }
    }
    </script>
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:37 #39
Hverken fejl eller alert
Avatar billede w13 Novice
30. juli 2008 - 15:37 #40
Hmm. Så:

<script type='text/javascript'>
    function resizeIFrame(o){
        o.style.height = o.contentWindow.document.getElementsByTagName('body')[0].offsetHeight + 'px';
    }

    window.onload = function(){
      adjustHeight(document.getElementById('left'),document.getElementById('right_edit'));
      document.getElementById("cms_ifr").window.onload=function(){
        alert(document.getElementById('cms_ifr').contentWindow.document.getElementsByTagName('body')[0]);
      }
    }
    function adjustHeight(o1,o2){
      var iPadding = 0;
      if(o1.offsetHeight > o2.offsetHeight){
        o2.style.height = (o1.offsetHeight) + 'px';
        o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +'px';
      }else{
        o1.style.height = (o2.offsetHeight) + 'px';
        o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + 'px';
      }
    }
    </script>
Avatar billede w13 Novice
30. juli 2008 - 15:38 #41
Ellers er jeg blank. :)
Avatar billede w13 Novice
30. juli 2008 - 15:38 #42
Jeg har nemlig selv gjort det masser af gange. Men måske er der noget, der spiller ind i WYSIWYG-koden, som vi ikke har taget højde for..
Avatar billede w13 Novice
30. juli 2008 - 15:40 #43
Ah, nu ser jeg ordentligt efter i koden.

"cms_ifr" skal åbenbart være "cms_ifr_ifr". Ellers er det textareaet og ikke iframet, som vi har fat i. Det syntes jeg eller ikke, der stod før. Så det er forklaringen.
Avatar billede w13 Novice
30. juli 2008 - 15:40 #44
Så prøv:

    <script type='text/javascript'>
    function resizeIFrame(o){
        o.style.height = o.contentWindow.document.getElementsByTagName('body')[0].offsetHeight + 'px';
    }

    window.onload = function(){
      adjustHeight(document.getElementById('left'),document.getElementById('right_edit'));
      resizeIFrame(document.getElementById('cms_ifr_ifr'));
      document.getElementById("cms_ifr_ifr").onkeyup=function(){alert("onkeyup")};
    }
    function adjustHeight(o1,o2){
      var iPadding = 0;
      if(o1.offsetHeight > o2.offsetHeight){
        o2.style.height = (o1.offsetHeight) + 'px';
        o2.style.height = o1.offsetHeight - (o2.offsetHeight - o1.offsetHeight) +'px';
      }else{
        o1.style.height = (o2.offsetHeight) + 'px';
        o1.style.height = o2.offsetHeight - (o1.offsetHeight - o2.offsetHeight) + 'px';
      }
    }
    </script>
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:41 #45
contentWindow.document... er null eller ikke et objekt :/

Sikke noget ged.. Har du nogen ide til et alternativ?

Det er som sagt dette textfelt der bare skal fylde helt ud til kanterne:
http://86.58.155.197/luxweb/sites/temp1/index.php?id=1&edit=1
Avatar billede w13 Novice
30. juli 2008 - 15:43 #46
Nej, det er sådan her man gør det, hvis det skal virke i alle browsere, og det kan også sagtens komme til at virke, hvis vi fortsætter som nu. =)
Avatar billede w13 Novice
30. juli 2008 - 15:43 #47
Prøv lige at lægge JS-koden ud igen og sig til, når jeg kan se det.
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:46 #48
således
Avatar billede pitzen Nybegynder
30. juli 2008 - 15:54 #49
Jeg er desværre nødt til at smutte nu.
Men jeg siger 1000-tak for hjælpen for denne gang :)
Hvis du løser problemet, ser jeg frem til at høre fra dig!

Og du får naturligvis også pointne hermed
Avatar billede pitzen Nybegynder
31. juli 2008 - 09:35 #50
Godmorgen!

Jeg har måske fundet en løsning. Og det er en smule pinligt. Der følger en resize-løsning med til det WYSIWYG jeg benytter. Der er noget dokumentation her:
http://wiki.moxiecode.com/index.php/TinyMCE:Auto_resize_editor_box

Men det er heller ikke helt til at hitte ud af. Jeg får ihvertfald nogle fejl.

http://86.58.155.197/luxweb/sites/temp1/index.php?id=1&edit=1
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