2014-10-08 3 views
19

Ich baue eine Website, die ein Karussell implementiert werden muss. Da diese Website auf AngularJS gebaut wurde, wollte ich mit Angulars Boostrap Carousel gehen, jedoch scheint dieses Karussell nur ein Bild nach dem anderen zuzulassen.Multi-Objekt-Karussell

Was ich brauche, wird 3 Bilder gleichzeitig auf dem Desktop, auf einem Tablet 2 Bilder und auf dem Handy 1 sein. Also gibt es ein bedeutendes Element des responsiven Designs auch hier beteiligt.

Hat jemand Erfahrung damit, die JQuery nicht einbezieht? Ich bin nicht dagegen, wurde aber von einem älteren Mitglied des Teams gebeten, eine Alternative zu suchen, falls es welche gibt.

Was ich von winkelförmigen Stangen Bootstrap versucht:

$scope.getPromoURLs = function() { 
     var subObj = myJSON.response.details.promotionalSpots; 
     for(var keys in subObj) { 
      var value = subObj[keys].promotionUrl; 
      $scope.slides.push(value); 
     } 
    }; 
    // Builts an array of promotional URLS to from a JSON object to source the images 
    $scope.getPromoURLs(); 

    $scope.addSlide = function() { 
     // Test to determine if 3 images can be pulled together - FAILS 
     var newWidth = 600 + slides.length; 
     slides.push({ 
      image: ''+slides[0]+''+slides[1] // etc 
      // Tried to stitch images together here 
     }); 
    }; 

    // TODO Should examine array length not hardcoded 4 
    for (var i = 0; i < 4; i++) { 
     $scope.addSlide(); 
    }   
+0

[Sollte ich ein Karussell verwenden?] (Spoiler: Die Antwort ist nein). Ist ein Karussell wirklich, wirklich notwendig? – GregL

+0

@GregL Hallo Greg, yeah Ich habe das vorher gelesen und leider ist es eine Anforderung aus dem Geschäft und wurde bereits von Entwicklern in Frage gestellt - sie bleiben dabei – Katana24

+0

Sie können einen Blick auf https://github.com/ Gilbitron/CarouFredSel. Es ist ein reaktionsfähiges Karussell (leider auf jQuery aufgebaut) – HerrSerker

Antwort

13

Karussell ui-Bootstraps ist keine gute Wahl, es hat anderen Nachteil wie isoliert Umfang auf jeder Folie. Ich verwende https://github.com/revolunet/angular-carousel, die mehrere Elemente auf jeder Folie unterstützen.

Weil diese Direktive ng-repeat unterstützt. Sie können Ihre Sammlung einfach ändern und mit nested ng-repeat eine andere Anzahl von Elementen auf jeder Folie festlegen.

<ul rn-carousel class="image"> 
    <li ng-repeat="images in imageCollection"> 
    <div ng-repeat="image in images" class="layer">{{ image }}</div> 
    </li> 
</ul> 

Wie Sie bereits 3 Haltepunkte definiert haben. Wir müssen nur das Array imageCollection rekonstruieren, wenn sich die Ansichtsfenstergröße geändert hat.

$window.on('resize', function() { 
    var width = $window.width(); 
    if(width > 900) { 
     // desktop 
     rebuildSlide(3); 
    } else if(width <= 900 && width > 480) { 
     // tablet 
     rebuildSlide(2); 
    } else { 
     // phone 
     rebuildSlide(1); 
    } 
    // don't forget manually trigger $digest() 
    $scope.$digest(); 
}); 

function rebuildSlide(n) { 
    var imageCollection = [], 
     slide = [], 
     index; 
    // values is your actual data collection. 
    for(index = 0; index < values.length; index++) { 
     if(slide.length === n) { 
      imageCollection.push(slide); 
      slide = []; 
     } 
     slide.push(values[index]); 
    } 
    imageCollection.push(slide); 
    $scope.imageCollection = imageCollection; 
} 
+0

Ich bin gerade dabei, das zu untersuchen, aber von dem, was ich gesehen habe, sollte es den Job machen. Der Schlüssel der Funktionalität, die ich möchte, ist, dass ich keine zusätzlichen JQuery-Bibliotheken laden sollte. Guter Fund! – Katana24

+0

Was meinst du mit Multi Items? Können wir das mit der obigen Richtlinie tun? http://bootsnipp.com/snippets/featured/carousel-product-cart-slider – Sampath

+1

@Sampath multi Elemente bedeutet, dass Sie ng-repeat verwenden müssen, um mehrere Blöcke innerhalb jeder Folie zu generieren. Dein Showcase kann durch diese Direktive unterstützt werden. –

11

