我正在尝试制作一个聊天应用程序,只需按一下按钮,您就可以看到消息的时间戳滑入。
我的时间戳总是占用 200px 的大小,而另一个占用其余的大小。
我们将 div1 称为时间戳 (200px),将 div2 称为消息 (占用剩余空间)。
我尝试在第一个 div1 上使用翻译并移动,很快意识到 div2 不会自动调整大小:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
*{
padding: 0px;
margin: 0px;
box-sizing: border-box;
}
.chat-container {
display: flex;
height: 50vh;
width: 50vw;
background-color: #f0f0f0;
}
#div1 {
background-color: #0004ff;
height: 100%;
width: 200px;
text-align: center;
position: relative;
left:-200px;
transition: left 1s;
}
#div2 {
background-color: #ff0000;
height: 100%;
text-align: center;
width: calc(100% - 200px); /* 100% - 200px or auto would work*/
}
</style>
</head>
<body>
<div class="chat-container">
<div id="div1">
<p>div1</p>
</div>
<div id="div2">
<p>div2</p>
</div>
</div>
<button id="button">animation</button>
<script>
let actived = false;
document.getElementById("button").addEventListener("click", function() {
const div1 = document.getElementById("div1");
const div2 = document.getElementById("div2");
div1.style.left = actived ? "-200px" : "0px";
actived = !actived;
});
</script>
</body>
</html>
因此我尝试调整 div2 的大小,但这样做之后calc(100% - 200px)
大小却不一样了!!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
*{
padding: 0px;
margin: 0px;
box-sizing: border-box;
}
.chat-container {
display: flex;
height: 50vh;
width: 50vw;
background-color: #f0f0f0;
overflow: hidden;
}
#div1 {
background-color: #0004ff;
height: 100%;
width: 200px;
text-align: center;
position: relative;
left:-200px;
transition: left 1s;
}
#div2 {
background-color: #ff0000;
height: 100%;
text-align: center;
width: calc(100% - 200px); /* 100% - 200px or auto would work*/
position: relative;
transition: width 1s;
}
</style>
</head>
<body>
<div class="chat-container">
<div id="div1">
<p>div1</p>
</div>
<div id="div2">
<p>div2</p>
</div>
</div>
<button id="button">animation</button>
<script>
let actived = false;
document.getElementById("button").addEventListener("click", function() {
const div1 = document.getElementById("div1");
const div2 = document.getElementById("div2");
div1.style.left = actived ? "-200px" : "0px";
div2.style.width = actived ? "100%" : "calc(100% - 200px)";
actived = !actived;
});
</script>
</body>
</html>
100%
父元素减去 div1 的大小怎么会不是剩余的大小呢?我好困惑啊。
请告诉我应该使用什么方法以及为什么100% - 200px
不对齐。
解释
切换时的差异是由于隐式
flex-shrink
行为flex-shrink: 1
造成的(因为元素在弹性布局中具有默认设置:通过例子可以更好地证明这一点。
说得
chat-container
广500px
。在发生任何弹性收缩之前,元素的固有宽度是:
200px
100% - 200px
= 500px - 200px
= 300px
没有发生任何缩小,一切都完全合适。
单击动画按钮两次,则div2的动画
width
为100%
,因此:200px
100%
= 500px
现在,div1 和 div2 比容器更宽,因为更改
left
div1 不会删除它占用的空间。因此,flex 收缩计算如下:计算子元素的剩余宽度:
div1:div2 的比例为,因此我们在它们之间按如下方式
2:5
分配该盈余:200px
200px ÷ 7 × 2
≈ 57px
200px ÷ 7 × 5
≈ 143px
因此最终的宽度如下:
143px
357px
解决方案
如果您真的想将 div1 滑入和滑出,则可以使用
margin
,然后让 div2 自然填充空间flex-grow: 1
:聊天应用程序包含很多部分,因此我制作了一个简单的应用程序,然后在制作过程中对行进行动画处理。如果布局复杂、元素是动态添加的,或者涉及滚动等,简单的动画很容易中断。此外,第一列的宽度为 40%,而不是 200px,因为绝对宽度不响应。详细信息已在示例中注释。在Full page模式下查看。
顺便说一句,从数学上来说
calc(100% - 200px)
应该可行,但如果父级有左和/或右填充或者有一个gap
属性或者有一个滚动条等,您也需要将其包括在公式中。