我正在努力学习一些React和CSS,但有一件事我很挣扎.

我试图创建一个聊天页面,但当有许多消息时,消息容器会向下推输入框.

const message = useRef()
function submit(e) {
    e.preventDefault();

    addMessage(msgBox => [...msgBox , message.current.value])

}

const [msgBox, addMessage] = useState(["John: Hi"])
 return (
        <>
        <div className = "chat-container">
            {msgBox.map((msg) => {
                return <div><span>{msg}</span><br/></div>
            })}
        </div>
        <div className = "message-box">
        <Form onSubmit = {submit}>
        <input ref = {message} />
        <Button type = "submit" className = "mb-1 position-fixed">
            Send
        </Button>
        </Form>
        </div>
        </>
    )

CSS:

* {
  margin: 0;
  padding: 0;
}
.chat-container {
  min-height: 90vh;
  min-width: 80%;
  position: relative;
}
span {
  padding: 60px;
}
.message-box {
  min-height: 10vh;
  position: absolute;
}

.message-box > form > input {
  margin-left: 60px;
}

我试图摆弄位置属性,但我没能做到.当有太多消息时,我希望聊天容器不要按下消息框.

我希望当有太多的消息时,聊天容器不要在所有消息框中重叠,并且能够滚动到那里.

有什么帮助吗?

推荐答案

max-height设置为.chat-container.可以使用另一个值代替500px.使用它可以找到与您的设计相匹配的值.

.chat-container {
  max-height: 500px 
  overflow: scroll
}

使现代化

如果.chat-container的高度发生变化,并且您希望按下底部的输入,请执行以下操作:

  1. 给出.chat-container的所有父项,包括htmlbody height: 100%.

  2. .chat-containerform放入html元素,即flex,其flex-directioncolumn.

  3. .chat-container上使用flex-grow: 1,以便始终占用所有可用空间.

* {
  margin: 0;
  padding: 0;
}

html,
body {
  height: 100%;
}

.container {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.chat-container {
  flex-grow: 1;
  overflow: scroll;
}
<div class="container">
  <div class="chat-container">
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Possimus expedita reiciendis, magnam provident fugit ad odit, nulla a nisi repellat eaque minus assumenda neque ea cumque blanditiis nobis repudiandae? Aliquid.</p>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Possimus expedita reiciendis, magnam provident fugit ad odit, nulla a nisi repellat eaque minus assumenda neque ea cumque blanditiis nobis repudiandae? Aliquid.</p>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Possimus expedita reiciendis, magnam provident fugit ad odit, nulla a nisi repellat eaque minus assumenda neque ea cumque blanditiis nobis repudiandae? Aliquid.</p>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Possimus expedita reiciendis, magnam provident fugit ad odit, nulla a nisi repellat eaque minus assumenda neque ea cumque blanditiis nobis repudiandae? Aliquid.</p>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Possimus expedita reiciendis, magnam provident fugit ad odit, nulla a nisi repellat eaque minus assumenda neque ea cumque blanditiis nobis repudiandae? Aliquid.</p>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Possimus expedita reiciendis, magnam provident fugit ad odit, nulla a nisi repellat eaque minus assumenda neque ea cumque blanditiis nobis repudiandae? Aliquid.</p>

  </div>
  <div class="message-box">
    <Form onSubmit={ submit}>
      <input ref={ message} />
      <Button type="submit" class="mb-1 position-fixed">
        Send
      </Button>
    </Form>
  </div>
</div>

您可以调整form的高度.

Css相关问答推荐

如何在没有额外间隔的情况下使用Angularmaterial 图标?

转换间隙值时基于百分比的弹性元素&跳转

如何在移动屏幕尺寸上包装元素?

如何为垫子制作圆角- Select 所有角点上的下拉列表

Next.js中的TailWind CSS类名称疑难解答

显示 P 元素中加载数据的空行

这个 CSS :is() Select 器没有像我想象的那样工作

如何使shiny 的showNotification可滚动?

如何使我的标语(h1元素)不居中对齐?

排除特定元素的目标元素

如何更改 JqGrid 中的pager 背景 colored颜色 ?

before 元素的过渡效果

Angular 以Angular 获取当前聚焦的元素

将框架放入 bootstrap 模式的正确方法是什么?

我无法在 next.js 应用程序中传播 daisyui 的主题

有没有办法让它比它更敏感?

CSS 常量()用于什么?

如何强制 div 出现在下方而不是旁边?

模拟显示:React Native 中的内联

在无序列表中的项目之后添加管道分隔符,除非该项目是最后一行