205 lines
7.4 KiB
HTML
205 lines
7.4 KiB
HTML
<style>
|
|
.education-slider-wrapper {
|
|
position: relative;
|
|
padding: 0px;
|
|
/* Space for buttons */
|
|
}
|
|
|
|
.education-slider-container {
|
|
overflow: hidden;
|
|
width: 100%;
|
|
}
|
|
|
|
.education-slider-wrapper .news-grid,
|
|
.education-slider-wrapper .row,
|
|
.education-slider-track {
|
|
display: flex !important;
|
|
flex-wrap: nowrap !important;
|
|
gap: 20px;
|
|
margin: 0 !important;
|
|
transition: transform 0.4s ease;
|
|
}
|
|
|
|
/* Force children to be fixed width cards */
|
|
.education-slider-wrapper .news-grid>*,
|
|
.education-slider-wrapper .row>*,
|
|
.education-slider-track>* {
|
|
flex: 0 0 calc(33.333% - 14px) !important;
|
|
/* show 3 cards at a time */
|
|
max-width: none !important;
|
|
}
|
|
|
|
@media (max-width: 992px) {
|
|
|
|
.education-slider-wrapper .news-grid>*,
|
|
.education-slider-wrapper .row>*,
|
|
.education-slider-track>* {
|
|
flex: 0 0 calc(50% - 10px) !important;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 576px) {
|
|
|
|
.education-slider-wrapper .news-grid>*,
|
|
.education-slider-wrapper .row>*,
|
|
.education-slider-track>* {
|
|
flex: 0 0 100% !important;
|
|
}
|
|
}
|
|
|
|
.edu-slider-btn {
|
|
position: absolute;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
width: 40px;
|
|
height: 40px;
|
|
border-radius: 50%;
|
|
background-color: rgba(200, 200, 200, 0.5);
|
|
/* mờ / transparent */
|
|
color: #333;
|
|
border: none;
|
|
font-size: 30px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
z-index: 10;
|
|
transition: background-color 0.2s, color 0.2s;
|
|
line-height: 1;
|
|
}
|
|
|
|
.edu-slider-btn:hover {
|
|
background-color: rgba(0, 0, 0, 0.7);
|
|
color: #fff;
|
|
}
|
|
|
|
.edu-slider-btn.prev-btn {
|
|
left: -10px;
|
|
}
|
|
|
|
.edu-slider-btn.next-btn {
|
|
right: -10px;
|
|
}
|
|
|
|
.edu-slider-btn:disabled {
|
|
opacity: 0.2;
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
/* --- Hiệu ứng crop (zoom) ảnh khi hover --- */
|
|
.education-slider-wrapper .featured-grid__item .news-card__image {
|
|
overflow: hidden !important;
|
|
display: block;
|
|
}
|
|
|
|
.education-slider-wrapper .featured-grid__item .news-card__image img {
|
|
transition: transform 0.4s ease-in-out !important;
|
|
}
|
|
|
|
.education-slider-wrapper .featured-grid__item:hover .news-card__image img {
|
|
transform: scale(1.1) !important;
|
|
}
|
|
</style>
|
|
|
|
<body>
|
|
<div class="cc--component-container cc--news-events">
|
|
<div class="c--component c--news-events">
|
|
<!-- Header -->
|
|
<div class="news-events-row">
|
|
<div class="education-column news-column" style="width: 100%;">
|
|
<div
|
|
style="display: flex; justify-content: space-between; align-items: baseline; border-bottom: 2px solid var(--color-brand); margin-bottom: 16px;">
|
|
<!-- Thêm flex-grow: 1 vào style của h2 -->
|
|
<h2 class="section-title--news"
|
|
style="font-size: 2rem; margin: 0; padding-bottom: 4px; border-bottom: unset;">ĐÀO TẠO</h2>
|
|
<a href="/news/education" class="news-events-section__cta news-events-section__cta--desktop"
|
|
style="color: var(--color-brand); font-weight: 800; font-size: 16px; text-transform: uppercase; text-decoration: none; border-bottom: unset;">XEM
|
|
THÊM</a>
|
|
</div>
|
|
<div class="education-slider-wrapper" style="padding-right: 0;">
|
|
<button class="edu-slider-btn prev-btn" aria-label="Previous">‹</button>
|
|
<div class="education-slider-container">
|
|
<div class="education-slider-track">
|
|
[component:news-grid data-source="posts:tag=education,limit=5,collection=news_posts"]
|
|
</div>
|
|
</div>
|
|
<button class="edu-slider-btn next-btn" aria-label="Next">›</button>
|
|
</div>
|
|
</div>
|
|
</div><!-- Mobile Footer CTA -->
|
|
<div class="news-events-section__footer"><a href="/news/education"
|
|
class="news-events-section__cta news-events-section__cta--mobile">Xem Thêm</a></div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function() {
|
|
const wrappers = document.querySelectorAll('.education-slider-wrapper');
|
|
wrappers.forEach(wrapper => {
|
|
const prevBtn = wrapper.querySelector('.prev-btn');
|
|
const nextBtn = wrapper.querySelector('.next-btn');
|
|
|
|
let track = wrapper.querySelector('.education-slider-track');
|
|
if (track && track.children.length === 1 && (track.children[0].classList.contains('news-grid') || track.children[0].classList.contains('row'))) {
|
|
track = track.children[0];
|
|
track.classList.add('education-slider-track');
|
|
}
|
|
|
|
if (!track) return;
|
|
|
|
let currentIndex = 0;
|
|
|
|
function updateSlider() {
|
|
const items = track.children;
|
|
if(items.length === 0) return;
|
|
const itemWidth = items[0].getBoundingClientRect().width;
|
|
|
|
const gap = parseFloat(window.getComputedStyle(track).gap) || 20;
|
|
track.style.transform = `translateX(-${currentIndex * (itemWidth + gap)}px)`;
|
|
|
|
const containerWidth = wrapper.querySelector('.education-slider-container').getBoundingClientRect().width;
|
|
const visibleCount = Math.max(1, Math.floor((containerWidth + gap) / (itemWidth + gap)));
|
|
|
|
prevBtn.disabled = currentIndex === 0;
|
|
nextBtn.disabled = currentIndex >= items.length - visibleCount;
|
|
}
|
|
|
|
prevBtn.addEventListener('click', () => {
|
|
if (currentIndex > 0) {
|
|
currentIndex--;
|
|
updateSlider();
|
|
}
|
|
});
|
|
|
|
nextBtn.addEventListener('click', () => {
|
|
const items = track.children;
|
|
const itemWidth = items[0].getBoundingClientRect().width;
|
|
const gap = parseFloat(window.getComputedStyle(track).gap) || 20;
|
|
const containerWidth = wrapper.querySelector('.education-slider-container').getBoundingClientRect().width;
|
|
const visibleCount = Math.max(1, Math.floor((containerWidth + gap) / (itemWidth + gap)));
|
|
|
|
if (currentIndex < items.length - visibleCount) {
|
|
currentIndex++;
|
|
updateSlider();
|
|
}
|
|
});
|
|
|
|
window.addEventListener('resize', () => {
|
|
const items = track.children;
|
|
if(items.length === 0) return;
|
|
const itemWidth = items[0].getBoundingClientRect().width;
|
|
const gap = parseFloat(window.getComputedStyle(track).gap) || 20;
|
|
const containerWidth = wrapper.querySelector('.education-slider-container').getBoundingClientRect().width;
|
|
const visibleCount = Math.max(1, Math.floor((containerWidth + gap) / (itemWidth + gap)));
|
|
|
|
if (currentIndex > items.length - visibleCount) {
|
|
currentIndex = Math.max(0, items.length - visibleCount);
|
|
}
|
|
updateSlider();
|
|
});
|
|
|
|
setTimeout(updateSlider, 200);
|
|
});
|
|
});
|
|
</script> |