Подтвердить что ты не робот

Слайк анимация при движении по центру

Я использую slick, чтобы сделать карусель следующим образом:

введите описание изображения здесь

Я использовал эти настройки:

{
    dots: false,
    slidesToShow: 3,
    focusOnSelect: true,
    swipeToSlide: true,
    centerMode: true,
    event: {
        init: scope.init
    }
}

Это похоже на то, что реальная анимация работает нормально. Следующая часть (которая вызывает у меня проблемы) пытается получить " точка" и текст для анимации по размеру цвета. Кто-нибудь знает, как я могу это сделать? Я пытаюсь использовать метод салфетки, но проблема заключается в том, что это элемент, ближайший к центру, когда я прокручиваю.

Любая помощь будет принята с благодарностью.


Update

Так что мне удалось сделать часть этого. Я добавил обратный вызов init к параметрам и добавил некоторый код для определения положения элемента центра и его размера.

// Extend our scope
angular.extend(scope, {
    init: function (e, slick) {

        // Get our dragable element
        var sizes = scope.options.sizes,
            draggableElement = element[0].getElementsByClassName('draggable')[0],
            centerElement = draggableElement.getElementsByClassName('slick-center')[0].childNodes[0];

        // Set the active dimensions and margins
        centerElement.style.width = sizes.finish + 'px';
        centerElement.style.height = sizes.finish + 'px';
        centerElement.style.borderRadius = sizes.finish / 2 + 'px';
        centerElement.style.marginTop = '0';
        centerElement.style.marginBottom = '0';

        slick.$list.on('touchmove.slick mousemove.slick', function () {
            _resizePoint(slick, this, sizes);
        });
    }
});

// Extend our options
angular.extend(scope.options, {
    event: {
        init: scope.init
    },
    sizes: {
        start: 18,
        finish: 50
    }
});


// Resizes the point
var _resizePoint = function (slick, container, sizes) {

    // Get our actual Width
    var containerPadding = parseInt(container.style.paddingLeft),
        containerWidth = container.offsetWidth - containerPadding * 2;

    // If we have a swipe left
    if (slick.swipeLeft) {

        // Get our slide index
        var center = containerWidth / 2,
            left = -slick.swipeLeft > 0 ? -slick.swipeLeft : slick.swipeLeft,
            distance = left + center,
            index = Math.floor(distance / slick.slideWidth);

        // Get the active element
        var activeElement = container.childNodes[0].childNodes[index].childNodes[0];

        // Get our start point
        var half = slick.slideWidth / 2,
            start = center - half,
            position = (index * slick.slideWidth) - left;

        // Get our dimensions 
        var startDimension = sizes.start,
            finishDimension = sizes.finish,
            startMargin = (finishDimension - startDimension) / 2

        // Get the percentage in relation to the center
        var percent = (center - position) / half,
            directionalPercent = position > start ? percent : 2 - percent,
            dimension = startMargin + ((finishDimension - startMargin) * directionalPercent),
            marginPercent = 1 - directionalPercent,
            margin = startMargin * marginPercent;

        // Apply our sizes to our element
        activeElement.style.width = dimension + 'px';
        activeElement.style.height = dimension + 'px';
        activeElement.style.borderRadius = dimension / 2 + 'px';
        activeElement.style.marginTop = margin + 'px';
        activeElement.style.marginBottom = margin + 'px';
    }
};

Это работает при перетаскивании, но когда focusOnSelect истинно, щелкните элемент, не изменяя его размер. Также использование навигационных стрелок не работает, и, наконец, когда вы отпускаете перетаскивание, когда он перемещается в центр, это также не изменяется.

Я надеялся переопределить метод animateSlide, чтобы вставить мой код, но мой код работает с текущей позицией, и я не думаю, что это будет работать с animateSlide.

Теперь я добавил щедрость, потому что, полагаю, кто-то может мне помочь.

Обновление 2

Я создал код, чтобы проиллюстрировать мою проблему.

http://codepen.io/r3plica/pen/vKPyxE?editors=1010

Если вы перетащите влево или вправо, вы увидите, что "точка" увеличивается и уменьшается в размере. Но если вы нажмете любую точку, она просто движется прямо туда, не изменяя размер.

Я надеюсь, что это объяснит мою проблему:)

4b9b3361

Ответ 1

Отметьте это демо-версия codepane

Здесь я внесли изменения в файл CSS и JS файл

В файле CSS я добавил свойства CSS для анимации и увеличил круг на текущем слайде.

.slick-slider .slick-slide .slider-point
{
  transition:  1s ease-in;
}

И в JS файле я удалил часть вашего кода и добавил обратный вызов слайков на основе раздела Event в документации

angular.module('slick', ['slickCarousel']).controller('MainController', function() {
    var self = this;
    self.items = [1, 2, 3, 4, 5];
}).directive('pkSlider', ['$timeout', function($timeout){
return {
    restrict: 'A',

    scope: {
        items: '=pkSlider',
        options: '='
    },

    templateUrl: 'assets/templates/pk-slider.html',

    link: function(scope, element){

        $timeout(function(){
            // Extend our options
            angular.extend(scope.options, {
                event: {
                // init: scope.init,
                init: function(event, slick){
                    // let do this after we init the banner slider
                    sizes=slick.options.sizes;
                    var margin=(sizes.finish-sizes.start)/2;
                    $(slick.$slides[slick.initials.currentSlide]).find('.slider-point').css({
                        width: sizes.finish + 'px',
                        height: sizes.finish + 'px',
                        borderRadius: sizes.finish / 2 + 'px',
                        marginTop: '0',
                        marginBottom: '0'
                    });    
                },
                beforeChange: function(event, slick, currentSlide, nextSlide){

                    sizes=slick.options.sizes;

                    var margin=(sizes.finish-sizes.start)/2;

                    $(slick.$slides[currentSlide]).find('.slider-point').css({
                        width: sizes.start + 'px',
                        height: sizes.start + 'px',
                        borderRadius: sizes.start / 2 + 'px',
                        marginTop: margin+'px',
                        marginBottom: margin+'px'
                    });

                    $(slick.$slides[nextSlide]).find('.slider-point').css({
                        width: sizes.finish + 'px',
                        height: sizes.finish + 'px',
                        borderRadius: sizes.finish / 2 + 'px',
                        marginTop: '0',
                        marginBottom: '0'
                    })
                }
            },
            sizes: {
            start: 18,
            finish: 50
            }
        });
    });
}};
}]);

Ответ 2

Вы можете использовать CSS3 scale() для того, чтобы увеличить размер пузыря до того, насколько велика вы его хотите (применяя стиль непосредственно к классу .slick-center, конечно):

.slick-slide.slick-center .slider-point {
  -webkit-transform: scale( 2.5 );
     -moz-transform: scale( 2.5 );
       -o-transform: scale( 2.5 );
      -ms-transform: scale( 2.5 );
          transform: scale( 2.5 );
}

Демо: http://codepen.io/andresilich/pen/jAREmO