开发预览 更新于 2026-05-10

StackedBar100 100% 占比柱

横向 100% 堆叠柱,适合占比分布。

基础用法

数据通过 props 传入,纯 SVG 渲染,无第三方图表库依赖。 配色取自 --viz-1..8 token,色盲友好。

背景 视口
src/App.vue
<script setup lang="ts">
import { CfStackedBar100 } from '@chufix-design/vue';
const segments = [
  { name: 'Chrome', value: 65 },
  { name: 'Safari', value: 18 },
  { name: 'Firefox', value: 9 },
  { name: 'Edge', value: 5 },
  { name: 'Other', value: 3 },
];
</script>
<template>
  <CfStackedBar100 :segments="segments" />
</template>
<script setup>
import { CfStackedBar100 } from '@chufix-design/vue';
const segments = [
  { name: 'Chrome', value: 65 },
  { name: 'Safari', value: 18 },
  { name: 'Firefox', value: 9 },
  { name: 'Edge', value: 5 },
  { name: 'Other', value: 3 },
];
</script>
<template>
  <CfStackedBar100 :segments="segments" />
</template>
import { CfStackedBar100 } from '@chufix-design/react';

export default function Demo() {
  const segments = [
    { name: 'Chrome', value: 65 },
    { name: 'Safari', value: 18 },
    { name: 'Firefox', value: 9 },
    { name: 'Edge', value: 5 },
    { name: 'Other', value: 3 },
  ];
  return (
    <>
      <CfStackedBar100 segments={segments} />
    </>
  );
}
import { CfStackedBar100 } from '@chufix-design/react';

export default function Demo() {
  const segments = [
    { name: 'Chrome', value: 65 },
    { name: 'Safari', value: 18 },
    { name: 'Firefox', value: 9 },
    { name: 'Edge', value: 5 },
    { name: 'Other', value: 3 },
  ];
  return (
    <>
      <CfStackedBar100 segments={segments} />
    </>
  );
}

趋势对比

把多年份的占比柱叠在一起,能直观看出份额迁移。

背景 视口
2024 浏览器份额
2025 浏览器份额
src/App.vue
<script setup lang="ts">
import { CfStackedBar100 } from '@chufix-design/vue';
const browsers2024 = [
  { name: 'Chrome', value: 65 },
  { name: 'Safari', value: 18 },
  { name: 'Firefox', value: 9 },
  { name: 'Edge', value: 5 },
  { name: 'Other', value: 3 },
];
const browsers2025 = [
  { name: 'Chrome', value: 62 },
  { name: 'Safari', value: 20 },
  { name: 'Firefox', value: 7 },
  { name: 'Edge', value: 8 },
  { name: 'Other', value: 3 },
];
</script>
<template>
  <div style="display: flex; flex-direction: column; gap: 14px;">
    <div>
      <div style="font-size: 12px; color: var(--fg-2); margin-bottom: 4px;">2024 浏览器份额</div>
      <CfStackedBar100 :segments="browsers2024" />
    </div>
    <div>
      <div style="font-size: 12px; color: var(--fg-2); margin-bottom: 4px;">2025 浏览器份额</div>
      <CfStackedBar100 :segments="browsers2025" />
    </div>
  </div>
</template>
<script setup>
import { CfStackedBar100 } from '@chufix-design/vue';
const browsers2024 = [
  { name: 'Chrome', value: 65 },
  { name: 'Safari', value: 18 },
  { name: 'Firefox', value: 9 },
  { name: 'Edge', value: 5 },
  { name: 'Other', value: 3 },
];
const browsers2025 = [
  { name: 'Chrome', value: 62 },
  { name: 'Safari', value: 20 },
  { name: 'Firefox', value: 7 },
  { name: 'Edge', value: 8 },
  { name: 'Other', value: 3 },
];
</script>
<template>
  <div style="display: flex; flex-direction: column; gap: 14px;">
    <div>
      <div style="font-size: 12px; color: var(--fg-2); margin-bottom: 4px;">2024 浏览器份额</div>
      <CfStackedBar100 :segments="browsers2024" />
    </div>
    <div>
      <div style="font-size: 12px; color: var(--fg-2); margin-bottom: 4px;">2025 浏览器份额</div>
      <CfStackedBar100 :segments="browsers2025" />
    </div>
  </div>
</template>
import { CfStackedBar100 } from '@chufix-design/react';

export default function Demo() {
  const browsers2024 = [
    { name: 'Chrome', value: 65 },
    { name: 'Safari', value: 18 },
    { name: 'Firefox', value: 9 },
    { name: 'Edge', value: 5 },
    { name: 'Other', value: 3 },
  ];
  const browsers2025 = [
    { name: 'Chrome', value: 62 },
    { name: 'Safari', value: 20 },
    { name: 'Firefox', value: 7 },
    { name: 'Edge', value: 8 },
    { name: 'Other', value: 3 },
  ];
  return (
    <>
      <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <div>
            <div style={{ fontSize: 12, color: "var(--fg-2)", marginBottom: 4 }}>2024 浏览器份额</div>
            <CfStackedBar100 segments={browsers2024} />
          </div>
          <div>
            <div style={{ fontSize: 12, color: "var(--fg-2)", marginBottom: 4 }}>2025 浏览器份额</div>
            <CfStackedBar100 segments={browsers2025} />
          </div>
        </div>
    </>
  );
}
import { CfStackedBar100 } from '@chufix-design/react';

export default function Demo() {
  const browsers2024 = [
    { name: 'Chrome', value: 65 },
    { name: 'Safari', value: 18 },
    { name: 'Firefox', value: 9 },
    { name: 'Edge', value: 5 },
    { name: 'Other', value: 3 },
  ];
  const browsers2025 = [
    { name: 'Chrome', value: 62 },
    { name: 'Safari', value: 20 },
    { name: 'Firefox', value: 7 },
    { name: 'Edge', value: 8 },
    { name: 'Other', value: 3 },
  ];
  return (
    <>
      <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <div>
            <div style={{ fontSize: 12, color: "var(--fg-2)", marginBottom: 4 }}>2024 浏览器份额</div>
            <CfStackedBar100 segments={browsers2024} />
          </div>
          <div>
            <div style={{ fontSize: 12, color: "var(--fg-2)", marginBottom: 4 }}>2025 浏览器份额</div>
            <CfStackedBar100 segments={browsers2025} />
          </div>
        </div>
    </>
  );
}

API

属性类型默认值说明
segmentsStackedBar100Series[]{ name, value, colorIndex? }[]
widthnumber480SVG 宽度
heightnumber24柱高度
showLegendbooleantrue显示图例
ariaLabelstring透传给根 <svg>aria-label

Events

Vue 事件React 回调载荷类型说明
item-enteronItemEnterStackedBar100InteractionPayload鼠标进入某段时触发
item-leaveonItemLeaveStackedBar100InteractionPayload鼠标离开某段时触发

类型

interface StackedBar100InteractionPayload {
  segment: StackedBar100Series;
  dataIndex: number;
  /** 该段占总和的比例(0..1)。 */
  pct: number;
  nativeEvent?: PointerEvent;
}

反馈与讨论

StackedBar100 100% 占比柱 的讨论

0
0 / 600
正在加载评论...