【问题标题】:How to collapse react-bootstrap accordion panel horizontally?如何水平折叠 react-bootstrap 手风琴面板?
【发布时间】:2019-03-13 13:32:50
【问题描述】:

我正在使用来自 React-Bootstrap 页面的 Panel 组件 - https://react-bootstrap.github.io/components/panel/ - 我想使用他们的手风琴功能,但需要注意的是面板主体 (Panel.Body) 水平打开(打开到右侧显示的 Panel.Headings)。

这是他们页面中的示例之一:

const PanelGroup = ReactBootstrap.PanelGroup;
const Panel = ReactBootstrap.Panel;

class App extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <PanelGroup accordion id="accordion-uncontrolled-example">
        <Panel style={{ display: 'flex' }} eventKey="1">
          <Panel.Heading style={{ margin: '0 2% 0 0' }}>
            <Panel.Title toggle>Panel heading 1</Panel.Title>
          </Panel.Heading>
          <Panel.Body collapsible>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
          </Panel.Body>
        </Panel>
        <Panel style={{ display: 'flex' }} eventKey="2">
          <Panel.Heading style={{ margin: '0 2% 0 0' }}>
            <Panel.Title toggle>Panel heading 2</Panel.Title>
          </Panel.Heading>
          <Panel.Body collapsible>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
          </Panel.Body>
        </Panel>
        <Panel style={{ display: 'flex' }} eventKey="3">
          <Panel.Heading style={{ margin: '0 2% 0 0' }}>
            <Panel.Title toggle>Panel heading 3</Panel.Title>
          </Panel.Heading>
          <Panel.Body collapsible>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
          </Panel.Body>
        </Panel>
      </PanelGroup>
    )
  }
}
ReactDOM.render( <
  App / > ,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.development.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.development.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.32.1/react-bootstrap.min.js"></script>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


<div id='root'>
  Come On Work!
</div>

我添加了display: flex 来包裹面板,尽管我在这里没有得到想要的布局。 而不是延伸内联,正文与 它自己的标题具有相同的垂直齐平,如果面板始终与面板标题 1 垂直齐平,我希望它,不管点击打开的是哪个面板。

此外,当面板打开时,我希望面板标题保持相同的宽度,而不是缩小到非常小的宽度。

显然我不确定 react-bootstrap Panel 组件是否是正确的工具,或者我是否应该创建自己的自定义水平手风琴工具(虽然不太确定如何做到这一点)。这也是我要问的一部分!

一如既往地感谢您的帮助。

【问题讨论】:

  • 只需添加一个带有 display: flex 的样式到面板是一个好的开始 - 但它仍然看起来不正确。

标签: javascript reactjs react-bootstrap


【解决方案1】:

很好地创建了这个工作的 sn-p,其中面板的工作方式类似于 react-bootstrap 示例。

但不确定我是否了解您在视觉上究竟在寻找什么?

您想要在切换到右滑时而不是滑下效果?

究竟如何?您将面板标题作为一个块,因此内容适合放在哪里?

const PanelGroup = ReactBootstrap.PanelGroup;
const Panel = ReactBootstrap.Panel;


class PanelHorizontal extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      visible: false
    }
  }
  
  render() {
    const classesNames = ['panelHorizontal'];
    if (this.state.visible){
      classesNames.push('slideIn');
    } else {
      classesNames.push('slideOut');
    }
    return (
      <div>
        <h1
          className="title"
          onClick={()=>this.setState({visible: !this.state.visible})}
        >click to toggle</h1>
        
        <div className={classesNames.join(' ')}>
          content here
        </div>
      </div>
    );
  };
}

class App extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <PanelHorizontal />
    )
  }
}
ReactDOM.render( <
  App / > ,
  document.getElementById('root')
);
.panelHorizontal {
  width: 220px;
  transform: translateX(-220px);
  transition: transform 400ms ease-in;
}
.panelHorizontal.slideIn {
  transform: translateX(0);
}
.panelHorizontal.slideOut {
  transform: translateX(-220px);
}

.title {
  cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.development.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.development.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.32.1/react-bootstrap.min.js"></script>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


<div id='root'>
  Come On Work!
</div>

【讨论】:

  • > 究竟如何?这是我的问题,是的。似乎 react-bootstrap 组件的构建方式无法轻松使其成为水平手风琴。
  • 这不是为水平切换而构建的:/所以你可能需要自己创建它......
  • 如何编码折叠效果?这只是一个点击处理程序吗?
  • 更新了我的代码 sn-p,现在你有了一个超级简单的水平切换示例
  • 是的,使用别人的作品总是更好。但是这个小组件可能是您需要的,只需重新设计它就可以了。问你是否被卡住了
猜你喜欢
  • 1970-01-01
  • 2014-02-18
  • 2016-11-17
  • 2015-11-14
  • 2014-07-20
  • 2015-05-08
  • 1970-01-01
  • 2015-12-08
  • 2021-07-07
相关资源
最近更新 更多