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

如何用ReactJS+TailwindCSS实现带斜切圆角边框的切换标签

React + TailwindCSS 实现带斜切边框的可切换标签组件

问题分析

你之前用 clip-path 的方案会直接裁剪元素,导致圆角和边框被破坏——因为裁剪会切掉元素的边角部分,无法同时保留圆角完整显示和边框效果。下面用伪元素模拟斜切+状态控制切换的方案解决这个问题,同时满足标签上下切换的需求。

完整实现代码

import { useState } from 'react';

const TabSwitcher = () => {
  // 管理激活标签状态,默认激活Restake
  const [activeTab, setActiveTab] = useState('restake');

  const handleTabToggle = (tabName) => {
    setActiveTab(tabName);
  };

  return (
    <div className="relative w-fit">
      {/* Restake 标签 */}
      <button
        onClick={() => handleTabToggle('restake')}
        className={`relative px-6 py-3 transition-all duration-300 cursor-pointer ${
          activeTab === 'restake'
            ? 'bg-[#0F162A] text-white rounded-tr-2xl border border-blue-500 z-10 top-0'
            : 'bg-[#1A202C] text-gray-400 rounded-br-2xl border border-gray-700 top-2'
        }`}
      >
        Restake
        {/* 非激活时显示斜切遮罩 */}
        {activeTab !== 'restake' && (
          <div 
            className="absolute top-0 right-0 w-10 h-full bg-[#1A202C] border-r border-gray-700"
            style={{ clipPath: 'polygon(0 0, 100% 0, 100% 100%)' }}
          ></div>
        )}
      </button>

      {/* Dashboard 标签 */}
      <button
        onClick={() => handleTabToggle('dashboard')}
        className={`absolute right-0 px-6 py-3 transition-all duration-300 cursor-pointer ${
          activeTab === 'dashboard'
            ? 'bg-[#0F162A] text-white rounded-bl-2xl border border-blue-500 z-10 top-0'
            : 'bg-[#1A202C] text-gray-400 rounded-tl-2xl border border-gray-700 top-2'
        }`}
      >
        Dashboard
        {/* 非激活时显示斜切遮罩 */}
        {activeTab !== 'dashboard' && (
          <div 
            className="absolute top-0 left-0 w-10 h-full bg-[#1A202C] border-l border-gray-700"
            style={{ clipPath: 'polygon(100% 0, 0 100%, 100% 100%)' }}
          ></div>
        )}
      </button>
    </div>
  );
};

export default TabSwitcher;

关键实现细节

  1. 状态控制切换

    • 用 useState 跟踪当前激活的标签,点击时切换状态
    • 激活标签通过 z-index:10 置顶,top:0 保持在上层;非激活标签 top:2 下移,实现上下位置切换
  2. 斜切效果实现

    • 放弃直接裁剪主元素,改用绝对定位的子元素作为斜切遮罩:
      • 遮罩背景和边框与非激活标签一致
      • 用 clip-path 裁剪遮罩成斜角形状,覆盖在标签边缘,模拟斜切效果
      • 主元素保留完整的圆角和边框,不受裁剪影响
  3. 样式区分

    • 激活标签:深色背景 #0F162A、白色文字、蓝色边框、对应圆角
    • 非激活标签:浅灰背景 #1A202C、灰色文字、灰色边框、反向圆角
    • 加入 transition-all duration-300 实现平滑切换动画

内容的提问来源于stack exchange,提问作者Prabhat kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:55:54