前言
最近遇到一个几年前的小问题,但当时没有做记录,久了就忘记了,以至于卡了好一会儿才恍然大悟,现在做一个记录,方便日后查看。
问题描述
鼠标滚动到一定距离显示返回顶部按钮,点击返回顶部按钮或鼠标滚动到顶部后按钮消失,
然后我想给显示隐藏的过程增加一个过渡效果,这样自然平滑一些,但该效果始终未生效
css代码和js代码如下
.back-btn { display: none; position: fixed; right: 30px; bottom: 30px; z-index: 99; width: 40px; height: 40px; line-height: 40px; text-align: center; color: #878787; box-shadow: 0 0 3px 0 #bfbfbf; background-color: #fff; cursor: pointer; }
window.onscroll = function () { let backTop = document.getElementById("backTop"), clientHeight = document.documentElement.clientHeight, osTop = document.documentElement.scrollTop || document.body.scrollTop; if (osTop >= clientHeight) { backTop.style.cssText += 'display: block;transition: all 1s'; } else { backTop.style.cssText += 'display: none;transition: all 1s'; } }
分析原因
发现是display:none属性的原因,因为display是状态属性,它的改变会导致从一个状态直接跳到另外一个状态,所以不存在渐变动画。
解决方法
使用opacity来实现。opacity是控制透明度的属性,当透明度为0时,元素为不可见,
修改然后把上面代码中的display属性替换成opacity即可,
注:不过opacity:0与display:none不同的是,前者只是眼睛看不见,
但实际元素还是占据了相应位置,后者则元素完全隐藏,不占据任何位置
.back-btn { /* display: none; */ opacity: 0; position: fixed; right: 30px; bottom: 30px; z-index: 99; width: 40px; height: 40px; line-height: 40px; text-align: center; color: #878787; box-shadow: 0 0 3px 0 #bfbfbf; background-color: #fff; cursor: pointer; }
window.onscroll = function () { let backTop = document.getElementById("backTop"), clientHeight = document.documentElement.clientHeight, osTop = document.documentElement.scrollTop || document.body.scrollTop; if (osTop >= clientHeight) { backTop.style.cssText += 'opacity: 1;transition: all 1s'; } else { backTop.style.cssText += 'opacity: 0;transition: all 1s'; } }
有需要的朋友可以领取支付宝到店红包,能省一点是一点