javascript - Responsiveness textContent (graphic) - Stack Overflow

admin2025-04-30  0

I'm trying to adjust the textContent.width property so that it responds as follows:

When the screen size increases (CTRL +) the overflow: truncate and ellipsis: “...” appear gradually so as not to leave the element (vBox). And when it's the other way around (CTRL -), the text appears normally inside vBox. In other words, the text must always adapt to the screen resize.

In other words, the textContent must match the size of the vBox in both cases. I managed to make the vBox responsive, but I need to adjust the text inside it as well.

document.addEventListener("DOMContentLoaded", () => {
    // rounded rectangle
    const valueBox = echarts.graphic.extendShape({
        type: "vBox",
        shape: {
            r: 5
        },
        style: {
            lineWidth: .5,
            stroke: "#000",
            lineDash: 'solid',
            shadowBlur: 7.5,
            shadowColor: '#000', 
            shadowOffsetX: 3,
            shadowOffsetY: 3
        },
        buildPath: (ctx, shape) => {
            echarts.graphic.Rect.prototype.buildPath.call(this, ctx, shape);
        }
    });

    // register shape
    echarts.graphic.registerShape("vBox", valueBox);

    // init
    const chartUse = echarts.init(document.getElementsByClassName("chart")[0]);

    // dimensions
    const dimensionsInit = [chartUse.getWidth(), chartUse.getHeight()];

    window.addEventListener("resize", () => {
        // plot resize
        chartUse.resize();
        // graphic resize
        const dimensionsResize = [chartUse.getWidth(), chartUse.getHeight()];
        chartUse.setOption({
            graphic: [
                {
                    children: [
                        {
                            shape: {
                                x: (dimensionsResize[0] - dimensionsResize[0] / 5) / 2, // Centraliza horizontalmente
                                y: (dimensionsResize[1] - dimensionsResize[1] / 5) / 2, // Centraliza verticalmente
                                width: dimensionsResize[0] / 5,
                                height: dimensionsResize[1] / 5
                            },
                            textContent: {
                                width: dimensionsResize[0],
                                overflow: 'truncate',
                                ellipsis: '...',
                                align: "center",
                                style: {
                                    rich: {
                                        text: {
                                            lineHeight: dimensionsResize[1] / 28,
                                            fill: '#000',
                                            fontSize: dimensionsResize[0] / 70
                                        }
                                    }
                                }
                            },
                            textConfig: {
                                position: 'inside'
                            }
                        }
                    ] 
                }
            ]
        });
    });

    function chartFrameSwitch0 () {

        const gradColor1 = new echarts.graphic.LinearGradient(0, 0, 1, 1, [
            { offset: .5, color: "#fafac0" },
            { offset: 1, color: "#008cba" }
        ])

        const graphic0 = [
            {
                type: "group",
                children: [
                    {
                        type: 'vBox',
                        shape: {
                            x: (dimensionsInit[0] - dimensionsInit[0] / 5) / 2, // Centraliza horizontalmente
                            y: (dimensionsInit[1] - dimensionsInit[1] / 5) / 2, // Centraliza verticalmente
                            width: dimensionsInit[0] / 5,
                            height: dimensionsInit[1] / 5
                        },
                        style: {
                            fill: gradColor1,
                            lineCap: "x",
                            lineWidth: 2,
                            stroke: '#000'
                        },
                        textContent: {
                            style: {
                                text: "{text|Overflowwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n50%}",
                                width: ( (dimensionsInit[0] / 10) - (dimensionsInit[0] / 10) * .15 ),
                                overflow: 'truncate',
                                ellipsis: '...',
                                stroke: '#fff',
                                align: "center",
                                rich: {
                                    text: {
                                        lineHeight: dimensionsInit[1] / 28,
                                        fill: '#000',
                                        fontSize: dimensionsInit[0] / 70
                                    }
                                }
                            }
                        },
                        textConfig: {
                            position: "inside"
                        }
                    }
                ]
            }
        ];

        const option = {
            graphic: graphic0
        };

        chartUse.setOption(option);

    }

    chartFrameSwitch0();

});
<head>
    <script src="/[email protected]/dist/echarts.min.js"></script>
    <title>Custom Shape Example</title>
</head>

<div class="chart" style="width: 100%; height: 100vh;"></div>
转载请注明原文地址:http://anycun.com/QandA/1746024546a91500.html