Hello,

I am in fly-by mode as I am still more than busy, so I just dumb this
one out for anyone interested. Adapt it for your needs if you like it.

This effect is similar to ScrollTo, but scrolls the viewport
vertically the minimal amount necessary to bring the element into
view.

Usage:  new Effect.ScrollToFullView(element, {duration: 0.6, offset: 10});

Offset is the distance in pixel to the upper/lower viewport border.
You need to define window.isIE as true/false somewhere prior or change the code.

// Nur sowenig wie möglich scrollen, bis das Element sichtbar ist.
Effect.ScrollToFullView = Class.create();
Object.extend(Object.extend(Effect.ScrollToFullView.prototype,
Effect.ScrollTo.prototype), {
  setup: function() {
    Position.prepare();
    this.scrollStart = Position.deltaY;
    var offsets = Position.cumulativeOffset(this.element);
    var rand = 0;
    if(this.options.offset) rand = this.options.offset;

    var element_kante_oben = offsets[1];
    var element_hoehe = this.element.offsetHeight;

    // Länge und Position des dargestellten Ausschnitts relativ zum
gesamten Dokument
    var screen_bottom, screen_height, screen_scrolled;
    if (isIE){
      screen_height = document.documentElement.clientHeight;
      screen_scrolled = document.documentElement.scrollTop;
    } else {
      screen_height = window.innerHeight;
      screen_scrolled = window.pageYOffset;
    }
    screen_bottom = screen_scrolled + screen_height;

    // Obere Kante des Elements sichtbar und Position des Elements +
seine Höhe < screen_bottom
    // => Element wird schon komplett dargestellt
    if (element_kante_oben > screen_scrolled && element_kante_oben +
element_hoehe + rand < screen_bottom ) {
      this.delta = 0;
      return;
    }

    var new_top;
    // Wenn Element höher als Bildschirmhöhe, dann bis zur oberen
Kante des Elements scrollen
    if (element_hoehe + rand > screen_height) {
      new_top = element_kante_oben - rand;
    } else {
      // Muß nach oben gescrollt werden?
      if (element_kante_oben < screen_scrolled) {
        // nach oben scrollen
        new_top = element_kante_oben - rand;
      } else {
        // nach unten scrollen
        new_top = element_kante_oben + element_hoehe + rand - screen_height;
      }
    }

    var max = !isIE
      ? window.height - screen_height
      : document.body.scrollHeight - screen_height;
    this.delta  = (new_top > max ? max : new_top) - this.scrollStart;
  }
});
_______________________________________________
Rails-spinoffs mailing list
Rails-spinoffs@lists.rubyonrails.org
http://lists.rubyonrails.org/mailman/listinfo/rails-spinoffs

Reply via email to