在使用 css 的动画属性 transition
时, 如果变化前后以下属性改变会使动画失效。display/text-align
; 所以要维持动画的生效, 保留了 text-align: center
属性, 让搜索字样居中。如下图是动画前后的效果。
受 text-align: center
影响, 为了不让 🔍 icon 居中, 这个时候使用 visibility: hidden
来占位;
onBlur
: 失焦onClear
: 点击清除图标触发清除onFocus
: 聚焦点击叉号的时候, 因为叉号不在 input
输入框内, 所以首先执行的是 onBlur
, 此时失去焦点, 后续执行不了叉号上的 handleClear
逻辑。解决方法如下:
handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {const { onBlur } = this.propsonBlur(e)setTimeout(() => {// 如果点击叉号, 执行到这里时候 document.activeElement === this.inputRefif (document.activeElement !== this.inputRef) {this.setState({ focus: false })}}, 20)}/* 清空输入并重新聚焦 */handleClear = () => {const { onClear, onChange } = this.propsonChange && onChange('')onClear('')this.focus()}focus = () => {if (this.inputRef) {this.inputRef.focus()}}
当点击搜索 icon
的时候, 为了仍保留 input
的聚焦的效果, 使用 z-index
对 input
元素做如下操作。
.demo {position: absolute;z-index: 2;background-color: transparent;}