Search code examples
javascripthtmlcsstranslate

How can I change the x position of a div via javascript when I click on another div this way?


<body>
  <div id = "SiteContainer">        
    <div id = "NavigationButtons"></div>    
    <div id = "ShowReelContainer">
      <div id= "NavigationBackward" name = "back" onclick="setPosition();">x</div>
      <div id= "NavigationForward" name = "forward" onclick="setPosition();">y</div>    
      <div id = "VideoWrapper"> 
        <div id = "SlideShowItem">
          <img src="Images/A.png" alt="A"></img>                    
        </div>
        <div id = "SlideShowItem">
          <img src="Images/B.png" alt="B"></img>                    
        </div>
        <div id = "SlideShowItem">
          <img src="Images/C.png" alt="C" ></img>                   
        </div>              
      </div>
    </div>  
  </div>
  <script>
    var wrapper = document.querySelector("#VideoWrapper");

    function setPosition(e) 
    {
      if(e.target.name = "forward")
      {
        if!(wrapper.style.left = "-200%")
        {
          wrapper.style.left = wrapper.style.left - 100%;
        }   
      }
      else 
      {
        if(e.target.name = "back")
        {
          if!(wrapper.style.left = "0%")
          {
            wrapper.style.left = wrapper.style.left + 100%;
          } 
        }
      } 
    }
  </script>
</body>

Hi, I am very new to javascript. What I am trying to do, is change the x-position of a div when another div (NavigationForward or NavigationBackward) is clicked. However it does not appear to do anything at all. Basically if the div with name forward is clicked, I want to translate the VideoWrapper -100% from it's current position and +100% when "back". The css div itself VideoWrapper has a width of 300%. Inside this div as you can see is a SlideShowItem which is what will change. Perhaps I am adding and subtracting 100% the wrong way?

EDIT:

Thanks everyone for helping me out with this...I had just one more query, I am trying to hide the arrows based on whether the wrapper is at the first slide or the last slide. If its on the first slide, then I'd hide the left arrow div and if it's on the last, I'd hide the right arrow, otherwise display both of em. Ive tried several ways to achieve this, but none of em work, so Ive resorted to using copies of variables from the function that works. Even then it does not work. It appears that my if and else if statements always evaluate to false, so perhaps I am not retrieving the position properly?

function HideArrows()
{
    var wrapper2 = document.getElementById("VideoWrapper");

    var offset_x2 = wrapper2.style.left;

    if(parseInt(offset_x2,10) == max_x)
    {
        document.getElementById("NavigationForward").display = 'none';
    }

    else if(parseInt(offset_x2,10) == min_x)
    {
        document.getElementById("NavigationBackward").display = 'none';
    }

    else 
    {
        document.getElementById("NavigationForward").display = 'inline-block';
        document.getElementById("NavigationBackward").display = 'inline-block';
    }
}

//html is the same except that I added a mouseover = "HideArrows();"

<div id = "ShowReelContainer" onmouseover="HideArrows();">

Solution

  • To achieve this type o slider functionality your div VideoWrapper must have overflow:hidden style, and your SlideShowItemdivs must have a position:relative style.

    Then to move the slides forward or backward you can use the style left which allows you to move the divs SlideShowItem relative to it's parent VideoWrapper.

    I've tested this here on JSFiddle.

    It seems to work as you described in your question, although you may need to do some adjustments, like defining the width of your slides, how many they are and so on.

    For the sake of simplicity, I defined them as "constants" on the top of the code, but I think you can work from that point on.

    CSS

    #VideoWrapper{
        position:relative; height:100px; white-space:nowrap;width:500px;
        margin-left:0px; border:1px solid #000; overflow:hidden;  }
    
    .SlideShowItem{
        width:500px; height:100px;display:inline-block;position:relative; }
    
    #NavigationForward, #NavigationBackward{
        cursor:pointer;float:left; background-color:silver;margin-right:5px; 
        margin-bottom:10px; text-align:center; padding:10px; }
    

    HTML

    <div id = "SiteContainer">  
    
        <div id = "NavigationButtons">
        </div>  
    
        <div id = "ShowReelContainer">
    
                <div id= "NavigationBackward" name = "back" onclick="setPosition('back');">prev</div>
                <div id= "NavigationForward" name = "forward" onclick="setPosition('forward');">next</div>
                <div style="clear:both;"></div>
    
            <div id = "VideoWrapper">
    
                <div class= "SlideShowItem" style="background-color:blue;">    
                    Slide 1
                </div>
    
                <div class = "SlideShowItem" style="background-color:yellow;">
                    Slide 2
                </div>
    
                <div class = "SlideShowItem" style="background-color:pink;">
                    Slide 3
                </div>              
    
            </div>
        </div>
    </div>
    

    JavaScript

    var unit = 'px'; var margin = 4; var itemSize = 500 + margin; var itemCount = 3; var min_x = 0; var max_x = -(itemCount-1) * itemSize;
    
    function setPosition(e)  {
        var wrapper = document.getElementById("VideoWrapper");
        var slides = wrapper.getElementsByTagName('div');
        var offset_x = slides[0].style.left.replace(unit, '');
        var curr_x = parseInt(offset_x.length == 0 ? 0 : offset_x);
    
        if(e == "forward")
        {
           if(curr_x <= max_x)
                return;
    
            for(var i=0; i<slides.length; i++)
                slides[i].style.left= (curr_x + -itemSize) + unit;
        }
        else if(e == "back")
        {
            if(curr_x >= min_x)
                return;
    
            for(var i=0; i<slides.length; i++)
                slides[i].style.left= (curr_x + itemSize) + unit;  
        } }
    

    After you analyze and test the code, I don't really know what's your purpose with this, I mean, you maybe just playing around or trying to develop something for a personal project, but if you are looking for something more professional avoid to create things like sliders on your own, as there are tons of plugins like this available and well tested out there on the web.

    Consider using jQuery with NivoSlider, it works like a charm and is cross browser.