Плавающий виджет/баннер с использованием прототипа JS

Я создал скрипт, используя оригиналы из jQuery: http://terkel.jp/demo/jquery-floating-widget-plugin.html

Но при вводе прототипа JS он не работает должным образом. Он строго неправильно считает верхнюю и нижнюю высоту.

есть идеи? Я прикрепил свой код и ссылку для просмотра активного скрипта.

Проблема в сети: http://1.delnik20.cz/

Опытный образец:

document.observe('dom:loaded', function() {
    Element.addMethods({
        floatingWidget: function(el, classes) {
            var $this       = $(el),
            $parent         = $this.getOffsetParent(),
            $window         = $(window),
            top             = $this.positionedOffset().top - parseFloat($this.getStyle('marginTop').replace(/auto/, 0)),
            bottom          = $parent.positionedOffset().top + $parent.getHeight() - $this.getHeight();

            if ($parent.getHeight() > $this.getHeight()) {
                Event.observe($window, 'scroll', function (e) {
                    var y = document.viewport.getScrollOffsets().top;
                    if (y > top) {
                        $this.addClassName(classes.floatingClass);
                        if (y > bottom) {
                            $this.removeClassName(classes.floatingClass).addClassName(classes.pinnedBottomClass);
                        } else {
                            $this.removeClassName(classes.pinnedBottomClass);
                        }
                    } else {
                        $this.removeClassName(classes.floatingClass);
                    }
                });
            }
            return el;
        }
    });

    $('floating-widget').floatingWidget({
        floatingClass: 'floating',
        pinnedBottomClass: 'pinned-bottom'
    });
});

person PTiCA    schedule 29.08.2012    source источник


Ответы (1)


Prototypejs, эквивалентный offset() в jQuery, равен cumulativeOffset(), эквивалентом outerHeight() является measure('margin-box-height') (который можно оптимизировать с помощью объекта Element.Layout). Таким образом, ваш код должен выглядеть так:

floatingWidget: function(el, classes) {
    var $this        = $(el),
        $parent      = $this.getOffsetParent(),
        $window      = $(window),
        top          = $this.cumulativeOffset().top - $this.measure('margin-top'),
        bottom       = $parent.cumulativeOffset().top + $parent.getHeight() - $this.measure('margin-box-height');

if ($parent.getHeight() > $this.measure('margin-box-height')) {
...
person yethie    schedule 30.08.2012