You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swiper.js循环滑动首尾切换时Apex RadialBar无法渲染求助

解决Swiper Loop模式下Apex RadialBar首尾切换不渲染的问题

我之前碰到过一模一样的问题,这事儿的根源在于Swiper的loop机制:当你开启loop: true时,Swiper会自动克隆首尾的幻灯片(比如把第1张克隆一份放在最后,第3张克隆一份放在最前面),用来实现无缝循环滑动。但你最初的代码只初始化了原始的3个图表容器,这些克隆出来的容器完全没被处理,所以当你从第3张切到第1张(或者反向)时,实际显示的是克隆的幻灯片,自然看不到图表。

下面是修正后的完整代码,我会一步步解释改动点:

第一步:给图表容器加通用类

先给所有图表容器加一个统一的类名,方便后续批量处理(包括克隆出来的元素):

<script src="https://unpkg.com/swiper/js/swiper.min.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<link href="https://unpkg.com/swiper/css/swiper.min.css" rel="stylesheet"/>
<div class="swiper-container">
    <div class="swiper-wrapper">
        <!-- Slide 1-->
        <div class="swiper-slide">
            <section class="india">
                <p class="gas-header">INDIA</p>
                <div id="demo-chart-1" class="radial-chart-container"></div>
            </section>
        </div>
        <!-- Slide 2-->
        <div class="swiper-slide">
            <section class="canada">
                <p class="gas-header">CANADA</p>
                <div id="demo-chart-2" class="radial-chart-container"></div>
            </section>
        </div>
        <!-- Slide 3-->
        <div class="swiper-slide">
            <section class="japan">
                <p class="gas-header">JAPAN</p>
                <div id="demo-chart-3" class="radial-chart-container"></div>
            </section>
        </div>
    </div>
    <div class="swiper-pagination"></div>
</div>

第二步:修改JS逻辑,在Swiper初始化后渲染所有图表

把图表初始化逻辑放到Swiper的init事件里,确保Swiper已经生成了克隆的幻灯片,再批量初始化所有图表容器(包括克隆的):

$(document).ready(function () {
    var mySwiper = new Swiper ('.swiper-container', {
        direction: 'horizontal',
        loop: true,
        pagination: {
            el: '.swiper-pagination',
            type: 'bullets',
            clickable: true
        },
        effect: 'slide',
        // 监听Swiper初始化完成事件
        on: {
            init: function() {
                initRadialCharts();
            }
        }
    });

    // 封装图表初始化函数
    function initRadialCharts() {
        const baseOptions = {
            chart: {
                height: 200,
                type: 'radialBar',
            },
            plotOptions: {
                radialBar: {
                    hollow: {
                        size: '70%',
                    }
                },
            },
            stroke: {
                lineCap: 'round'
            },
            labels: ['Country'],
        };

        // 遍历所有图表容器(原始+克隆)
        document.querySelectorAll('.radial-chart-container').forEach(container => {
            // 避免重复初始化
            if (!container.chartInstance) {
                // 如果需要每个图表数据不同,可以通过data属性传递,这里默认用50
                const series = [container.dataset.series ? parseInt(container.dataset.series) : 50];
                const chart = new ApexCharts(container, {...baseOptions, series});
                chart.render();
                // 把图表实例存到容器元素上,方便后续检查
                container.chartInstance = chart;
            }
        });
    }
});

额外优化:支持不同图表数据

如果你的3个图表需要展示不同的数值,可以给容器加data-series属性:

<div id="demo-chart-1" class="radial-chart-container" data-series="50"></div>
<div id="demo-chart-2" class="radial-chart-container" data-series="75"></div>
<div id="demo-chart-3" class="radial-chart-container" data-series="90"></div>

上面的JS代码已经支持读取这个属性,自动适配不同的series值。

为什么之前的半滑动和相邻切换正常?

因为半滑动时你并没有切换到克隆的幻灯片,相邻切换(1→2、2→3)也是在原始幻灯片之间切换,这些幻灯片里的图表已经被你提前初始化了,所以显示正常。只有首尾循环切换时,才会触发克隆幻灯片的显示,而这些克隆元素里的图表从未被初始化,就出现了空白。

内容的提问来源于stack exchange,提问作者Bhabani Shankar Dash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:42:32