这是一个小提琴。 http://jsfiddle.net/p31L86wg/4/

理想情况下,绿色框应始终位于容器的中心,但是出于某种原因,当我设置left属性时,它选择在我告诉它假设的像素值之前停止8个像素。

angular.module('website', ['ngAnimate'])
.controller('MainCtrl', function ($scope) {
    $scope.products = [
        {name: 'p1'},
        {name: 'p2'},
        {name: 'p3'},
        {name: 'p4'},
        {name: 'p5'}
    ];
    $scope.currentIndex = 0;

    $scope.setCurrentSlideIndex = function (index) {
        $scope.currentIndex = index;
    };

    $scope.isCurrentSlideIndex = function (index) {
        return $scope.currentIndex === index;
    };
})
.directive('pan', function(panBuckets) {
    return function(scope, elm, attr) {
        elm.css('position', 'relative');
        var parentWidth = elm.parent().width();
        elm.css('left', Math.floor(parentWidth/2)-(70/2)+'px');
        scope.pan = function(vector) {
          var bucket = panBuckets[attr['pan']];
          if (bucket) {
              var result = bucket.selectNewItem(bucket.selectedIndex-vector);
              var rect = elm[0].getBoundingClientRect();
              console.log('amount moved',rect.left, (vector*70)+'px',rect.left+(vector*70)+'px');
              if (result!==false) elm.css('left', rect.left+(vector*70)+'px');
              console.log(bucket.selectedItem[0].getBoundingClientRect().left, rect.left);
          }
        };
    };
})
.service('panBuckets', function() {
    return {};
})
.directive('panItem', function(panBuckets) {
    var itemBuckets = panBuckets;
    return function(scope, elm, attr) {
        var bucket = itemBuckets[attr['panItem']];
        if (!bucket) {
            itemBuckets[attr['panItem']] = [];
            bucket = itemBuckets[attr['panItem']];
            elm.addClass('product-active');
            bucket.selectedItem = elm;
            bucket.selectNewItem = function(idx) {
                if (idx < 0) idx = 0;
                if (bucket.selectedIndex==idx) return false;
                if (!bucket[idx]) return false;
                bucket.selectedItem.removeClass('product-active');
                bucket.selectedItem = bucket[idx];
                bucket.selectedItem.addClass('product-active');
                bucket.selectedIndex = idx;
                return idx;
            };
            bucket.selectedIndex = 0;
        }
        bucket.push(elm);
        scope.panBucket = bucket;
    };
})
;

最佳答案

相对位置在尝试实现这种定位时有点怪异,因为它将项目保持在“适当位置”,然后重新放置它,这会产生一些怪异的行为。

一个有效且简便的解决方案是将盒子容器的位置更改为绝对位置,并将容器的位置更改为相对位置。这样可以保证精度。

P.s.稍微有点题外话,但是这种方式的动画(围绕元素移动)可以通过转换转换更好地完成,速度要快得多(在可能的情况下,处理会移交给GPU并进行更多优化)。

关于javascript - 为什么设置css left属性会导致其关闭8?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26663969/

10-10 14:50