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

调整CSS坐标后水位不贴合容器,需实现指定梯度的水位显示方案

解决水位贴合容器管道及梯度效果实现问题

问题根源

  1. 外部CSS中定义的clip-path与SVG内部的mask/clipPath冲突,导致图片显示异常,同时破坏液体的容器贴合效果。
  2. JS中位移计算的基准值错误,未匹配SVG中液体区域的实际高度,导致水位无法准确对应0-100%的梯度要求。

修正代码

HTML(优化属性兼容性,结构不变)

<input type="number" value="" name="water-level" />
<div class="item">
    <svg viewBox="0 0 300 300">
      <defs>
        <mask id="bottleMask" fill="white">
          <path d="M0,0h300v300H0V0z M89,68h122v147H89V68z" />
        </mask>
        <clipPath id="liquidClip">
          <path d="M89,68h122v147H89V68z" />
        </clipPath>
      </defs>
      <image width="300" href="https://i.ibb.co/HGFQYTj/bottle.png" />
      <path id="tubeLiquid" fill="#74ccf4" d="M0,0h300v300H0V0z" clip-path="url(#liquidClip)" mask="url(#bottleMask)" />
    </svg>
  </div>

CSS(移除冲突的clip-path规则)

.item {
    width: 150px;
    height: 150px;
}

#tubeLiquid {
    background-color: #74ccf4;
}

#bottleMask{
    background-color: #FFFFFF;
}

JS(修正位移计算逻辑)

document.getElementsByName('water-level')[0].addEventListener('change', updateWaterLevel);

function updateWaterLevel() {
  const fractionFull = this.value / 100;
  // 液体区域高度为147,空水位时下移147px,满水位时不下移
  const dy = (1 - fractionFull) * 147;
  document.getElementById("tubeLiquid").setAttribute("transform", `translate(0, ${dy})`);
}

效果说明

  • 输入0:液体完全下移,容器为空
  • 输入25:液体显示1/4高度
  • 输入50:液体显示半满状态
  • 输入75:液体显示3/4高度
  • 输入100:液体完全填充容器管道

内容的提问来源于stack exchange,提问作者Марта

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:53:19