Kan javascript "förstöra" CSS-positionering?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Aureola
    Medlem
    • 2010-10-28
    • 27

    #1

    Kan javascript "förstöra" CSS-positionering?

    Hej!
    Jag har just lusläst http://alistapart.com/article/css-positioning-101 om positionering för jag vill så gärna förstå detta - eftersom jag åter har problem med sidan. Och med det som facit så har jag inte gjort något fel.

    Innan jag la in en div med ett bildspelsskript i så såg sidan ut som den skulle, Header-div med en statisk bild i (100% vidd och bredd), därunder en navigationsbar med fast höjd men 100% vidd, därunder diven MainContent. Samtliga element (i stort sett) är angivna med % och inte fasta pixelvärden och alla mina div:ar på sidan har position= relative. Detta fungerade problemfritt ända tills jag bytte ut den statiska bilden i Header-diven mot ett javaskript-bildspel, och då plötsligt hamnar bildspelet ovanpå de andra divarna (dvs täcker över dem så att de inte syns. Anledningen till att jag vet att de är där är att då bilderna fade'ar så ser man de andra divarna med innehåll). Jag förstår inte hur det kan bli såhär? (särskilt då samma bildspel-skript fungerar utmärkt på en annan sida jag gjort.)



    Här är lite pseudokod på problemområdet:
    Div Container
    Div Header
    Div rotating-image-wrapper
    roterande-bilder1.jpg klass=AbsolutPositioneradKlass
    roterande-bilder2.jpg klass=AbsolutPositioneradKlass
    roterande-bilder3.jpg klass=AbsolutPositioneradKlass
    /div rotating-image-wrapper
    /div Header
    /div Container

    Divarna Container, Header och Roterande-bildspel är relativt positionerade. Deras vidder är angivna i % och har Floateft; de har även clear: both i samtliga div'ar i CSSn.

    Jag hoppas så att någon kan hjälpa mig för jag har suttit fast med detta i ett dygn nu....
  • Aureola
    Medlem
    • 2010-10-28
    • 27

    #2
    Äsch, kan lika gärna lägga in koden på riktigt..

    kanske är det något jag missat som är av betydelse.

    CSSn:
    [kod]
    #header {
    clear: both;
    float: left;
    margin-left: 0;
    width: 100%;
    display: block;
    padding-top:0px;
    }
    /* Rotating images */
    #rotating-item-wrapper {
    position: relative;
    width:100%;
    height:100%;
    }

    .rotating-item {
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    }
    /* End rotating images */
    [/kod]
    HTML:
    [kod]
    <div id="header">
    <div id="rotating-item-wrapper">
    <img src="images/slideshow/bildspel1.jpg" class="rotating-item" width="100%" />
    <img src="images/slideshow/bildspel2.jpg" class="rotating-item" width="100%" />
    <img src="images/slideshow/bildspel3.jpg" class="rotating-item" width="100%" />
    </div>
    </div><!--End header-->[/kod]
    Last edited by voigtann1; 2013-09-26, 09:10. Reason: Lagt in kod-block

    Comment

    • voigtann1
      Forumvärd
      • 2001-06-14
      • 8810

      #3
      Du saknar någon höjd i ditt element, absolut position flyttar bort elementet ifrån det lager där den skulle renderas ut så #header bli aldrig större än vad du har antingen angett eller har innehåll som trycker ner den.
      "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

      Comment

      • nitro2k01
        Forumvärd
        • 2003-08-26
        • 7630

        #4
        JS har ju fritt spelrum att ändra vad det vill, inklusive CSS-attribut. Det vore högst relevant att se hur slideshow-skriptet ser ut också. Troligtvis pillar skriptet på attributet z-index för att lägga en bild på en annan.
        Jag vet inte om de kommer funkar som fix, men prova att sätta att sätta z-index:-1; (eller annat negativt värde) i klasen rotating-item-wrapper. Och som sagt, koden tack!
        Gameboy Genius - Foto: Gatukonst och elektronikporr
        Internklippning:
        1) Snaggning av fångar.
        2) Klippning frisörer emellan.

        Comment

        • Aureola
          Medlem
          • 2010-10-28
          • 27

          #5
          Ah, så jag måste absolut-positionera header-diven? Eftersom den statiska bilden tryckte ut den till rätt storlek men det gör inte de rörliga bilderna?

          I länken jag refererar till ovan så står det inget om denna bortflyttande förmåga Det hade hen missat att skriva. I ett exempel på sidan (exempel F) så lägger han absolut-positionerade orange'a kvadrater inut de element han jobbat med i tidigare exempel - och japp - de är absolut-positionerade de också. Men det nämns inget om det i texten. Kass. Så man kan alltså inte lägga absolut-pos. element inuti relativt-positionerade, eller, då upphör det relativt positionerade elementets koordinatsystem att fungera. Är det rätt uppfattat?
          Nu ska jag testa att ändra i koden, hoppas-hoppas att det ska funka. Återkommer.

          Comment

          • Aureola
            Medlem
            • 2010-10-28
            • 27

            #6
            Javaskriptet förstår jag inte fullt ut, men till viss del. Jag använder det på en annan sida, och där fungerar det fint. Men nåväl, här är skriptet:
            [kod]
            $(window).load(function() { //start after HTML, images have loaded

            var InfiniteRotator =
            {
            init: function()
            {
            //initial fade-in time (in milliseconds)
            var initialFadeIn = 1000;

            //interval between items (in milliseconds)
            var itemInterval = 5000;

            //cross-fade time (in milliseconds)
            var fadeTime = 2500;

            //count number of items
            var numberOfItems = $('.rotating-item').length;

            //set current item
            var currentItem = 0;

            //show first item
            $('.rotating-item').eq(currentItem).fadeIn(initialFadeIn);

            //loop through the items
            var infiniteLoop = setInterval(function(){
            $('.rotating-item').eq(currentItem).fadeOut(fadeTime);

            if(currentItem == numberOfItems -1){
            currentItem = 0;
            }else{
            currentItem++;
            }
            $('.rotating-item').eq(currentItem).fadeIn(fadeTime);

            }, itemInterval);
            }
            };

            InfiniteRotator.init();

            });[/kod]
            Last edited by voigtann1; 2013-09-26, 09:11. Reason: lagt in [kod]-block

            Comment

            • voigtann1
              Forumvärd
              • 2001-06-14
              • 8810

              #7
              du behöver sätta höjjden på din #rotating-item-wrapper som är samma höjd som .rotating-item (den som bli synlig) något i denna stil:

              [kod]$(window).load(function() { //start after HTML, images have loaded

              var InfiniteRotator = {
              init: function() {
              //initial fade-in time (in milliseconds)
              var initialFadeIn = 1000;

              //interval between items (in milliseconds)
              var itemInterval = 5000;

              //cross-fade time (in milliseconds)
              var fadeTime = 2500;

              //count number of items
              var numberOfItems = $('.rotating-item').length;

              //set current item
              var currentItem = 0;

              //show first item
              var item = $('.rotating-item').eq(currentItem).fadeIn(initialFadeIn);

              // Container
              var container = item.closest('#rotating-item-wrapper');


              container.height(item.height());

              //loop through the items
              var infiniteLoop = setInterval(function(){
              $('.rotating-item').eq(currentItem).fadeOut(fadeTime);

              if(currentItem == numberOfItems -1){
              currentItem = 0;
              }else{
              currentItem++;
              }
              item = $('.rotating-item').eq(currentItem).fadeIn(fadeTime);
              container.height(item.height());
              }, itemInterval);
              }
              };
              InfiniteRotator.init();
              });[/kod] kanske hjälper dig
              "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

              Comment

              • Aureola
                Medlem
                • 2010-10-28
                • 27

                #8
                Jag kanske är jättedum nu, kanske ser jag inte skogen för alla träd, men - måste jag ändra ALLA divar till absolute för att det ska fungera? Det är typ jättemånga. (ca 24-30 st, pga alla olika medieformat...)

                Sen sa jag inte att den enda div'en som klarar sig är min navbar-ribbon; den med en bestämd höjd (40px) - den lägger sig ovanpå bildspelet, högst upp. Kan det vara så att innehållet i divarna måste ha fasta värden i pixlar, och inte %, för att det ska fungera?

                Tack snälla för att ni hjälper mig!
                Last edited by Aureola; 2013-09-26, 09:16. Reason: Edit: Jag såg inte det sista inlägget när jag skrev detta, återkommer

                Comment

                • Aureola
                  Medlem
                  • 2010-10-28
                  • 27

                  #9
                  Ska jag in och ändra i js? Men den fungerar ju som den är på min andra sida Jag är inte helt med på var jag ser någon fast höjd i js, kan du peka ut raden du ändrat på..?

                  Den enda skillnaden mellan den fungerande webbsidan och denna är att på den fungerande så har bildspelet vidd och höjd angivet i pixlar, och på denna sida är det 100%. Men jag vill inte ange fasta värden, då blir ju inte sidan skalbar (och det är ett krav att den ska vara det)...... Hur gör man då..?


                  Edit: Testade att ändra i CSS'en på wrappern till fasta värden, men det hjälpte inte. Diven envisas likförb*t att lägga sig ovanpå. gahhh

                  Comment

                  • voigtann1
                    Forumvärd
                    • 2001-06-14
                    • 8810

                    #10
                    Du bör ju bara använda absolut positionering där det behövs....

                    Hur position fungera är att om du har default (static) så kommer den fylla ut den ytan som elementet tar i "lagret".

                    Position relative sätter ut sin yta där den borde vara som du kan "offset:ar" med top, left, bottom osv.

                    Position absolut "lyfter" ut hela boxen ifrån det aktuella lagret och inte ta fyller ut den ytan som den borde ha renderats ut på.

                    Jag tror det enklaste är att du skapar ett nytt projekt och leker runt med position och se hur resultatet ser ut innan du försöker lyfta in det i ett aktuellt projekt.
                    "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

                    Comment

                    • Aureola
                      Medlem
                      • 2010-10-28
                      • 27

                      #11
                      Jo jag har ju läst på ordentligt om positionering (han förklarar jättebra i länken jag la upp i första inlägget) och enligt den så har jag inte gjort något fel. Jag ser inte hur jag skulle göra annorlunda om jag gör om projektet igen (plus tidsbrist, måste bli klar idag med denna layout för att hinna med i min tidplan...)

                      Comment

                      • voigtann1
                        Forumvärd
                        • 2001-06-14
                        • 8810

                        #12
                        Nu postar du förmodligen inte allt HTML eller CSS men:
                        [kod]#header {
                        clear: both;
                        float: left;
                        margin-left: 0;
                        width: 100%;
                        display: block;
                        padding-top:0px;
                        }[/kod]div är ett block element, bredden behöver du inte, float behöver du inte heller, marginal och padding behöver du inte heller (om du inte ha något annat som skriver över det i någon annan CSS), kommer dock inte hjälpa dig med ditt problem då du måste sätta en höjd för att trycka ner boxen för den har ingen höjd
                        "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

                        Comment

                        • Aureola
                          Medlem
                          • 2010-10-28
                          • 27

                          #13
                          Tack för svar, ska se om jag kan rensa upp lite.

                          Hur som helst, så har jag kommit framåt LITE nu i alla fall, jag har förstått vad jag måste göra för att få det att funka.

                          1. Jag satte en höjd i pixlar på Header-diven
                          2. Ändrade tillbaks position till först relative och sen statisk (tog bort den helt)

                          Då först tog Header-diven sin plats och tryckte ner de nästföljande div:arna.
                          Problemet jag har nu som jag måste fundera på är hur jag ska lösa detta för att få det att funka så att det blir flytande; dvs det måste fungera i olika medieformat....
                          Det blir nästa huvudvärk.

                          Comment

                          • Aureola
                            Medlem
                            • 2010-10-28
                            • 27

                            #14
                            Jag tror jag precis fann vad jag behövde här:
                            ResponsiveSlides.js is a tiny jQuery plugin that automatically creates responsive slider using images inside a container.


                            Comment

                            Working...