在 css 中使用 `rotate()` 使聊天消息在聊天应用程序中向上增长?
Using `rotate()` in css to make chat messages grow upwards in a chat app?
我正在构建一个聊天应用程序,我希望新消息显示在最底部,而旧消息应显示在新消息的顶部。我是 CSS 的新手,所以我在互联网上找到了这个 example,它通过在 chatArea
容器中旋转使用 transform
和 direction
CSS 属性在向左方向旋转消息的同时向右方向旋转。
虽然这可行,但这对我来说似乎有点过分了,而且很难维护,因为这些元素的方向现在是 "upside down"。例如,因为 chatArea
div 现在被旋转以设置 border-top
CSS 属性 我实际上需要设置 border-bottom
属性.
所以我想知道是否有更简单的解决方案。现在,我正在使用 jQuery
将新消息添加到旧消息之前,我尝试了很多 prepend/append/prependTo
的组合,这是唯一有效的组合,但我不确定 [= 的哪个组合37=] 加上更简单的 CSS 就可以了。
这是jQuery
代码做前缀:
let $messages = jQuery('.messages');
let $message = jQuery('<li class="list-group-item"></li>');
$message.append('<p><strong>' + message.name + ' ' + tm + '</strong></p>');
$message.append('<p>' + message.text + '</p>');
$message.hide().fadeIn(FADE_TIME);
$message.prependTo($messages);
这是 html:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Socket.IO</title>
<link rel="stylesheet" href="./css/bootstrap4.1.min.css">
<link rel="stylesheet" href="./css/styles.css">
</head>
<body>
<div class="container">
<div id="conversation" class="row">
<div class="col-md-6 offset-md-3 card">
<a href="./index.html">Change Settings</a>
<h1 class="room-title text-center"></h1>
<div class="chatArea">
<ul class="messages list-group">
<!-- Messages end up here! -->
</ul>
</div>
<form id="message-form">
<div class="form-group">
<input type="text" name="message" class="form-control"/>
</div>
<div class="form-group">
<input type="submit" class="btn btn-primary"/>
<button type="button" id="showUsersButton" class="btn btn-info">Show room users</button>
</div>
</form>
</div>
</div>
</div>
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/socket.io-1.3.7.js"></script>
<script type="module" src="js/app.js"></script>
<script src="js/moment-2.22.1.js"></script>
<script type="module" src="js/queryParams.js"></script>
</body>
</html>
这就是实现旋转的CSS:
.messages p {
height: 100%;
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
direction: ltr;
}
.chatArea {
height: 500px;
overflow-y: scroll;
padding-bottom: 60px;
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
direction: rtl;
border-bottom: 1px solid #ccc;
}
Flexbox 可以做到...不需要 javascript 或转换。
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
::before,
::after {
box-sizing: inherit;
}
.container {
width: 80%;
margin: 1em auto;
border: 1px solid grey;
/* magic */
display: flex;
flex-direction: column-reverse;
}
p {
background: lightblue;
margin-top: 1em;
}
<div class="container">
<p class="message">Message6</p>
<p class="message">Message5</p>
<p class="message">Message4</p>
<p class="message">Message3</p>
<p class="message">Message2</p>
<p class="message">Message1</p>
</div>
我正在构建一个聊天应用程序,我希望新消息显示在最底部,而旧消息应显示在新消息的顶部。我是 CSS 的新手,所以我在互联网上找到了这个 example,它通过在 chatArea
容器中旋转使用 transform
和 direction
CSS 属性在向左方向旋转消息的同时向右方向旋转。
虽然这可行,但这对我来说似乎有点过分了,而且很难维护,因为这些元素的方向现在是 "upside down"。例如,因为 chatArea
div 现在被旋转以设置 border-top
CSS 属性 我实际上需要设置 border-bottom
属性.
所以我想知道是否有更简单的解决方案。现在,我正在使用 jQuery
将新消息添加到旧消息之前,我尝试了很多 prepend/append/prependTo
的组合,这是唯一有效的组合,但我不确定 [= 的哪个组合37=] 加上更简单的 CSS 就可以了。
这是jQuery
代码做前缀:
let $messages = jQuery('.messages');
let $message = jQuery('<li class="list-group-item"></li>');
$message.append('<p><strong>' + message.name + ' ' + tm + '</strong></p>');
$message.append('<p>' + message.text + '</p>');
$message.hide().fadeIn(FADE_TIME);
$message.prependTo($messages);
这是 html:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Socket.IO</title>
<link rel="stylesheet" href="./css/bootstrap4.1.min.css">
<link rel="stylesheet" href="./css/styles.css">
</head>
<body>
<div class="container">
<div id="conversation" class="row">
<div class="col-md-6 offset-md-3 card">
<a href="./index.html">Change Settings</a>
<h1 class="room-title text-center"></h1>
<div class="chatArea">
<ul class="messages list-group">
<!-- Messages end up here! -->
</ul>
</div>
<form id="message-form">
<div class="form-group">
<input type="text" name="message" class="form-control"/>
</div>
<div class="form-group">
<input type="submit" class="btn btn-primary"/>
<button type="button" id="showUsersButton" class="btn btn-info">Show room users</button>
</div>
</form>
</div>
</div>
</div>
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/socket.io-1.3.7.js"></script>
<script type="module" src="js/app.js"></script>
<script src="js/moment-2.22.1.js"></script>
<script type="module" src="js/queryParams.js"></script>
</body>
</html>
这就是实现旋转的CSS:
.messages p {
height: 100%;
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
direction: ltr;
}
.chatArea {
height: 500px;
overflow-y: scroll;
padding-bottom: 60px;
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
direction: rtl;
border-bottom: 1px solid #ccc;
}
Flexbox 可以做到...不需要 javascript 或转换。
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
::before,
::after {
box-sizing: inherit;
}
.container {
width: 80%;
margin: 1em auto;
border: 1px solid grey;
/* magic */
display: flex;
flex-direction: column-reverse;
}
p {
background: lightblue;
margin-top: 1em;
}
<div class="container">
<p class="message">Message6</p>
<p class="message">Message5</p>
<p class="message">Message4</p>
<p class="message">Message3</p>
<p class="message">Message2</p>
<p class="message">Message1</p>
</div>