10-17盒子缓冲运动,显示盒子淡入淡出,offset、style.xx、的区别,页面窗口滚动

本文介绍了前端开发中常用的两种动画效果实现方式:缓冲运动和淡入淡出效果,并详细讲解了如何通过JavaScript来控制元素的位置和透明度变化,以及如何响应滚动事件来调整元素位置。

一、缓冲运动:

<script>
window.onload=function(){
var div = document.getElementsByTagName('div')[0];//盒子
var btn = document.getElementById('btn');//点击按钮让盒子移动
var timer=null;
function move(dest){//缓冲运动移到dest位置
clearInterval(timer);
timer=setInterval(function(){
//设置speed为变量,控制逐渐变慢
var speed=(dest-div.offsetLeft)/10;
//speed取整,如果speed大与0就让speed向上取整,否则向下取整
speed=speed>0?Math.ceil(speed):Math.floor(speed);
//控制盒子的left值来控制盒子移动
div.style.left=div.offsetLeft+speed+'px';
},30);
}
btn.onclick=function(){//调用
move(500);
}
}
</script>


二、淡入淡出:

<script>
window.onload=function(){
var timer=null;
var box = document.getElementById('box');
var op=10;//记录box的opacity
function changeOpcity(target){//target为设置最终的透明度
var speed=10;//变化的速度
clearInterval(timer);
timer=setInterval(function(){
if(target>op){//如果设置的最终透明度大与此时的透明度,速度为正,递增
speed=10;
}else{//如果设置的最终透明度小与此时的透明度,速度为负,开始递减
speed=-10;
}
if(target==op){//如果设置的最终透明度等于此时的透明度,则停止计时器
clearInterval(timer);
}else{
op+=speed;//设置变量透明度的变化
box.style.opacity=(op/100);//针对非IE
box.style.filter='alpha(opacity='+op+')';//兼容IE
}
},30);
}
box.onmouseover=function(){
changeOpcity(100);
}
box.onmouseout=function(){
changeOpcity(10);
}
}
</script>


三、参数:

<script type="text/javascript">
//浏览器的页面是由分辨率决定   默认的一屏  宽度:1440(会随着分辨率改变)
// style.width  获取和设置宽度  500px
// offsetWidth  500+'px'    拿到的是number型    获取  但是不能直接设置,如果设置,赋值给style.width=
// width   非行间写法


//left     非行间写法
//style.left  行间 获取和设置  设置没问题   获取(针对行间样式),非行间获取不到
//offsetLeft      能获取   设置值    style.left=offsetLeft(拿到它初始位置,改变原来位置)
// 内容区     自定义   再大不会是整个浏览器的宽度
// 可视区     clientWidth    浏览器的可视区  不包括浏览器默认边距
// 500px    1200px 
//var oClient=document.body.clientWidth;
var oClient=document.body.clientHeight;
//alert(oClient);//1440
var oBox=document.getElementById('box');
//alert(oBox.style.width);//style.width就只能获取得到行间样式
//alert(oBox.offsetWidth);      // 获取值 ,不能直接设置值
</script>

四、滚动事件:

<script type="text/javascript">
//scrollTop   被网页卷去的部分
//记得,只要用到scrollTop就一定有滚动事件(onscroll)
window.onscroll=function(){   //滚动事件,只有鼠标滚动才会加载
var oBox=document.getElementById('box');
var oCon=document.getElementById('con');

var scroll=document.documentElement.scrollTop||document.body.scrollTop;//获取窗口滚动距离
//oBox.style.top=document.documentElement.clientHeight-oBox.offsetHeight+scroll+'px';    //匀速运动的写法
move(document.documentElement.clientHeight-oBox.offsetHeight+scroll);
}
var timer=null;
function move(target){
var oBox=document.getElementById('box');
clearInterval(timer);
timer=setInterval(function(){//缓冲运动三部曲:   缓冲公式    取整   设置值 
var speed=(target-oBox.offsetTop)/10;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
oBox.style.top=oBox.offsetTop+speed+'px';
},30);
}
</script>

