1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
private renderLeftCurve({ solid, bgColor }: IRenderItem ) { return ( <div class='left-curve' style={{ background: bgColor, // 渐变背景色 mask: 'url(#cutout-mask)' // 应用 SVG 遮罩 }}> {/* SVG 定义区域:尺寸设为 0x0,不占用布局空间 */} <svg width="0" height="0" style={{ position: 'absolute' }}> <defs> {/* 定义遮罩:创建曲线形状 */} <mask id="cutout-mask"> {/* * 基础白色背景:整个遮罩区域默认完全可见 * 作为遮罩的基础画布 */} <rect width="100%" height="100%" fill="white"/>
{/* * 外层曲线路径:定义曲线的外边界轮廓 * 路径解析:从左上角开始,绘制 60px 半径的右弯弧线 * M 0,0: 移动到坐标 (0,0) * L 72,0: 画直线到 (72,0) * A 60,60 0 0 1 132,60: 画半径60px的弧线到 (132,60) * L 132,105: 画直线到 (132,105) * A 60,60 0 0 1 72,165: 画半径60px的弧线到 (72,165) * L 0,165: 画直线到 (0,165) * Z: 闭合路径 */} <path d="M 0,0 L 72,0 A 60,60 0 0 1 132,60 L 132,105 A 60,60 0 0 1 72,165 L 0,165 Z" fill="white"/>
{/* * 内层曲线路径:创建镂空区域,形成 20px 宽度的曲线带 * 使用 40px 半径,与外层路径形成 20px 的间距 * fill="black": 黑色填充表示该区域被镂空 */} <path d="M 0,20 L 72,20 A 40,40 0 0 1 112,60 L 112,105 A 40,40 0 0 1 72,145 L 0,145 Z" fill="black"/> </mask> </defs> </svg>
{/* 实线边框:当 solid=true 时显示 */} <div class='left-curve-solid-top-line'></div> <div class='left-curve-solid-bottom-line'></div>
{/* 曲线内容区域:包含内层曲线和虚线图标 */} <div class='left-curve-content' style={{ border: solid ? '2px solid #000000' : '', // 实线模式时显示边框 borderLeft: 'none', // 移除左边框避免重叠 }}> {/* 内层曲线:提供额外的视觉层次 */} <div class='left-inner-curve'></div>
{/* 虚线图标:当 solid=false 时显示 */} {!solid && <img class="left-timeline-stop" src={this.theme === 'dark' ? timelineCurveStopWhite : timelineCurveStop} />} </div> </div> ); }
|