Mình đang xây dựng nhóm "anh Thầy & Đồng bọn (Hỏi đáp, chia sẻ kiến thức)" mục đích để các bạn có một nơi giao lưu trao đổi.
Đội MOD của group và mọi người sẽ hỗ trợ bạn ngay lập tức.
Join ở đây nè: https://www.facebook.com/groups/anhthayvadongbon
Tên bài học: Cách sử dụng Slick để tạo Responsive Carousel (plugin jQuery)
Thời gian học: 1 giờ | Nguồn: viblo.asia | Lượt xem: 4100 lượt xem
Trang chủ: https://kenwheeler.github.io/slick/
Slick.js là một plugin jQuery nổi tiếng được tạo ra bởi Ken Wheeler cho phép bạn tạo ra những responsive carousel tuyệt đẹp. Để hiểu rõ hơn về những gì plugin này có thể mang lại cho bạn, cùng mình tìm hiểu nhé.
Chúng ta cần một list danh sách các item để gọi hàm slick xử lý:
<div>
<div><h3>1</h3></div>
<div><h3>2</h3></div>
<div><h3>3</h3></div>
<div><h3>4</h3></div>
<div><h3>5</h3></div>
<div><h3>6</h3></div>
</div>
Thêm thư viện slick bằng cách sử dụng trực tiếp file download này về hoặc sử dụng link của cdn.jsdelivr.net.
CSS
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
JS
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
Nếu trong quá trình làm lỗi phát sinh bạn đổi slick.min.js thanh slick.js để sử dụng tốt hơn nhé.
Hoặc các bạn có thể cài bằng npm vào node-modules
npm install slick-carousel
Dùng jquery để gọi hàm slick
$('.multiple-items').slick({
infinite: true,
slidesToShow: 3,
slidesToScroll: 3
});
Chúng ta sẽ setting các thuộc tính có sẵn của slick như sau:
Tên thuộc tính | Mục đích sử dụng | Kiểu giá trị | Ví dụ : (mặc định) |
---|---|---|---|
slidesToShow | Số lượng phần tử được nhìn thấy | int | |
slidesToScroll | Số phần tử được lướt sang | int | |
accessibility | Cho phép qua lại phần tử bằng bàn phím qua lại | bool | Accessibility: true |
adaptiveHeight | Nếu kích thước item lớn thì sẽ tự động giãn chiều cao | bool | adaptiveHeight:false |
autoplaySpeed | Tự đông chạy cho slide | int(ms) | autoplaySpeed :3000 |
arrows | Cho phép hiển thị phím mũi tên chạy | bool | arrows:true |
asNavFor | Đặt thanh trượt thành điều hướng của thanh trượt khác Thường đi với focusOnSelect | string | $(function(){ $("#slider").slick( autoplay: true, speed: 1000, arrows: false, asNavFor: "#thumbnail_slider" }); $("#thumbnail_slider").slick({ slidesToShow: 3, speed: 1000, asNavFor: "#slider" }); }); https://codepen.io/blanks-site/pen/pWMGjm |
appendArrows | Đưa các button điều khiển vào một thẻ cho trước | string | appendArrows: ‘.contron-pre-next’ |
appendDots | Tương tự như anpenArrows là chấm chỉ mục | string | appendDots: ‘.dot’ |
prevArrow | Button next slide | String | <button type="button" class="slick-prev">Previous</button> |
nextArrow | Button prev slide | String | <button type="button" class="slick-next">Next</button> |
centerMode | Hiển thị slide ở trung tâm, bao gồm các slide trước và tiếp theo. slidesToShowChỉ định cả hai với một số lượng item là số lẻ. | bool | centerMode: true |
centerPadding | Khoảng cách của phần hiển thị bị che một item chưa show (dung chung với centerMode) | String | centerPadding :’50px’ or ‘50%’ |
cssEase | Hiệu ứng chuyển trang | String | Tìm hiểu them về animation-timing-funtion của csscssEase: 'linear' or 'cubic-bezier(0.7, 0, 0.3, 1)' linear,ease,ease-in,ease-out,ease-in-out,step-start,step-end,steps(int,start,end),cubic bezier(n,n,n,n),initial,inherit; |
customPaging | Biến những dấu chấm phân silde thành những con số. chính vì vậy dot: true | Funtion | customPaging: function(slick,index) { return '<a>' + (index + 1) + '</a>'; } |
dot | Dấu chấm định danh địa chỉ đên cho mỗi item show | bool | dots: fasle |
dotClass | Css class cho các dấu chấm tương ứng với các slide của slider | string | dotClass: ‘slick-dots’ |
draggable | Cho phép kéo chuột | bool | draggable: true |
fade | Mờ dần khi chuyển slide | bool | fade: false |
focusOnSelect | Khi click vào slide con bên dưới thì slide chính được show | bool | focusOnSelect: false |
easing | Thêm các animation của jquery | string | easing: 'linner'( or swing,_default ) |
infinite | Vòng lăp vô tận | bool | infinite:true |
initialSlide | Thứ tự xuất hiện lần đầu của item show | int | initialSlide: 0 |
rows | Show số hàng item trên một slile | int | rows: 1 |
responsive | Reponsive cho từng kích thước view | Object | responsive: [ { breakpoint: 768, settings: { arrows: false, centerMode: true, centerPadding: '40px', slidesToShow: 3 } }, { breakpoint: 480, settings: { arrows: false, centerMode: true, centerPadding: '40px', slidesToShow: 1 }} ] |
mobileFirst | Bật tắt chế độ reponsive ngay trên màn hình desktop | bool | mobileFirst: false |
pauseOnFocus | Tạm dừng auto slide đang chạy khi click vào item show | bool | pauseOnFocus: true |
pauseOnDotsHover | Tạm dừng auto slide đang chạy khi hover vào dot show | bool | pauseOnDotsHover: true |
pauseOnHover | Tạm dừng auto slide đang chạy khi hover vào item show | Bool | pauseOnHover: true |
respondTo | Chiều rộng được định cho repoonsive | String | respondTo: ‘tenClass’ |
slide | Show toàn bộ item | element | Slide:' ' (using Slide: ‘p.light’ nó sẽ show toàn bộ item ra) |
slidesPerRow | Show toàn bộ item. Ví dụ bằng 2 thì xếp 2 item vào 1 nhóm trải dài, có 8 item thì có 4 nhóm | int | slidesPerRow: 1 |
speed | Tốc độ chuyển slide | Int | Speed:300 |
swipe | Cho phép vuốt slide | Bool | Swipe: true |
swipeToSlide | Vuốt click chỉ đươc 1 item nếu true được bật | Bool | swipeToSlide: false |
touchMove | Bật tắt chế độ cảm ứng | Bool | touchMove: true |
touchThreshold | Khi chuyển slide bằng cách vuốt thì thuộc tính này tính chiều dài của việc vuốt đó bằng công thức (1/value)*chiều dài item | Float | touchThreshold:5 |
variableWidth | Vô hiệu hóa vùng nhìn của slide | Bool | variableWidth: false |
vertical | Slide di chuyển lên xuống thay vì trái phải hoặc dùng verticalSwiping | bool | vertical: false, |
Phương thức khởi tạo của slick Ví dụ:
$(document).ready(function(){
$('.slider').slick();
});
Ta sẽ truyền các thuộc tính mà chúng ta muốn config từ ban đầu
Phương thức này huỷ bỏ config slick. Đưa các item về trạng thái không có slide Ví dụ:
$(document).ready(function(){
$('.slider').slick();
});
$('.js-method').on('click', function() {
$('.slider').slick('unslick');
});
Before
After
Phương thức giúp ta điều hướng các button next và prev mà không cần phải sử dụng button mặc định của slick. Ví dụ:
$(document).ready(function(){
$('.slider').slick();
});
$('.js-method').on('click', function() {
$('.slider').slick('slickNext');
});
Ngoài việc next bằng button mặc định ta cũng có thể gán sự kiện next cho một button khác. Điều này phục vụ rất tốt cho thiết kế slide theo ý muốn của mình
Phương thức này tương tự phương thức slickNext Ví dụ :
$(document).ready(function(){
$('.slider').slick();
});
$('.js-method').on('click', function() {
$('.slider').slick('slickPrev');
});
Khi slick ở trạng thái autoplaySpeed slide sẽ chạy liên tục nếu muốn dừng trạng thái này ta sử dụng phương thức slickPause Ví dụ :
$(document).ready(function(){
$('.slider').slick({
autoplay: true,
autoplaySpeed: 500,
});
});
$('.js-stop').on('click', function() {
$('.slider').slick('slickPause');
});
$('.js-play').on('click', function() {
$('.slider').slick('slickPlay');
});
slickPlay sẽ huỷ lệnh slickPause
slickGoTo sẽ show vị trí item mà ta muốn show Ví dụ:
$(document).ready(function(){
$('.slider').slick();
});
$('.js-method').on('click', function() {
$('.slider').slick('slickGoTo', 2, true);
});
Trả về vị trí slide hiện tại Ví dụ:
$(document).ready(function(){
$('.slider').slick();
});
$('.js-method').on('click', function() {
var currentSlide = $('.slider').slick('slickCurrentSlide');
$('.result').text('Slide hiện tại là :' + currentSlide );
});
Thêm một slide. Nếu ta thêm một vị trí cho nó, nó sẽ thêm tại vị trí đó . Nếu không có chỉ mục nào được cung cấp.
Cụ thể các tham số truyền vào như sau:
$('.slider').slick('slickAdd', element, index, addBefore);
element: phần tử được thêm vào .
index: vị trí phần tử được thêm vào .
addBefore: thêm vào trước hay thêm vào sau vị trí được chọn .
Ví dụ:
$(document).ready(function(){
$('.slider').slick();
});
$('.js-method').on('click', function() {
$('.slider').slick('slickAdd', '<p>4</p>', 1, true);
});
Xóa slide theo vị trí, các tham số truyền vào tương tự slickAdd
$('.slider').slick('slickRemove', index, removeBefore);
Ví dụ:
$(document).ready(function(){
$('.slider').slick();
});
$('.js-method').on('click', function() {
$('.slider').slick('slickRemove', 1, true);
});
Lọc các phần tử trong slide, phương thức này cũng khá hay. Cụ thể các tham số như sau :
$('.slider').slick('slickFilter', filter);
Trong đó filter là một funtion: Ví dụ:
$(document).ready(function(){
$('.slider').slick({
slidesToShow: 3,
});
});
$('.js-filter').on('click', function() {
$('.slider').slick('slickFilter', ':even');
});
$('.js-unfilter').on('click', function() {
$('.slider').slick('slickUnfilter');
});
Trong ví dụ này nó sẽ lọc những phần tử có vị trí chẵn. ta có thể thêm phần filter bằng các điều kiện khác ( https://stackoverflow.com/questions/47714202/slick-slider-filter-by-class-issue ) như :
var filter = $(this).data('attribute');
Kích hoạt sau khi slide chạy qua 1 item.
Đối số : slick (đối tượng slick được gán cho thẻ đó) , currentSlide (item hiện tại mà slick đang show )
Ví dụ:
$(document).ready(function(){
$('.slider').on('afterChange', function(event, slick, currentSlide){
$('.result').text('afterChange : ' + (currentSlide + 1));
});
$('.slider').slick();
});
Sự kiện sẽ kích hoạt sau khi ta click vào slick ở đây ta có thể thêm các sự kiện hoặc thay đổi nội dung cho các thẻ khác trong project của chúng ta. Và đừng quên tạo setting cho class sau đó
$('.slider').slick();
Ngược lại với afterChange sự kiện sẽ kích hoạt trước khi slick chạy qua item khác trong bản demo link trên tôi có đưa cho các bạn nếu ta để ý kĩ thì thẻ <div class="result"></div>
thay đổi trước khi qua 1 item khác.
Đối số : slick (đối tượng slick được gán cho thẻ đó) , currentSlide (item hiện tại mà slick đang show )
Ví dụ:
$(document).ready(function(){
$('.slider').on('afterChange', function(event, slick, currentSlide){
$('.result').text('afterChange : ' + (currentSlide + 1));
});
$('.slider').slick();
});
Sự kiện này giúp ta điều chỉnh được kích thước của thông qua việc responsive bằng API setting.
Đối số : slick (đối tượng slick được gán cho thẻ đó) , breakpoint (kích thước hiện tại của class slide )
Ví dụ:
Ta có phần setting như đã nói ở trên:
$('.slider').slick({
respondTo: 'slider',
slidesToShow: 5,
responsive: [{
breakpoint: 640,
settings: {
slidesToShow: 5
}
}, {
breakpoint: 480,
settings: {
slidesToShow: 3
}
}, {
breakpoint: 320,
settings: {
slidesToShow: 1
}
}]
});
Với các kích thước khác nhau cho từng responsive theo kích thước màn hình như vậy. Giả sử người dùng muốn dự án của mình điều chỉnh được kích thước của slide đó sao cho vừa mắt khung làm việc của mình thì breakpoint sẽ giúp bạn trong điều này.
$('.js-600').on('click', function() {
$('.slider').css('width', '600px');
$('.slider').slick('slickSetOption', {}, true);
});
$('.js-450').on('click', function() {
$('.slider').css('width', '450px');
$('.slider').slick('slickSetOption', {}, true);
});
$('.js-300').on('click', function() {
$('.slider').css('width', '300px');
$('.slider').slick('slickSetOption', {}, true);
});
Khi yêu cầu sự kiện slick ta phải set css lại kích cỡ cho slide bằng css sau đó setOption cho đó để khớp với css ta vừa set ( slickSetOption sự kiện này được nói bên method bài này mình sẽ viết sau nhé). Kích thước của slide sẽ thay đổi và breakpoint setting trên show item phù hợp.
Destroy show toàn bộ item, hay nói cách khác là hủy show slide
Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class)
Ví dụ:
$('.js-unslick').on('click', function() {
$('.slider').slick('unslick');
});
Bùm slick biến mất.
Thông báo giới hạn của slick
Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class), direction (giới hạn :bên trái, bên phải, bên trên, bên dưới)
Ví dụ:
Nếu có giới hạn thì không thể thiếu khi chúng ta phải setting Slick infinite: false
$(document).ready(function(){
$('.slider').on('edge', function(event, slick, direction){
$('.result').text('edge : ' + direction);
});
$('.slider').slick({
infinite: false,
});
});
Sự kiện được kích hoạt sau khi Slick được khởi tạo lưu ý nếu dùng event này bạn cần đặt nó trước khi gán class cho slick $('.slider').slick()
Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class)
Ví dụ:
$(document).ready(function(){
$('.slider').on('init', function(event, slick){
$('.result').text('init : tôi được khởi tạo trước anh ý');
});
$('.slider').slick();
});
Xảy ra bất cứ khi nào slick được tái khởi tạo. Ví dụ khi đang xem ở rất xa ở môt item nào đó bạn muốn xem lại trang đầu tiên hay bối cảnh xung quang đầu tiên khi bắt đầu xem trang web, thì event này giúp bạn điều đó.
Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class)
Ví dụ:
$(document).ready(function(){
$('.slider').on('init', function(event, slick){
$('.result').text('init : bấm vào đi tôi sẽ khởi tạo lại từ ban đầu');
});
$('.slider').slick();
});
Sự kiện xảy ra sau khi một hình ảnh được tải. Sự kiện sẽ sảy ra một lần khi bạn lướt qua lần các item và lần tiếp theo event này sẽ không được gọi
Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class), image(hình ảnh biến này các bạn thử log ra xem nó thuộc kiểu typeOf gì nhé) ,imageSource (địa chỉ hình ảnh trong source code)
Ví dụ:
$(document).ready(function(){
$('.slider').on('lazyLoaded', function(event, slick, image, imageSource){
$('.result').text('lazyLoaded : ' + imageSource + 'vị trí tôi đây');
});
$('.slider').slick({
lazyLoad: 'ondemand',
});
});
lazyLoad: 'ondemand'
các bạn còn nhớ trong setting không. Tải một lại hình khi đi được một vòng của slide.
Sự kiện xảy ra sau khi tải hình ảnh thất bại. Điều này giúp ta biết được ảnh nào không load được khi chạy.
Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class), image(hình ảnh biến này các bạn thử log ra xem nó thuộc kiểu typeOf gì nhé hihihi) ,imageSource (địa chỉ hình ảnh trong source code)
Ví dụ:
$(document).ready(function(){
$('.slider').on('lazyLoadError', function(event, slick, image, imageSource){
$('.result').text('lazyLoadError : ' + imageSource + ' vị trí tôi đây nhưng mà không có gì huhuhuh');
});
$('.slider').slick({
lazyLoad: 'ondemand',
});
});
Sự kiện xảy ra mỗi khi vị trí được load lại .
Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class), direction (giới hạn :bên trái, bên phải, bên trên, bên dưới)
Ví dụ:
$(document).ready(function(){
$('.slider').on('setPosition', function(event, slick, direction){
$('.result').text('setPosition : tôi được set lại này');
});
$('.slider').slick();
});
Sự kiện diễn ra sau khi vị trí các item được load lại. Thử F12 bên demo để hiểu rõ đoạn text của class result sẽ load lại
Sự kiện xảy ra khi trượt slide của bạn, nên nhớ lướt nhé không click bấm để chạy slide Đối số : slick (đối tượng slick được gán cho thẻ đó) , event (gán sự kiện cho class), direction (giới hạn :bên trái, bên phải, bên trên, bên dưới)
Ví dụ:
$(document).ready(function(){
$('.slider').on('swipe', function(event, slick, direction){
$('.result').text('swipe : ' + direction + 'lướt tôi đi kahahaha');
});
$('.slider').slick();
});
Tài liệu tham khảo
https://tr.you84815.space/slick/settings/accessibility.html
Nguồn: viblo.asia
This site does not store any files on its server. We only index and link to content provided by other sites. Please contact the content providers to delete copyright contents if any and email us, we'll remove relevant links or contents immediately.
Trang web này không lưu trữ bất kỳ tệp (files) nào trên máy chủ (server). Chúng tôi chỉ lập chỉ mục và liên kết đến nội dung được cung cấp bởi các trang web khác. Vui lòng liên hệ với các nhà cung cấp nội dung để xóa nội dung bản quyền nếu có và gửi email cho chúng tôi, chúng tôi sẽ xóa các liên kết hoặc nội dung có liên quan ngay lập tức.
Bạn có muốn xác nhận hoàn thành bài học này không?