You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Semantic UI React模态框右侧如何适配左侧视频高度免硬编码实现滚动

问题背景

我正在使用Semantic UI React,想要实现纵向分为两部分的模态框:左侧展示视频,右侧展示视频的时间戳和索引描述,右侧的索引列表需要支持滚动。

原有实现代码:

<Grid>
  <Grid.Row>
    <Grid.Column style={{margin: '0', padding: '0'}} computer={10} mobile={16} table={16} >
      <Segment raised inverted style={{ padding: '2.5rem 0'}}>
        <ReactPlayer style={{margin: '0 auto'}} ref={this.ref} url={this.state.url} controls={true} playing={true}/>
      </Segment>
    </Grid.Column>
    <Grid.Column style={{margin: '0', padding: '0'}} computer={6} mobile={16} table={16}>
      <Segment basic style={{overflowX: 'hidden', margin: '0 auto', height: '450px'}}>
        <List relaxed>
          {_.keys(this.props.videoMeta.timestamps).map(ts => (
            <List.Item className='clickable' onClick={() => this.forward(this.props.videoMeta.timestamps[ts])}>
              <List.Icon name='video' size='fullscreen' verticalAlign='middle'/>
              <List.Content>
                <List.Header style={{textTransform: 'capitalize'}}>{ts}</List.Header>
                <List.Description>{this.props.videoMeta.timestamps[ts]}</List.Description>
              </List.Content>
            </List.Item>
          ))}
        </List>
      </Segment>
    </Grid.Column>
  </Grid.Row>
</Grid>

上述代码实现了预期的UI,但需要给右侧网格列设置硬编码的高度值,否则无法实现滚动效果。尝试过使用百分比数值,但会导致右侧高度与左侧不一致。

需求:不使用硬编码的情况下,让右侧高度与左侧网格列的高度保持一致。

当前UI效果:
UI效果截图


解决方案

通过给flex布局搭配position属性实现自适应高度,修改后代码如下:

<Grid>
  <Grid.Row style={{display: 'flex'}}>
    <Grid.Column style={{margin: '0', padding: '0'}} computer={10} mobile={16} table={16}>
      <Segment raised inverted style={{padding: '2.5rem 0'}}>
        <ReactPlayer style={{margin: '0 auto'}} ref={this.ref} url={this.state.videoMeta.link} controls={true} playing={true}/>
      </Segment>
    </Grid.Column>
    <Grid.Column style={{margin: '0', padding: '0', overflowX: 'hidden', position: 'relative', flexGrow: 1}} computer={6} mobile={16} table={16}>
      <Segment basic>
        <Header><strong>Timestamps:</strong>  </Header>
        <List relaxed style={{position: 'absolute'}}>
          {_.keys(this.state.videoMeta.timestamps).map(ts => (
            <List.Item className='clickable' onClick={() => this.forward(this.state.videoMeta.timestamps[ts])}>
              <List.Icon name='video' size='fullscreen' verticalAlign='middle'/>
              <List.Content>
                <List.Header style={{textTransform: 'capitalize'}}>{ts}</List.Header>
                <List.Description>{this.state.videoMeta.timestamps[ts]}</List.Description>
              </List.Content>
            </List.Item>
          ))}
        </List>
      </Segment>
    </Grid.Column>
  </Grid.Row>
</Grid>

注意事项

右侧容器标签设置了relative的CSS position属性,右侧内部列表元素设置了absolute的position属性,不添加position属性的话flex布局无法生效。


内容的提问来源于stack exchange,提问作者leoOrion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:24:03