【问题标题】:How can I smoothly slide a flexbox side panel offscreen?如何平滑地将 flexbox 侧面板滑出屏幕?
【发布时间】:2016-06-16 22:02:28
【问题描述】:

我有一个基于 Angular Material 构建的相当简单的 flex 布局。它有一个可以滑出屏幕的侧面板。我目前正在使用负边距来处理这个问题,以便主内容框通过宽度调整跟随其移动,works well。但是,这会导致动画不流畅。显然,图形渲染机制比翻译更麻烦。

如何使用translateX 完成相同的操作?这是我的演示布局:

<div ng-app="sandbox" layout="row" class="wrapper" ng-class="{'sidebar-out': sidebarOut}">
    <div flex="60" class="main md-padding">
        <h1>Main Content</h1>
        <button class="toggler" ng-click="sidebarOut=!sidebarOut">Toggle sidebar</button>
    </div>

    <div flex="40" class="sidebar md-padding">
        <h2>Sidebar</h2>
    </div>
</div>

侧边栏的移动由简单的 Angular 指令和 CSS 处理:

.sidebar-out .sidebar {
    transform: translateX(40vw)
}

Fiddle demo

问题在于主内容框没有调整大小,因为侧边栏在屏幕外平移。我怎样才能做到这一点?非常感谢。

【问题讨论】:

    标签: css-transitions angular-material css-transforms


    【解决方案1】:

    这有帮助吗? - Fiddle

    我认为可能有更好的方法来做到这一点......

    .sidebar-out .main {
        transform: scaleX(1.7)
    }
    

    标记

    <div ng-app="sandbox" layout="row" class="wrapper" ng-class="{'sidebar-out': sidebarOut}">
        <div id="newMain" flex="60">
          <div id="mainContent">
            <h1>Main Content</h1>
            <button class="toggler" ng-click="sidebarOut=!sidebarOut">Toggle sidebar</button>
          </div>
          <div class="main md-padding">
          </div>
        </div>
    
        <div flex="40" class="sidebar md-padding">
            <h2>Sidebar</h2>
        </div>
    </div>
    

    CSS

    .wrapper {
        background: pink;
        overflow: hidden;
    }
    #newMain {
      position: relative;
      width: 100vw;
      height: 100vh;
    }
    #mainContent {
      position: absolute;
      z-index: 1;
    }
    .sidebar,
    .main {
        height: 100vh;
    }
    .main {
        background: #fff;
        transition: all .5s;
        transform-origin: 0 0;
    }
    .sidebar-out .main {
        transform: scaleX(1.7)
    }
    
    .sidebar {
        background: #ddd;
        transition: all .5s;
    }
    .sidebar-out .sidebar {
        transform: translateX(40vw)
    }
    

    【讨论】:

    • 谢谢。您在这里提供一种还是两种解决方案?小提琴演示在两个轴上都有滚动条。你能补救吗?
    • @isherwood 在我研究之前,我想知道 Sidenav 是否不是更好的解决方案 - material.angularjs.org/latest/demo/sidenav。我认为这是实现目标的好方法。您当前的解决方案似乎混合了 flex 和 transitions,这并不理想。
    • 谢谢,但我不希望侧边栏覆盖页面的主要内容区域。我们将布局更改为不使用移动/肖像侧边栏。
    • @isherwood 查看更新的 Fiddle(和答案)以了解没有滚动条。我目前只提供一种解决方案 :-) 我只是想知道是否没有比使用幻数 1.7 用于 scaleX 更好的 CSS 方法。
    • 内容似乎没有变化。我不知道为什么我看不到粉红色,但看看:jsfiddle.net/isherwood/f95a4a24
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多