π«π· Read in French | π¬π§ Read in English
If this bundle is useful to you, consider becoming a sponsor to support the development and maintenance of this open source project.
A modern and performant carousel library for PHP with beautiful designs. Pure CSS/JS native implementation with zero external dependencies.
composer require julienlinard/php-carouselRequirements: PHP 8.0 or higher
<?php
require_once __DIR__ . '/vendor/autoload.php';
use JulienLinard\Carousel\Carousel;
// Create an image carousel
$carousel = Carousel::image('my-carousel', [
'https://example.com/image1.jpg',
'https://example.com/image2.jpg',
'https://example.com/image3.jpg',
]);
// Render the carousel
echo $carousel->render();use JulienLinard\Carousel\Carousel;
$carousel = Carousel::card('products', [
[
'id' => '1',
'title' => 'Product 1',
'content' => 'Description of product 1',
'image' => 'https://example.com/product1.jpg',
'link' => '/product/1',
],
[
'id' => '2',
'title' => 'Product 2',
'content' => 'Description of product 2',
'image' => 'https://example.com/product2.jpg',
'link' => '/product/2',
],
], [
'itemsPerSlide' => 3,
'itemsPerSlideMobile' => 1,
]);
echo $carousel->render();use JulienLinard\Carousel\Carousel;
$carousel = Carousel::testimonial('testimonials', [
[
'id' => '1',
'title' => 'John Doe',
'content' => 'This product changed my life! Highly recommended.',
'image' => 'https://example.com/avatar1.jpg',
],
[
'id' => '2',
'title' => 'Jane Smith',
'content' => 'Amazing quality and excellent customer service.',
'image' => 'https://example.com/avatar2.jpg',
],
], [
'transition' => 'fade',
'autoplayInterval' => 6000,
]);
echo $carousel->render();See the carousels in action! Each type is fully customizable and responsive with smooth animations.
Perfect for hero banners and image galleries with smooth slide transitions.
Ideal for product listings, blog posts, or feature showcases. Displays multiple items per slide.
Beautiful fade transitions for customer reviews and testimonials.
Advanced gallery with thumbnail navigation for easy browsing.
- β Zero Dependencies - Pure CSS/JS native implementation
- β Multiple Types - Image, Card, Testimonial, Gallery carousels
- β Fully Responsive - Mobile, tablet, and desktop optimized
- β Touch Swipe - Native touch gestures support
- β Keyboard Navigation - Accessible keyboard controls
- β Autoplay - Configurable autoplay with pause on hover
- β Smooth Animations - CSS transitions and transforms
- β Lazy Loading - Built-in image lazy loading
- β Customizable - Extensive configuration options
- β Accessible - ARIA labels and semantic HTML
Perfect for image galleries and hero banners.
$carousel = Carousel::image('gallery', [
'image1.jpg',
'image2.jpg',
'image3.jpg',
], [
'height' => '500px',
'showDots' => true,
'showArrows' => true,
]);Ideal for product listings, blog posts, or feature cards.
$carousel = Carousel::card('products', $products, [
'itemsPerSlide' => 3,
'itemsPerSlideDesktop' => 3,
'itemsPerSlideTablet' => 2,
'itemsPerSlideMobile' => 1,
'gap' => 24,
]);Perfect for customer reviews and testimonials.
$carousel = Carousel::testimonial('reviews', $testimonials, [
'transition' => 'fade',
'autoplayInterval' => 7000,
]);Advanced gallery with thumbnails navigation.
$carousel = Carousel::gallery('photo-gallery', $images, [
'showThumbnails' => true,
'itemsPerSlide' => 1,
]);$carousel = new Carousel('my-carousel', Carousel::TYPE_IMAGE, [
// Autoplay
'autoplay' => true, // Enable/disable autoplay
'autoplayInterval' => 5000, // Autoplay interval in milliseconds
// Navigation
'showArrows' => true, // Show navigation arrows
'showDots' => true, // Show dot indicators
'showThumbnails' => false, // Show thumbnails (gallery only)
// Layout
'itemsPerSlide' => 1, // Number of items per slide
'itemsPerSlideDesktop' => 1, // Desktop items per slide
'itemsPerSlideTablet' => 1, // Tablet items per slide
'itemsPerSlideMobile' => 1, // Mobile items per slide
'gap' => 16, // Gap between items (px)
// Animation
'transition' => 'slide', // 'slide', 'fade', 'cube'
'transitionDuration' => 500, // Transition duration (ms)
// Behavior
'loop' => true, // Loop through slides
'responsive' => true, // Enable responsive behavior
'lazyLoad' => true, // Enable lazy loading
'keyboardNavigation' => true, // Enable keyboard navigation
'touchSwipe' => true, // Enable touch swipe
// Styling
'height' => 'auto', // Carousel height
'width' => '100%', // Carousel width
]);use JulienLinard\Carousel\Carousel;
use JulienLinard\Carousel\CarouselItem;
$carousel = new Carousel('custom', Carousel::TYPE_CARD);
$carousel->addItem(new CarouselItem(
id: 'item1',
title: 'Custom Item',
content: 'This is a custom carousel item',
image: 'https://example.com/image.jpg',
link: '/item/1',
attributes: ['class' => 'custom-class']
));
$carousel->addItem([
'id' => 'item2',
'title' => 'Another Item',
'content' => 'Added from array',
'image' => 'https://example.com/image2.jpg',
]);
echo $carousel->render();// Render only HTML
echo $carousel->renderHtml();
// Render only CSS (in <head>)
echo $carousel->renderCss();
// Render only JavaScript (before </body>)
echo $carousel->renderJs();$carousel1 = Carousel::image('carousel-1', $images1);
$carousel2 = Carousel::card('carousel-2', $cards);
// Each carousel has unique IDs and styles
echo $carousel1->render();
echo $carousel2->render();The carousel uses pure CSS with no external dependencies. All styles are scoped to the carousel container to avoid conflicts.
You can override styles using CSS:
#carousel-my-carousel .carousel-arrow {
background: #your-color;
}
#carousel-my-carousel .carousel-dot.active {
background: #your-color;
}Carousel::image(string $id, array $images, array $options = []): selfCarousel::card(string $id, array $cards, array $options = []): selfCarousel::testimonial(string $id, array $testimonials, array $options = []): selfCarousel::gallery(string $id, array $images, array $options = []): self
addItem(CarouselItem|array $item): self- Add a single itemaddItems(array $items): self- Add multiple itemssetOptions(array $options): self- Set carousel optionsgetOption(string $key, mixed $default = null): mixed- Get an option valuerender(): string- Render complete carousel (HTML + CSS + JS)renderHtml(): string- Render only HTMLrenderCss(): string- Render only CSSrenderJs(): string- Render only JavaScriptgetId(): string- Get carousel IDgetType(): string- Get carousel typegetItems(): array- Get all itemsgetOptions(): array- Get all options
new CarouselItem(
string $id,
string $title = '',
string $content = '',
string $image = '',
string $link = '',
array $attributes = []
)CarouselItem::fromArray(array $data): self- Create from array
toArray(): array- Convert to array
<?php
use JulienLinard\Carousel\Carousel;
$products = [
[
'id' => '1',
'title' => 'Premium Headphones',
'content' => 'High-quality sound with noise cancellation',
'image' => '/images/headphones.jpg',
'link' => '/products/headphones',
],
[
'id' => '2',
'title' => 'Wireless Mouse',
'content' => 'Ergonomic design with long battery life',
'image' => '/images/mouse.jpg',
'link' => '/products/mouse',
],
// ... more products
];
$carousel = Carousel::card('products', $products, [
'itemsPerSlide' => 4,
'itemsPerSlideDesktop' => 4,
'itemsPerSlideTablet' => 2,
'itemsPerSlideMobile' => 1,
'gap' => 20,
'autoplay' => true,
'autoplayInterval' => 4000,
]);
echo $carousel->render();<?php
use JulienLinard\Carousel\Carousel;
$banners = [
[
'id' => 'banner1',
'title' => 'Welcome to Our Store',
'content' => 'Discover amazing products',
'image' => '/images/banner1.jpg',
'link' => '/shop',
],
[
'id' => 'banner2',
'title' => 'Summer Sale',
'content' => 'Up to 50% off on selected items',
'image' => '/images/banner2.jpg',
'link' => '/sale',
],
];
$carousel = Carousel::image('hero', $banners, [
'height' => '600px',
'autoplay' => true,
'autoplayInterval' => 5000,
'transition' => 'fade',
]);
echo $carousel->render();<?php
use JulienLinard\Carousel\Carousel;
$testimonials = [
[
'id' => '1',
'title' => 'Sarah Johnson',
'content' => 'The best service I\'ve ever experienced. Highly recommend!',
'image' => '/avatars/sarah.jpg',
],
[
'id' => '2',
'title' => 'Michael Chen',
'content' => 'Outstanding quality and fast delivery. Will order again!',
'image' => '/avatars/michael.jpg',
],
];
$carousel = Carousel::testimonial('testimonials', $testimonials, [
'transition' => 'fade',
'autoplayInterval' => 6000,
'showDots' => true,
]);
echo $carousel->render();composer testMIT License - See the LICENSE file for more details.
Contributions are welcome! Feel free to open an issue or a pull request.
For any questions or issues, please open an issue on GitHub.
If this bundle is useful to you, consider becoming a sponsor to support the development and maintenance of this open source project.
Developed with β€οΈ by Julien Linard