Also habe ich versucht, diese ein, um angularjs Carousel (ui.bootstrap.carousel) zu machen mit Multi Artikel pro Animation zu arbeiten. Ich habe auch versucht, [Erkennung für Responsive Websites mit AngularJS] anzuwenden. 2

Werfen Sie einen Blick hier: http://plnkr.co/edit/QhBQpG2nCAnfsb9mpTvj?p=preview

Ergebnisse:

1) Ein Artikel (Handy-Version):

enter image description here

2) Zwei Artikel (Tablet Version):

enter image description here

3) Drei Artikel (Desktop-Version):

enter image description here

TEIL 2: Es kann auch die Auflösung des Fensters erfassen, um zu bestimmen, ob es tablet,mobile oder desktop folgende tutorial ... Versuchen Sie, diese Werte zu verwenden: "mobile, tablet, desktop", um die drei verschiedenen zu sehen ent sehen Versionen.

Demonstration dertablet version:

var app = angular.module('myApp', ['ui.bootstrap', 'angular-responsive']); 

app.controller('MainCtrl', function($scope) { 
    $scope.displayMode = 'mobile'; // default value 


    $scope.$watch('displayMode', function(value) { 

    switch (value) { 
     case 'mobile': 
     // do stuff for mobile mode 
      console.log(value); 
     break; 
     case 'tablet': 
     // do stuff for tablet mode 
      console.log(value); 
     break; 
    } 
    }); 
}); 

function CarouselDemoCtrl($scope) { 
    var whatDevice = $scope.nowDevice; 
    $scope.myInterval = 7000; 
    $scope.slides = [{ 
    image: 'http://placekitten.com/221/200', 
    text: 'Kitten.' 
    }, { 
    image: 'http://placekitten.com/241/200', 
    text: 'Kitty!' 
    }, { 
    image: 'http://placekitten.com/223/200', 
    text: 'Cat.' 
    }, { 
    image: 'http://placekitten.com/224/200', 
    text: 'Feline!' 
    }, { 
    image: 'http://placekitten.com/225/200', 
    text: 'Cat.' 
    }, { 
    image: 'http://placekitten.com/226/200', 
    text: 'Feline!' 
    }, { 
    image: 'http://placekitten.com/227/200', 
    text: 'Cat.' 
    }, { 
    image: 'http://placekitten.com/228/200', 
    text: 'Feline!' 
    }, { 
    image: 'http://placekitten.com/229/200', 
    text: 'Cat.' 
    }, { 
    image: 'http://placekitten.com/230/200', 
    text: 'Feline!' 
    }]; 


    var i, first = [], 
     second, third; 
    var many = 1; 

    //##################################################  
    //Need to be changed to update the carousel since the resolution changed 
    $scope.displayMode = "tablet"; 
    //################################################## 
    if ($scope.displayMode == "mobile") {many = 1;} 
    else if ($scope.displayMode == "tablet") {many = 2;} 
    else {many = 3;} 

    for (i = 0; i < $scope.slides.length; i += many) { 
     second = { 
     image1: $scope.slides[i] 
     }; 
     if (many == 1) {} 
     if ($scope.slides[i + 1] && (many == 2 || many == 3)) { 
     second.image2 = $scope.slides[i + 1]; 

     } 
     if ($scope.slides[i + (many - 1)] && many == 3) { 
     second.image3 = $scope.slides[i + 2]; 
     } 
     first.push(second); 
    } 
    $scope.groupedSlides = first; 
} 

app.directive('dnDisplayMode', function($window) { 
    return { 
    restrict: 'A', 
    scope: { 
     dnDisplayMode: '=' 
    }, 
    template: '<span class="mobile"></span><span class="tablet"></span><span class="tablet-landscape"></span><span class="desktop"></span>', 
    link: function(scope, elem, attrs) { 
     var markers = elem.find('span'); 

     function isVisible(element) { 
     return element && element.style.display != 'none' && element.offsetWidth && element.offsetHeight; 
     } 

     function update() { 
     angular.forEach(markers, function(element) { 
      if (isVisible(element)) { 
      scope.dnDisplayMode = element.className; 
      return false; 
      } 
     }); 
     } 

     var t; 
     angular.element($window).bind('resize', function() { 
     clearTimeout(t); 
     t = setTimeout(function() { 
      update(); 
      scope.$apply(); 
     }, 300); 
     }); 

     update(); 
    } 
    }; 
}); 

Hoffe, es hilft!

+0

Ist dieser Code defekt? Wenn ich die Demo anschaue, ist die Folie auf einem kleineren Bildschirm immer noch da, sie wird nur vertikal angezeigt. –

+0

Können wir das dynamisch machen? Ich möchte diese Art von Karussell erstellen. [Karussell] (https://drive.google.com/file/d/0BwUVZ91CGet-ZURnTnpvYUlRd00/view) –