<think>好的,用户之前问过如何在GUI中添加过渡动画,特别是页面切换时的闪烁问题。我之前给出了几种方法,包括透明度渐变、内容切换和使用动画库如PyQt的QPropertyAnimation。现在用户提供了更具体的代码片段,使用的是PyQt6,但导入的是PyQt5的模块。这可能是个问题,因为PyQt6和PyQt5在某些模块上有差异。 首先,我需要确认用户是否真的在使用PyQt6,但代码中导入的是PyQt5的QPropertyAnimation。这可能是因为用户复制了PyQt5的示例代码,而他们的项目实际使用的是PyQt6。这时候需要指出模块的差异,并给出正确的PyQt6导入方式。 然后,用户的代码示例中创建了一个新窗口的动画,但可能希望实现窗口切换的过渡效果。需要解释如何在PyQt6中正确使用QPropertyAnimation,包括属性名称和正确的模块导入。同时,可能需要提醒用户关于窗口几何变化时的注意事项,比如确保新窗口的初始位置正确,以及动画持续时间的调整。 另外,用户提到页面切换时会有闪烁,这可能是因为动画执行过程中窗口的绘制问题。可能需要建议使用双缓冲或其他渲染优化技术,或者调整动画的持续时间和缓动曲线,使过渡更平滑。 还要考虑用户可能没有提到的其他因素,比如父窗口的隐藏或显示顺序,是否需要在动画开始前隐藏新窗口,或者在动画结束后保持新窗口的状态。此外,错误处理也是需要考虑的,比如确保new_window有效,或者处理可能的异常情况。 最后,需要提供一个修改后的代码示例,指出PyQt6和PyQt5的区别,并解释每个步骤的作用,同时推荐其他可能的解决方案,比如使用QStackedWidget来管理页面切换动画,这样可能更符合用户的实际需求。</think>在PyQt6中实现窗口切换动画需要注意框架版本差异。你的代码存在两个关键问题: 1. PyQt5与PyQt6模块名称差异(PyQt5.QtCore → PyQt6.QtCore) 2. 动画属性名称需要使用PyQt6的新API 以下是修正后的PyQt6实现方案: ```python from PyQt6.QtCore import QPropertyAnimation, QRect, QEasingCurve from PyQt6.QtWidgets import QWidget # 动画容器(建议使用QWidget或QFrame作为容器) class AnimatedWindow(QWidget): def __init__(self): super().__init__() self.resize(800, 600) def animate_window(self): # 创建动画对象(使用正确的属性名称) self.anim = QPropertyAnimation(self, b"geometry") self.anim.setDuration(300) # 持续时间300ms self.anim.setStartValue(QRect(100, 100, 0, 0)) # 初始状态 self.anim.setEndValue(QRect(100, 100, 800, 600)) # 最终状态 self.anim.setEasingCurve(QEasingCurve.Type.InOutSine) # 缓动曲线 self.anim.start() ``` 建议改进方案: 1. 使用QStackedWidget管理页面切换: ```python from PyQt6.QtCore import QPropertyAnimation, QPoint from PyQt6.QtWidgets import QStackedWidget class TransitionStackedWidget(QStackedWidget): def __init__(self): super().__init__() def setCurrentIndex(self, index): # 创建滑动动画 current_widget = self.currentWidget() next_widget = self.widget(index) # 计算动画偏移量 offset_x = self.width() if index > self.currentIndex() else -self.width() # 设置动画属性 current_widget.anim = QPropertyAnimation(current_widget, b"pos") current_widget.anim.setDuration(500) current_widget.anim.setStartValue(current_widget.pos()) current_widget.anim.setEndValue(current_widget.pos() + QPoint(offset_x, 0)) current_widget.anim.start() super().setCurrentIndex(index) ``` 2. 添加窗口特效: ```python # 添加淡入淡出效果 from PyQt6.QtCore import QPropertyAnimation from PyQt6.QtGui import QGraphicsOpacityEffect def fade_effect(widget): opacity_effect = QGraphicsOpacityEffect(widget) widget.setGraphicsEffect(opacity_effect) anim = QPropertyAnimation(opacity_effect, b"opacity") anim.setDuration(300) anim.setStartValue(0) anim.setEndValue(1) anim.start() return anim ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值