From 81a14d573241d9a077f92d61e8804392e410682d Mon Sep 17 00:00:00 2001 From: baymer Date: Mon, 29 Sep 2014 13:18:37 +0400 Subject: [PATCH] Create b-slider_align_center.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Позволяет центрировать активный элимент. https://yadi.sk/i/t0cYMTbvbiVVm https://yadi.sk/i/rzbk4IVYbiVcL https://yadi.sk/i/y37H2FD8biVe3 --- .../b-slider/_align/b-slider_align_center.js | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 blocks-touch/b-slider/_align/b-slider_align_center.js diff --git a/blocks-touch/b-slider/_align/b-slider_align_center.js b/blocks-touch/b-slider/_align/b-slider_align_center.js new file mode 100644 index 00000000..ca1c9d67 --- /dev/null +++ b/blocks-touch/b-slider/_align/b-slider_align_center.js @@ -0,0 +1,76 @@ +/** + * Слайдер + * + * Центрует слайдер, чтобы активная рубрика была по середине. + * + */ +BEM.DOM.decl({ block: 'b-slider', modName: 'align', modVal: 'center' }, { + + onSetMod: { + + js: { + inited: function() { + 'use strict'; + + var self = this; + + self.__base.apply(self, arguments); + + // прячем this в замыкание + self._correctToCenter = self._correctToCenter.bind(self); + + // небольшая задержка, чтобы дать блоку дорисоваться + // для дальнейших расчетов позиционирования + setTimeout(self._correctToCenter, 1000); + + // при смене ориентации скорректировать по центру + BEM.DOM.win.bind('orientchange', self._correctToCenter); + + } + } + + }, + + destruct: function() { + 'use strict'; + + var self = this; + + self.__base.apply(self, arguments); + + BEM.DOM.win.unbind('orientchange', self._correctToCenter); + }, + + /* + * Корректируем слайдер по центру + */ + _correctToCenter: function() { + 'use strict'; + + // минимальный сдвиг + var self = this, + active_item = self.findElem('active-item'); + + if (!active_item.length) { + return; + } + + self._calcParams(); + + var minX = 0, + + // максимальный сдвиг + maxX = self._width - self._parentWidth, + + // складываем текущее смещение активного элемента и половину его высоты + x = active_item.offset().left + active_item.outerWidth()/2 + // и вычитаем половину ширины родителя и текущее смещение слайдера + - self._parentWidth/2 - self._currentX; + + // если maxX < 0, значит родитель больше слайдера и корректировка не нужна + if ( x > minX && maxX > 0) { + self._currentX = -((x < maxX) ? x : maxX); + self._correct(); + } + } +});