2012-08-30 2 views
3

Я использую Zepto.js в текущем проекте. Zepto не поддерживает метод scrollTop(), который имеет в нем jQuery.Расширить Zepto.js с помощью метода jQuery? scrollTop()

Возможно ли продлить Zepto для работы с scrollTop()?

Обновление: Все, что я хочу, это создать мою собственную небольшую и простую «анимированную прокрутку», как я уже использовал с jQuery. См. Рабочий пример here. Однако я не знаю, как сделать эту работу без функции scrollTop(), доступной в Zepto.js.

ответ

4

не хотят стали никому работы, так вот короткий ответ Porting from jQuery to Zepto

+1

также здесь еще один (https://github.com/suprMax/ZeptoScroll) хотя он не работает с Firefox, но вы можете его улучшить. – rainykeys

+1

также работают над ним разработчики Zepto https: // github.com/madrobby/zepto/issues/392 – rainykeys

1

Использование DOM родной scrollTop свойство:

$ ('# эль') [0] .scrollTop = 0;

+0

хм, спасибо. Однако я понятия не имею, как это сделать. Проверьте это ... http://jsfiddle.net/DVDLM/ ... это функция jQuery, которую я создал. Однако в моем текущем проекте я работаю с Zepto, а не с jQuery. Смотрите это http://jsfiddle.net/DVDLM/1/, где я только изменил структуру на Zepto. Любая идея, как заставить эту функцию работать с Zepto? – matt

+0

Вы имеете в виду, что можно использовать window.scrollTo (xpos, ypos) ... но он не будет анимироваться :(... –

6

scrollTop не является анимируемым с использованием метода .animate зепто, так как она использует CSS переходы.

попробовать что-то вроде этого: http://jsfiddle.net/DVDLM/5/

function scroll(scrollTo, time) { 
    var scrollFrom = parseInt(document.body.scrollTop), 
     i = 0, 
     runEvery = 5; // run every 5ms 

    scrollTo = parseInt(scrollTo); 
    time /= runEvery; 

    var interval = setInterval(function() { 
     i++; 

     document.body.scrollTop = (scrollTo - scrollFrom)/time * i + scrollFrom; 

     if (i >= time) { 
      clearInterval(interval); 
     } 
    }, runEvery); 
} 

$('#trigger').click(function() { 
    scroll('600px', 500); 
}); 

EDIT: Я добавил runEvery переменную, которая определяет, как часто интервал должен быть побежал. Чем ниже это, тем плавнее будет анимация, но это может повлиять на производительность.

EDIT2: Я думаю, что неправильно понял вопрос. Вот ответ на новый вопрос:

$.zepto.scrollTop = function (pixels) { 
    this[0].scrollTop = pixels; 
}; 
0

Ответ прост, Zepto доза не использовать стиль тайм-аут анимации, он использует CSS3, так что здесь основной реализацию функции прокрутки:

HTML: Animated Scroll Здравствуйте Вы

CSS: #page {высота: 5000px; позиция: относительная; } #element {position: absolute; топ: 600px}

JS:

function scroll(selector, animate, viewOffset) { 
    $('body').scrollToBottom (600, '800'); 
} 

$('#trigger').click(function(e) { 
    e.preventDefault(); 
    scroll($('#element'), true, 30); 
}); 
$.fn.scrollToBottom = function(scrollHeight ,duration) { 
    var $el = this; 
    var el = $el[0]; 
    var startPosition = el.scrollTop; 
    var delta = scrollHeight - startPosition; 

    var startTime = Date.now(); 

    function scroll() { 
     var fraction = Math.min(1, (Date.now() - startTime)/duration); 

     el.scrollTop = delta * fraction + startPosition; 

     if(fraction < 1) { 
      setTimeout(scroll, 10); 
     } 
    } 
    scroll(); 
}; 
​ 
1
(function ($) { 

    ['width', 'height'].forEach(function(dimension) { 
     var offset, Dimension = dimension.replace(/./, function(m) { return m[0].toUpperCase() }); 
     $.fn['outer' + Dimension] = function(margin) { 
      var elem = this; 
      if (elem) { 
       var size = elem[dimension](); 
       var sides = {'width': ['left', 'right'], 'height': ['top', 'bottom']}; 
       sides[dimension].forEach(function(side) { 
        if (margin) size += parseInt(elem.css('margin-' + side), 10); 
       }); 
       return size; 
      } 
      else { 
       return null; 
      } 
     }; 
    }); 

    ["Left", "Top"].forEach(function(name, i) { 
     var method = "scroll" + name; 

     function isWindow(obj) { 
      return obj && typeof obj === "object" && "setInterval" in obj; 
     } 

     function getWindow(elem) { 
      return isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false; 
     } 

     $.fn[method] = function(val) { 
      var elem, win; 
      if (val === undefined) { 
       elem = this[0]; 
       if (!elem) { 
        return null; 
       } 
       win = getWindow(elem); 
       // Return the scroll offset 
       return win ? ("pageXOffset" in win) ? win[i ? "pageYOffset" : "pageXOffset"] : 
        win.document.documentElement[method] || 
        win.document.body[method] : 
        elem[method]; 
      } 

      // Set the scroll offset 
      this.each(function() { 
       win = getWindow(this); 
       if (win) { 
        var xCoord = !i ? val : $(win).scrollLeft(); 
        var yCoord = i ? val : $(win).scrollTop(); 
        win.scrollTo(xCoord, yCoord); 
       } 
       else { 
        this[method] = val; 
       } 
      }); 
     } 
    }); 

})(Zepto); 
0

Обратите внимание, что версия 1.0 Zeptos теперь поддерживает scrollTop(). См. Документация: http://zeptojs.com/#scrollTop

+0

scrollTo()! = scrollTop(). – gnou

+0

@mrgnou yep, ваше право. Я хотел сказать «scrollTop()». Я правильно связал с правой функцией, но в комментарии оставил «p». – MountainAsh

 Смежные вопросы

  • Нет связанных вопросов^_^