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

React实现买卖双值对比条形UI组件开发方法

交易所买卖占比对比条形图实现方案

UI component example

核心实现逻辑

这个组件属于典型的对称双向条形图(也叫蝴蝶图),不管用什么技术栈,核心逻辑都是一致的:

  • 逐行处理单个交易所的数据:先计算单交易所总成交量 = 卖出(Sold)数值 + 买入(Bought)数值
  • 宽度占比计算:左右两侧条形的宽度,按各自数值占总成交量的比例分配,以中间交易所名称为对称轴左右延伸
  • 视觉区分:卖出侧用红色系、买入侧用绿色系,数值标签贴在条形靠近中间对称轴的位置,方便对照阅读

可选实现路径

根据项目现有技术栈选就行,没必要为了这个组件强行引入重依赖:

  • 零依赖原生实现:用HTML+CSS Flex布局就能写,JS只需要做宽度比例计算,打包体积不到1KB,适合轻量场景
  • 框架封装:如果是React/Vue项目,可以直接封装成通用组件,props接收交易所数组即可,内部自动计算渲染,还能扩展hover提示、点击事件等交互
  • 现有图表库复用:如果项目已经引入了可视化库,直接用内置的双向条形图配置即可,不需要自己写样式:
    • ECharts:将x轴零点设置在容器中间,左侧x轴反向对应卖出数据,右侧x轴正向对应买入数据,y轴填充交易所名称,自带动画、tooltip效果
    • AntV G2:内置对称条形图模板,配置项更精简,适合toB类数据展示场景

核心代码示例(原生Flex方案,无依赖)

DOM结构(以单条数据为例):

<div class="trade-bar-container">
  <!-- 左侧卖出条 -->
  <div class="trade-bar bar-sold" style="width: 32%">
    <span class="bar-num">1234.56</span>
  </div>
  <!-- 中间交易所名称 -->
  <div class="exchange-label">Binance</div>
  <!-- 右侧买入条 -->
  <div class="trade-bar bar-bought" style="width: 41%">
    <span class="bar-num">1567.89</span>
  </div>
</div>

对应CSS:

.trade-bar-container {
  display: flex;
  align-items: center;
  width: 100%;
  height: 34px;
  margin: 6px 0;
}
.trade-bar {
  height: 100%;
  display: flex;
  align-items: center;
  border-radius: 4px;
}
.bar-sold {
  background: #f54646;
  margin-left: auto;
  justify-content: flex-end;
  color: #fff;
}
.bar-bought {
  background: #29c75c;
  margin-right: auto;
  justify-content: flex-start;
  color: #fff;
}
.exchange-label {
  width: 110px;
  flex-shrink: 0;
  text-align: center;
  font-size: 14px;
  padding: 0 10px;
}
.bar-num {
  padding: 0 8px;
  font-size: 12px;
}

宽度计算逻辑(JS):

// 入参为交易所列表,每个元素包含name、sold、bought字段
function calcBarWidth(exchangeList) {
  return exchangeList.map(item => {
    const total = item.sold + item.bought
    // 乘50是因为左右两侧最多各占容器去掉中间标签后一半的宽度,保证对称
    const soldPercent = total === 0 ? 0 : (item.sold / total) * 50
    const boughtPercent = total === 0 ? 0 : (item.bought / total) * 50
    return {
      ...item,
      soldPercent,
      boughtPercent
    }
  })
}

注意细节

  • 边界处理:如果某交易所买卖值总和为0,直接给两侧宽度设为0,避免出现NaN导致样式错乱
  • 可读性优化:可以给条形设置最小宽度(比如24px),避免数值太小的时候条形过窄,内部的数值标签显示不全
  • 响应式适配:移动端场景下可以把中间标签的固定宽度改成自适应,或者调整布局为标签在上、条形在下的结构

内容的提问来源于stack exchange,提问作者Husnain Mehmood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:57:51