Changing color when specific div is visible

Question

Please tell me how can I make this in the most right way.

HTML:

<div id="fixed-red" class="fixed-red"></div>
<div id="fixed-green" class="fixed-green"></div>
<div id="fixed-blue" class="fixed-blue"></div>
<div id="red" class="red"></div>
<div id="green" class="green"></div>
<div id="blue" class="blue"></div>

CSS:

html,body{
  height:100%;
}
.fixed-red,.fixed-green,.fixed-blue{
  width:30px;
  height:30px;
  position:fixed;
  top:10px;
  left:10px;
  background:#333;
}
.fixed-green{
  top:50px;
}
.fixed-blue{
  top:90px;
}
.red-active{
  background:#f00;
}
.green-active{
  background:#0f0;
}
.blue-active{
  background:#00f;
}
.red,.green,.blue{
  width:100%;
  height:100%;
}
.red{
  background:#900;
}
.green{
  background:#090;
}
.blue{
  background:#009;
}

I want to add/remove red/green/blue-active class to the fixed-red/green/blue divs when the user is on/off the red, green, or blue divs(when they are visible), so the small divs would be respectively highlighted with the color of the big, display divs when the user is on them.

Thanks!


Show source
| javascript   | jquery   | html   | css   2017-01-01 17:01 1 Answers

Answers ( 1 )

  1. 2017-01-01 17:01

    I had to tweak the code a little so the code could be more D.R.Y. The classes are now replaced by color class.

    $.fn.isInViewport = function() {
      var elementTop = $(this).offset().top;
      var elementBottom = elementTop + $(this).outerHeight();
    
      var viewportTop = $(window).scrollTop();
      var viewportBottom = viewportTop + $(window).height();
    
      return elementBottom > viewportTop && elementTop < viewportBottom;
    };
    
    $(window).on('resize scroll', function() {
      $('.color').each(function() {
          var activeColor = $(this).attr('id');
        if ($(this).isInViewport()) {
          $('#fixed-' + activeColor).addClass(activeColor + '-active');
        } else {
          $('#fixed-' + activeColor).removeClass(activeColor + '-active');
        }
      });
    });
    html,
    body {
      height: 100%;
    }
    
    .fixed-red,
    .fixed-green,
    .fixed-blue {
      width: 30px;
      height: 30px;
      position: fixed;
      top: 10px;
      left: 10px;
      background: #333;
    }
    
    .fixed-green {
      top: 50px;
    }
    
    .fixed-blue {
      top: 90px;
    }
    
    .red-active {
      background: #f00;
    }
    
    .green-active {
      background: #0f0;
    }
    
    .blue-active {
      background: #00f;
    }
    
    .color {
      width: 100%;
      height: 100%;
    }
    
    #red {
      background: #900;
    }
    
    #green {
      background: #090;
    }
    
    #blue {
      background: #009;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="fixed-red" class="fixed-red red-active"></div>
    <div id="fixed-green" class="fixed-green"></div>
    <div id="fixed-blue" class="fixed-blue"></div>
    <div id="red" class="color"></div>
    <div id="green" class="color"></div>
    <div id="blue" class="color"></div>

    Here is a working fiddle of that

    https://jsfiddle.net/BoyWithSilverWings/ds9x55z7/

◀ Go back