如何在 FluentUI 模式控件中创建粘性(不可滚动)页眉/页脚?

2024-01-08

使用 React Fluent UI 模态控件,有人可以告诉我如何:

  1. 确保页眉和页脚不是可滚动内容的一部分(即它们是“粘性”的,而如果窗口大小不足,位于它们之间的主要内容是可滚动的)。
  2. 随着内容变化,最小化模态大小的变化 - 即视口的窗口大小与最初一样,但随着内容动态变化,模态保持其原始大小。

下面是一个经过编辑的示例相关微软文档 https://developer.microsoft.com/en-us/fluentui#/controls/web/modal。我也把它放进去了这个代码笔 https://codepen.io/mcshaz/pen/RwZEZPY这是有效的(与代码片段不同)。单击模式控件页脚中的按钮可更改内容量。

const { useBoolean } = window.FluentUIReactHooks;
const { getTheme, mergeStyleSets, FontWeights, ContextualMenu, Toggle, Modal, IDragOptions, IIconProps, Stack, IStackProps, DefaultButton, IconButton, IButtonStyles, ThemeProvider, initializeIcons, Separator, PrimaryButton } = window.FluentUIReact;

// Initialize icons in case this example uses them
initializeIcons();

const ModalBasicExample: React.FunctionComponent = () => {
  const [isModalOpen, { setTrue: showModal, setFalse: hideModal }] = useBoolean(false);
  const [pageNo, setPageNo] = React.useState(0);
  const changePage = React.useCallback(() => setPageNo(oldVal => ~oldVal),[setPageNo])
  
  const titleId = "titleId";

  return (
    <div>
      <DefaultButton onClick={showModal} text="Open Modal" />
      <Modal
        titleAriaId={titleId}
        isOpen={isModalOpen}
        onDismiss={hideModal}
        isBlocking={false}
        containerClassName={contentStyles.container}
        topOffsetFixed={true}
      >
        <div className={contentStyles.header}>
          <span id={titleId}>Lorem Ipsum</span>
          <IconButton
            styles={iconButtonStyles}
            iconProps={cancelIcon}
            ariaLabel="Close popup modal"
            onClick={hideModal}
          />
        </div>
        <div className={contentStyles.body}>
          {pageNo===0 ? <div dangerouslySetInnerHTML={{
            __html:lorem}}></div> : <p>page {pageNo}</p>}
        </div>
        <footer className={contentStyles.footer}>
          <Separator/>
          <PrimaryButton text="switch" onClick={changePage}/>
        </footer>
      </Modal>
    </div>
  );
};

const cancelIcon: IIconProps = { iconName: 'Cancel' };

const theme = getTheme();
const contentStyles = mergeStyleSets({
  container: {
    display: 'flex',
    flexFlow: 'column nowrap',
    alignItems: 'stretch',
  },
  header: [
    // eslint-disable-next-line deprecation/deprecation
    theme.fonts.xLargePlus,
    {
      flex: '1 1 auto',
      borderTop: `4px solid ${theme.palette.themePrimary}`,
      color: theme.palette.neutralPrimary,
      display: 'flex',
      alignItems: 'center',
      fontWeight: FontWeights.semibold,
      padding: '12px 12px 14px 24px',
    },
  ],
  body: {
    flex: '4 4 auto',
    padding: '0 24px 24px 24px',
    overflowY: 'hidden',
    selectors: {
      p: { margin: '14px 0' },
      'p:first-child': { marginTop: 0 },
      'p:last-child': { marginBottom: 0 },
    },
  },
  footer: {
    
  }
});

const iconButtonStyles: Partial<IButtonStyles> = {
  root: {
    color: theme.palette.neutralPrimary,
    marginLeft: 'auto',
    marginTop: '4px',
    marginRight: '2px',
  },
  rootHovered: {
    color: theme.palette.neutralDark,
  },
};

const lorem = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc suscipit, est eget porta tempor, ante justo finibus odio, sit amet rhoncus neque velit nec leo. Morbi vitae ex a urna auctor sagittis dictum at ante. Etiam vel commodo turpis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean dapibus malesuada luctus. Vivamus nec convallis dolor, nec condimentum ligula. Aenean blandit mi et justo rutrum, sed feugiat erat gravida. Donec sit amet eleifend mauris. Duis eget leo vel elit viverra ullamcorper. Quisque eu purus nec diam convallis suscipit.</p>".repeat(7);

const ModalBasicExampleWrapper = () => <ThemeProvider><ModalBasicExample /></ThemeProvider>;
ReactDOM.render(<ModalBasicExampleWrapper />, document.getElementById('content'))
<script src="https://unpkg.com/@fluentui/react@8/dist/fluentui-react.js"></script>
<script src="https://unpkg.com/@fluentui/react-hooks@8/dist/react-hooks.js"></script>
<div id="content"></div>

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 FluentUI 模式控件中创建粘性(不可滚动)页眉/页脚? 的相关文章

随机推荐