账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js引擎的事件队列和渲染引擎之间的执行过程是怎么样的一个顺序、交互过程和联系?抽屉动画的实现?
    52
    0

    最近在看浏览器的工作原理,继而想到之前实现的一个抽屉动画,从左至右拉出的那种效果。
    伪代码如下:

    //css
    .drawer {
        display: none;
        width: 50vw;
        height: 100vh;
        position: absolute;
        left: -50vw;
        top: 0;
        transition: height 1s linear;
    }
    
    .drawer-show {
        left: 0;
    }
    
    // js
    
    function showDrawer(){
        let drawerDiv = document.getElementsByClassname('drawer')
        drawerDiv.style.display = 'block'    //1.
        drawerDiv.classList.add('drawer-show')  //2.
    }
    
    function closeDrawer(){
        let drawerDiv = document.getElementsByClassname('drawer')
        drawerDiv.classList.remove('drawer-show')  //5.
        drawerDiv.style.display = 'none'    //6.
    }
    
    //html
    <div class='drawer'>
        <!-- content -->
        <!-- content -->
        <!-- content -->
    </div>
    <div class='button-show-drawer' onclick="showDrawer">click</div>

    代码的大致思路是将drawer层放到视口之外,transition他的left属性,当点击事件发生的时候覆盖left样式,因为transiton的原因会实现从左到右平移。
    但是因为display:none 的存在,即使先设置block,transtion动画仍然会失效。
    于是改造了showDrawer和closeDrawer函数,如下:

    //js
    function showDrawer() {

    let drawerDiv = document.getElementsByClassname('drawer')
    drawerDiv.style.display = 'block'   // 3.
    setTimeout(()=>{  
       drawerDiv.classList.add('drawer-show')  //4.
    })

    }

    function closeDrawer(){

    let drawerDiv = document.getElementsByClassname('drawer')
    drawerDiv.classList.remove('drawer-show')  //5.
    setTimeout(()=>{
       drawerDiv.style.display = 'none'    //6.
    }, 1000)

    }

    于是,保留了在display的情况下,transtion也能够正常运行了。
    之前了解到,js引擎在解析代码时,遇到setTimeout这种异步方法时,会创建宏任务,待到主线程中任务执行完了,再去调用微任务,宏任务……如此循环。

    那么问题来了,
    1.如何避免display为none的情况下(或者说改变display的情况下),仍然使动画生效。

    2.js 操作DOM的时候,是即时生效的吗?如1.和2.行中的代码是立即block了,然后添加了transition。还是如3.和4.行中的代码每一个任务队列执行“一批”dom操作。因为一批操作的原因使block已经生效,于是使后面的也能够transition生效。

    3.我观察antd-mobile中的drawer实现,似乎是transition抽屉元素的translateX,但是会有后遗症,虽然平移走了drawer,但仍然会有一层layer层覆盖在表面顺带还阻止穿透了...于是我通过上述setTimeout方法,来移除layer层,避免了问题1.是不是我的使用方法有问题...

    4.我感觉我解决方法(改造后的showDrawer函数)不太规范,有没有其他实现类似drawer动画的方法。

    5.“浏览器渲染引擎和js引擎间的交互”, 有没有专业一点的名词?我好去翻下书?

    以上问题来源是在React.js下写代码的时候提出的。

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • ぴ夏末ζ烟雨﹌ 普通会员 1楼

      事件队列和渲染引擎之间的执行过程可以分为以下几步:

      1. 触发事件:当用户交互时,事件(如点击、滑动等)会被触发到浏览器。

      2. 创建事件处理程序:然后,事件处理程序会被创建。事件处理程序会监听事件,当事件发生时,就会执行相应的代码。

      3. 调用渲染引擎:然后,渲染引擎会调用相应的代码,以实现页面的渲染。渲染引擎的主要任务是将页面的HTML、CSS和JavaScript代码转换为可以被浏览器渲染的格式。

      4. 创建DOM元素:最后,渲染引擎会创建DOM元素,并将它们添加到页面中。DOM元素是页面上的基本元素,它们是网页内容的物理表示。

      事件队列和渲染引擎之间的交互过程:

      在浏览器中,事件处理器(如JavaScript)会在用户交互时被触发,然后会调用渲染引擎。渲染引擎在接收到事件处理器的调用后,会执行相应的代码,以实现页面的渲染。在这个过程中,事件处理器会监听事件,当事件发生时,就会执行相应的代码。

      在事件处理程序中,事件处理器会创建DOM元素,并将它们添加到页面中。渲染引擎会创建这些DOM元素,并将它们添加到页面中。在这个过程中,渲染引擎会将页面的HTML、CSS和JavaScript代码转换为可以被浏览器渲染的格式。

      抽屉动画的实现:

      抽屉动画是一种非常常见的动画效果,它使用JavaScript来实现。抽屉动画的基本思想是,通过改变元素的位置来模拟抽屉的上下移动。具体来说,它会创建一个容器元素,然后将元素添加到容器中。然后,它会使用JavaScript来改变容器元素的位置,从而模拟抽屉的上下移动。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部