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

Firefox中Input组件大border-radius导致光标变形问题求助

Firefox下大border-radius导致Input光标变形的解决方案

问题描述

给Input组件设置border-radius: 1200px时,Firefox浏览器中光标出现变形;将border-radius改为10px后恢复正常,Chrome无此问题。尝试增加padding可解决但不符合设计要求,需替代方案。

相关代码

CSS部分:

.container {
  display: flex;
  flex-direction: column;
  gap: 3px;
  width: 100%;
}

.input {
  outline: none;
  border: 0.8px solid var(--color-gray4);
  border-radius: 1200px;
  padding: 10px;
  font-family: var(--font-family);
  font-weight: 400;
  font-size: 14px;
  color: var(--color-gray1);
}

.input_title {
  font-family: var(--font-family);
  font-weight: 300;
  font-size: 12px;
  color: var(--color-gray2);
}

.input:focus {
  border: 1px solid var(--color-primary);
  background: var(--color-primary-light);
}

JSX部分:

<form className={styles.container}>
  <label className={styles.input_title} htmlFor={inputId}>
    {children}
  </label>
  <input className={styles.input} {...props} id={inputId}></input>
</form>

可行解决方案

  • 方案1:将border-radius设为元素高度的一半
    Firefox对远大于元素高度一半的border-radius渲染逻辑特殊,会引发光标变形。计算元素实际高度(上下padding+字体大小),将border-radius设为高度的一半,既能保持圆润视觉,又规避光标问题:

    .input {
      /* 示例:10px上下padding + 14px字体大小,高度约34px,设为17px */
      border-radius: 17px;
    }
    
  • 方案2:用mask-image模拟大圆角
    若必须保留超大圆角视觉,可通过CSS mask实现,不修改input本身的border-radius:

    .input {
      border-radius: 0;
      mask-image: radial-gradient(circle, white 100%, transparent 100%);
      overflow: hidden;
    }
    

    注意mask颜色需与input背景色匹配,确保视觉一致。

  • 方案3:外层包裹div实现圆角
    在input外层加一个div,给div设置超大border-radius,input本身用0圆角:

    .input_wrapper {
      border-radius: 1200px;
      overflow: hidden;
      border: 0.8px solid var(--color-gray4);
    }
    
    .input_wrapper:focus-within {
      border-color: var(--color-primary);
      background: var(--color-primary-light);
    }
    
    .input {
      border-radius: 0;
      border: none;
      outline: none;
      padding: 10px;
      /* 其他原有样式保持不变 */
    }
    

    对应JSX调整:

    <form className={styles.container}>
      <label className={styles.input_title} htmlFor={inputId}>
        {children}
      </label>
      <div className={styles.input_wrapper}>
        <input className={styles.input} {...props} id={inputId}></input>
      </div>
    </form>
    

内容的提问来源于stack exchange,提问作者Тимофей

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:07:51