近期接手了个iview实现的后台管理系统,需要添加个输入框,根据输入信息查询的功能,还需要展示搜索历史。
看了下iview组件,里面有个AutoComplete 自动完成组件,看了下这个效果,跟想要的类似,那就用这个。
组件是挺好用的,但测试提了个问题:弹出的内容在页面宽度改变的时候不跟着input走,而是一直定在原处(这都能测到,也是可以的)。
立马看了下代码,对照AutoComplete组件,发现貌似确实有问题: https://codepen.io/jiangguangyao/pen/wvPadGy 页面demo布局大致如下,在搜索历史展示的时候,再修改屏幕的宽度,你会发现,搜索历史内容区并不会跟着上面input走(demo中父级用的flex布局,通过float将此组件浮动到右侧效果相同)。
看了下API,有个 transfer 属性,意思是是否将弹层放于body内,默认false,还提供了个transfer-class-name,给浮层添加额外class(transfer为true时用)
既然有这俩属性,那就试着改下
举例: transfer-class-name属性值为autoCompleteClass,因为下方浮层是定位的,那就让他居右定位,给这个属性加上 right ,让他以右边侧进行定位,再将原先的 left 值设auto (注意权重,都需加 !important )
看了下效果,完美,但是!!!当右侧出现滚动条呢???在打开后修改宽度的过程中,如果出现滚动条从无到有/从有到无的情况,浮层会偏移一个滚动条的宽度!!!
难受,这条路走不通了
没办法,打开控制台查验,下方搜索历史区的组件是有定位的,left值居然这么大,这定位难道是根据浏览器定的?在屏幕宽度改变的时候,left值不变,基本可以估计出,当前组件并没有根据屏幕宽度动态计算偏移量的操作。
那能不能让他跟着input框走?看了下,浮层是absolute 绝对定位,跟input是同一层级的,但是,此组件外面是有包裹的,相当于一个大盒子,内嵌一个input和一个浮层,我们都知道,绝对定位是相对于据他最近的第一个父元素的定位关系(static除外)进行定位的,那这直接给盒子加个定位不就完了?
OK,直接给盒子加上相对定位,完美!!! https://codepen.io/jiangguangyao/pen/JjOdNxE (右浮动,且加上定位的解决方案 ---- flex布局的同理)
问题总结: 因为之前一直是玩的element-ui的,个人感觉element-ui还是相当不错的,虽然我常骂他垃圾,已经发现的,况且都提上issue的bug也不改,但他最起码的,有解决方案,这个框架能适应大多数场景,拿来即用,基本上除了数据,剩下的问题都不需要操心,人家全给你想好了想到了,还是比较方便的,因此形成了个固定思维: 遇到问题先看API,API能解决的,直接解决,解决不了的,在找其他办法。相较而言,我还是更愿意相信官方的,拿此处举例,问题的解决方法,就是给AutoComplete标签上写个relative定位,就解决了,但当初封装这个框架的时候,为何不给封进去,像我这样加会不会有什么问题,可能的问题是什么,还是需要好好了解了解,有遇到相同问题的,可以看下。