Angular 1 Material FAB inside Angular 1 个组件没有粘在右下角
Angular 1 Material FAB inside Angular 1 component not sticking bottom right
在我的主页上,我用 Angular 1 Material 和 ui-router:
<body layout="column">
<md-button class="md-fab md-raised md-primary md-fab-bottom-right" aria-label="Add Test">
<md-icon>add</md-icon>
</md-button>
<md-content>
<ol>
<li>foobar</li>
<!--repeat a bunch of times-->
</ol>
</md-content>
</body>
这让我在右下角有一个浮动的 FAB,用于添加 foobar。当我向上滚动列表时,FAB 将保持不变。正是我想要的。
但是如果我将 那个确切的内容 放在一个组件中,它会搞砸滚动!
<body layout="column">
<my-component></my-component>
</body>
如果组件具有 完全相同的内容,只需移动到组件模板,fab 就会显示在基本正确的位置……但是当我向上滚动列表时, FAB 随之向上滚动!
如果我搞砸并添加 <md-content>
的各个层,我可以让 FAB 显示在列表底部 ,如果它大于viewport 意味着 FAB 出现在屏幕下方(甚至更糟)--- 并且仍然随着列表向上滚动。
简而言之,关于创建 Angular 组件的一些事情完全搞砸了 FAB 放置,并将其锁定到列表,以便它随列表滚动。
求助!这是非常大的。我无法将我所有的 FAB 从它们的组件中分离出来,并根据当前的 state/windows/whatever 使用一些奇怪的 show/hide 指令将它们单独放在主页上。我该如何解决这个问题?
md-fab-bottom-right
CSS-class 使 FAB position: absolute
并且因此它被定位在链上的下一个 DOM 元素内 position: relative
。在你的例子中是 <body>
。您似乎希望 FAB 始终位于 md-list
视口的底部。
因此,您必须将 FAB 和 md-list
放在另一个 md-content
中。 md-content
提供了一个 relative
包装器。
重要的是还要在外 md-content
.
上添加 flex layout="column"
<!-- in component template -->
<div layout="row">
<md-content flex layout="column">
<md-button class="md-fab md-raised md-primary md-fab-bottom-right" aria-label="Add FooBar">
<md-icon>add</md-icon>
</md-button>
<md-content>
<md-list>
<md-list-item class="md-2-line" ng-repeat="foobar in $ctrl.getFooBars()" ng-click="null">
<div class="md-list-item-text">
<h3>{{foobar.id}}</h3>
<p>foobar</p>
</div>
</md-list-item>
</md-list>
</md-content>
</md-content>
<md-sidenav md-component-id="add-foobar" class="md-sidenav-right">
<create-foobar-component></create-foobar-component>
</md-sidenav>
</div>
我制作了一个代码笔来展示这个:http://codepen.io/kuhnroyal/pen/mRyqVW
如果这没有帮助,请添加代码笔或可以重现您的问题的东西。
更新 1:
通过使用组件和 ui-router,您可能也会 运行 进入我几个月前创建的这个问题:https://github.com/angular-ui/ui-router/issues/2838
更新二:
您的 angular 组件默认是一个自定义 HTML 标签,其行为类似于 div
(因为它默认具有 display: block
)。要使 angular-material 正常工作,您需要保留一个 DOM 结构,该结构从上到下具有 flex
和 layout="column|row"
。因此,如果您正在使用 ui-路由器模板,请参阅更新 1,否则将其添加到您的 angular 组件模板中。
所以 Angular 带有 FAB 的 1.5 布局是我很长时间以来看到的最乏味、最脆弱的东西之一。
我想要一个固定的工具栏和选项卡集,下面有一个滚动列表。该列表应该在一个组件中,并且它应该维护自己的 FAB。列表组件应由 ui-router 放置。哎呀,疼。
这是解决方案 --- 唯一可行的 column/row/md-content/div 组合。更改其中任何一项都会使整个事情发生变化。
这是主页:
<body layout="column">
<md-toolbar>
<div class="md-toolbar-tools">
<h1>Foo</h1><span flex></span><small>bar</small>
</div>
</md-toolbar>
<md-tabs md-border-bottom>
<md-tab label="FooBar" ui-sref="foobar"></md-tab>
</md-tabs>
<div ui-view flex layout="column"></div>
</body>
这是 ui-路由器状态:
$stateProvider.state({
name: "foobar",
url: "/foobar",
template: "<foobar-widget layout='row'/>"
});
这里是 FoobarWidget-template.html
:
<md-content flex layout="column">
<md-button ngclass="md-fab md-raised md-primary md-fab-bottom-right" aria-label="Add Foobar">
<md-icon>add</md-icon>
</md-button>
<md-content>
<md-list>
<md-list-item ng-repeat="foobar in $ctrl.getFoobars()" ng-click="null">
<!-- list-item content -->
</md-list-item>
</md-list>
</md-content>
</md-content>
注意layout="column"
和layout="column"
系列的顺序。当您添加 <ui-view>
的额外层,然后在其中放置一个 <foobar-widget>
组件时,它变得特别棘手,但您仍然必须在 <ui-view>
周围包裹一个 <md-content>
。这些层中的每一层都必须考虑在内,否则它会抛弃整个事情。请注意,我根据 kuhnroyal 的进一步建议从 <md-content layout="column"><ui-view layout="column"></ui-view></md-content>
改进为 <div ui-view flex layout="column"></div>
。
在某些情况下,问题不在于 FAB 没有与街区右侧的底部相关联;这是父对象允许块垂直扩展,因此出现的滚动可能来自 its 父对象,包含扩展块,其中包含 FAB 的内容。或类似的东西。我希望这能继续工作。我不想再折腾了。
kuhnroyal 在他的回答中给了我解决方案的提示,他对 ui-router issue 的 link 让我明白了在 ui-router 中使用该组件的可能性状态模板,看看我是否可以将布局按摩成有效的东西。所以我很乐意给 kuhnroyal 赏金,即使他的回答对我的情况来说并不是完全即插即用。感谢您的回复!
在我的主页上,我用 Angular 1 Material 和 ui-router:
<body layout="column">
<md-button class="md-fab md-raised md-primary md-fab-bottom-right" aria-label="Add Test">
<md-icon>add</md-icon>
</md-button>
<md-content>
<ol>
<li>foobar</li>
<!--repeat a bunch of times-->
</ol>
</md-content>
</body>
这让我在右下角有一个浮动的 FAB,用于添加 foobar。当我向上滚动列表时,FAB 将保持不变。正是我想要的。
但是如果我将 那个确切的内容 放在一个组件中,它会搞砸滚动!
<body layout="column">
<my-component></my-component>
</body>
如果组件具有 完全相同的内容,只需移动到组件模板,fab 就会显示在基本正确的位置……但是当我向上滚动列表时, FAB 随之向上滚动!
如果我搞砸并添加 <md-content>
的各个层,我可以让 FAB 显示在列表底部 ,如果它大于viewport 意味着 FAB 出现在屏幕下方(甚至更糟)--- 并且仍然随着列表向上滚动。
简而言之,关于创建 Angular 组件的一些事情完全搞砸了 FAB 放置,并将其锁定到列表,以便它随列表滚动。
求助!这是非常大的。我无法将我所有的 FAB 从它们的组件中分离出来,并根据当前的 state/windows/whatever 使用一些奇怪的 show/hide 指令将它们单独放在主页上。我该如何解决这个问题?
md-fab-bottom-right
CSS-class 使 FAB position: absolute
并且因此它被定位在链上的下一个 DOM 元素内 position: relative
。在你的例子中是 <body>
。您似乎希望 FAB 始终位于 md-list
视口的底部。
因此,您必须将 FAB 和 md-list
放在另一个 md-content
中。 md-content
提供了一个 relative
包装器。
重要的是还要在外 md-content
.
flex layout="column"
<!-- in component template -->
<div layout="row">
<md-content flex layout="column">
<md-button class="md-fab md-raised md-primary md-fab-bottom-right" aria-label="Add FooBar">
<md-icon>add</md-icon>
</md-button>
<md-content>
<md-list>
<md-list-item class="md-2-line" ng-repeat="foobar in $ctrl.getFooBars()" ng-click="null">
<div class="md-list-item-text">
<h3>{{foobar.id}}</h3>
<p>foobar</p>
</div>
</md-list-item>
</md-list>
</md-content>
</md-content>
<md-sidenav md-component-id="add-foobar" class="md-sidenav-right">
<create-foobar-component></create-foobar-component>
</md-sidenav>
</div>
我制作了一个代码笔来展示这个:http://codepen.io/kuhnroyal/pen/mRyqVW
如果这没有帮助,请添加代码笔或可以重现您的问题的东西。
更新 1: 通过使用组件和 ui-router,您可能也会 运行 进入我几个月前创建的这个问题:https://github.com/angular-ui/ui-router/issues/2838
更新二:
您的 angular 组件默认是一个自定义 HTML 标签,其行为类似于 div
(因为它默认具有 display: block
)。要使 angular-material 正常工作,您需要保留一个 DOM 结构,该结构从上到下具有 flex
和 layout="column|row"
。因此,如果您正在使用 ui-路由器模板,请参阅更新 1,否则将其添加到您的 angular 组件模板中。
所以 Angular 带有 FAB 的 1.5 布局是我很长时间以来看到的最乏味、最脆弱的东西之一。
我想要一个固定的工具栏和选项卡集,下面有一个滚动列表。该列表应该在一个组件中,并且它应该维护自己的 FAB。列表组件应由 ui-router 放置。哎呀,疼。
这是解决方案 --- 唯一可行的 column/row/md-content/div 组合。更改其中任何一项都会使整个事情发生变化。
这是主页:
<body layout="column">
<md-toolbar>
<div class="md-toolbar-tools">
<h1>Foo</h1><span flex></span><small>bar</small>
</div>
</md-toolbar>
<md-tabs md-border-bottom>
<md-tab label="FooBar" ui-sref="foobar"></md-tab>
</md-tabs>
<div ui-view flex layout="column"></div>
</body>
这是 ui-路由器状态:
$stateProvider.state({
name: "foobar",
url: "/foobar",
template: "<foobar-widget layout='row'/>"
});
这里是 FoobarWidget-template.html
:
<md-content flex layout="column">
<md-button ngclass="md-fab md-raised md-primary md-fab-bottom-right" aria-label="Add Foobar">
<md-icon>add</md-icon>
</md-button>
<md-content>
<md-list>
<md-list-item ng-repeat="foobar in $ctrl.getFoobars()" ng-click="null">
<!-- list-item content -->
</md-list-item>
</md-list>
</md-content>
</md-content>
注意layout="column"
和layout="column"
系列的顺序。当您添加 <ui-view>
的额外层,然后在其中放置一个 <foobar-widget>
组件时,它变得特别棘手,但您仍然必须在 <ui-view>
周围包裹一个 <md-content>
。这些层中的每一层都必须考虑在内,否则它会抛弃整个事情。请注意,我根据 kuhnroyal 的进一步建议从 <md-content layout="column"><ui-view layout="column"></ui-view></md-content>
改进为 <div ui-view flex layout="column"></div>
。
在某些情况下,问题不在于 FAB 没有与街区右侧的底部相关联;这是父对象允许块垂直扩展,因此出现的滚动可能来自 its 父对象,包含扩展块,其中包含 FAB 的内容。或类似的东西。我希望这能继续工作。我不想再折腾了。
kuhnroyal 在他的回答中给了我解决方案的提示,他对 ui-router issue 的 link 让我明白了在 ui-router 中使用该组件的可能性状态模板,看看我是否可以将布局按摩成有效的东西。所以我很乐意给 kuhnroyal 赏金,即使他的回答对我的情况来说并不是完全即插即用。感谢您的回复!