semantic-ui 的 fixed menu 和 sidebar 放在 body 中运行的很好(这是 sui 的默认设计),可是在 react 应用中,组件体系都是放在比较深的地方,很难直接放在body中,这时,问题不少。css
基本思路:建立一个 sidebar 组件,以此做为 sidebar 的 context,并将内容所有放到 pusher 部分中。react
如此构建,会发现不少问题:navbar 和 sidebar 再也不是 fixed,显示问题,滚动问题……css3
究其缘由,是使用了 css3 transform 属性,这会致使 fixed 元素失效。通过一番探索,这里贴出来一个不完美但还过得去的解决方案。web
首先,构建 sidebar 组件ide
<div ref="context" className="pushable patch">
<div ref="sidebar" className="ui sidebar inverted vertical left menu patch">
...
</div>
<div className="pusher">
{children}
</div>
</div>
注意添加了 .patch 类以便后面进行修复ui
而后,在 componentDidMount 中初始化 sidebarthis
$(this.refs.sidebar).sidebar({ context: $(this.refs.context), transition: 'overlay', mobileTransition: 'overlay' });
注意咱们指定了 context,而且使用 overlay 来用做 transition,以免使用 transform 属性,这是一大限制。spa
而后,打 css 补丁设计
.pushable:not(body).patch { -webkit-transform: unset; transform: unset; } .pushable:not(body) .patch.ui.sidebar { position: fixed; }
首先,消除 context 的 transform 设置,而后,固定 sidebar 位置。大功告成。code
这篇文章仅仅是抛砖引玉,一样面对了这个问题的大神能分享更加优秀的解决方案。