ncu-chem-new/modules/web_resource/_web_res_widget12.html.erb

145 lines
3.9 KiB
Plaintext

<div class="widget-link widget12">
<h3 class="widget-title">
<span>{{widget-title}}</span>
</h3>
<div class="widget-slideshow-wrap">
<ul class="widget-slideshow list-unstyled" data-level="0" data-list="web_link">
<li class="widget-content widget-content-horizontal">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">
<div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
</div>
</a>
<div class="widget-content-title">
<a href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">{{title}}</a>
<span data-list="statuses" data-level="1">
<span class="label status {{status-class}}">{{status}}</span>
</span>
</div>
</li>
</ul>
</div>
<div class="widget-banner-pager"></div>
</div>
<script>
function initWidget7Carousel() {
$('.widget-link.widget7').each(function() {
var $widget = $(this);
var $ul = $widget.find('.widget-slideshow');
var $items = $ul.find('li.widget-content');
var $pager = $widget.find('.widget-banner-pager');
var perPage = 5;
var total = $items.length;
var pageCount = Math.ceil(total / perPage);
var current = 0;
var isAnimating = false;
$ul.css({ position: 'relative', left: 0 });
// 建立點點
$pager.empty();
for (var i = 0; i < pageCount; i++) {
$pager.append('<span data-page="' + i + '"></span>');
}
function initItemWidth() {
var wrapWidth = $widget.find('.widget-slideshow-wrap').outerWidth();
var itemWidth = wrapWidth / perPage;
$items.css('width', itemWidth + 'px');
$ul.css('width', (itemWidth * total) + 'px');
}
function goToPage(page) {
if (isAnimating || page === current) return;
isAnimating = true;
var wrapWidth = $widget.find('.widget-slideshow-wrap').outerWidth();
var itemWidth = wrapWidth / perPage;
var ulWidth = itemWidth * total;
// ✅ 關鍵修正:最後一頁不能超過 ul 總寬 - wrap寬
var maxLeft = ulWidth - wrapWidth;
var targetLeft = Math.min(page * wrapWidth, maxLeft);
$ul.animate({ left: -targetLeft }, {
duration: 400,
easing: 'swing',
complete: function() {
current = page;
isAnimating = false;
}
});
$pager.find('span')
.removeClass('cycle-pager-active')
.filter('[data-page="' + page + '"]')
.addClass('cycle-pager-active');
}
$pager.on('click', 'span', function() {
goToPage(parseInt($(this).data('page')));
});
$(window).on('resize', function() {
initItemWidth();
var wrapWidth = $widget.find('.widget-slideshow-wrap').outerWidth();
var itemWidth = wrapWidth / perPage;
var ulWidth = itemWidth * total;
var maxLeft = ulWidth - wrapWidth;
var targetLeft = Math.min(current * wrapWidth, maxLeft);
$ul.css('left', -targetLeft);
});
initItemWidth();
$pager.find('[data-page="0"]').addClass('cycle-pager-active');
});
}
$(function() {
initWidget7Carousel();
});
</script>
<style type="text/css">
.widget-link {
.widget-slideshow-wrap {
overflow: hidden;
position: relative;
}
.widget-slideshow {
display: flex;
flex-wrap: nowrap;
position: relative;
margin: 0;
padding: 0;
will-change: transform;
}
.widget-content-horizontal {
flex-shrink: 0;
}
.widget-banner-pager {
clear: both;
position: relative;
text-align: center;
margin-top: 10px;
.cycle-pager-active {
background: #869791;
}
}
.widget-banner-pager span {
display: inline-block;
width: 10px;
height: 10px;
margin: 0 4px;
background: #ccc;
border-radius: 50%;
cursor: pointer;
}
}
</style>