Skip to content

Instantly share code, notes, and snippets.

@AshikNesin
Created January 17, 2017 08:03
Show Gist options
  • Save AshikNesin/17e1f9104d2fc5f7ec7e810da3003406 to your computer and use it in GitHub Desktop.
Save AshikNesin/17e1f9104d2fc5f7ec7e810da3003406 to your computer and use it in GitHub Desktop.
Direct Messaging

Direct Messaging

Hello there, good folks! Today I created direct messaging screen with bubbles, nice smooth animation, and some cool dynamics, with pure css3 and html5 with almost no jQuery. How do you like it? :)

A Pen by Momcilo Popov on CodePen.

License.

<div class="wrapper">
<div class="container">
<div class="left">
<div class="top">
<input type="text" />
<a href="javascript:;" class="search"></a>
</div>
<ul class="people">
<li class="person" data-chat="person1">
<img src="http://s13.postimg.org/ih41k9tqr/img1.jpg" alt="" />
<span class="name">Thomas Bangalter</span>
<span class="time">2:09 PM</span>
<span class="preview">I was wondering...</span>
</li>
<li class="person" data-chat="person2">
<img src="http://s3.postimg.org/yf86x7z1r/img2.jpg" alt="" />
<span class="name">Dog Woofson</span>
<span class="time">1:44 PM</span>
<span class="preview">I've forgotten how it felt before</span>
</li>
<li class="person" data-chat="person3">
<img src="http://s3.postimg.org/h9q4sm433/img3.jpg" alt="" />
<span class="name">Louis CK</span>
<span class="time">2:09 PM</span>
<span class="preview">But we’re probably gonna need a new carpet.</span>
</li>
<li class="person" data-chat="person4">
<img src="http://s3.postimg.org/quect8isv/img4.jpg" alt="" />
<span class="name">Bo Jackson</span>
<span class="time">2:09 PM</span>
<span class="preview">It’s not that bad...</span>
</li>
<li class="person" data-chat="person5">
<img src="http://s16.postimg.org/ete1l89z5/img5.jpg" alt="" />
<span class="name">Michael Jordan</span>
<span class="time">2:09 PM</span>
<span class="preview">Wasup for the third time like is
you bling bitch</span>
</li>
<li class="person" data-chat="person6">
<img src="http://s30.postimg.org/kwi7e42rh/img6.jpg" alt="" />
<span class="name">Drake</span>
<span class="time">2:09 PM</span>
<span class="preview">howdoyoudoaspace</span>
</li>
</ul>
</div>
<div class="right">
<div class="top"><span>To: <span class="name">Dog Woofson</span></span></div>
<div class="chat" data-chat="person1">
<div class="conversation-start">
<span>Today, 6:48 AM</span>
</div>
<div class="bubble you">
Hello,
</div>
<div class="bubble you">
it's me.
</div>
<div class="bubble you">
I was wondering...
</div>
</div>
<div class="chat" data-chat="person2">
<div class="conversation-start">
<span>Today, 5:38 PM</span>
</div>
<div class="bubble you">
Hello, can you hear me?
</div>
<div class="bubble you">
I'm in California dreaming
</div>
<div class="bubble me">
... about who we used to be.
</div>
<div class="bubble me">
Are you serious?
</div>
<div class="bubble you">
When we were younger and free...
</div>
<div class="bubble you">
I've forgotten how it felt before
</div>
</div>
<div class="chat" data-chat="person3">
<div class="conversation-start">
<span>Today, 3:38 AM</span>
</div>
<div class="bubble you">
Hey human!
</div>
<div class="bubble you">
Umm... Someone took a shit in the hallway.
</div>
<div class="bubble me">
... what.
</div>
<div class="bubble me">
Are you serious?
</div>
<div class="bubble you">
I mean...
</div>
<div class="bubble you">
It’s not that bad...
</div>
<div class="bubble you">
But we’re probably gonna need a new carpet.
</div>
</div>
<div class="chat" data-chat="person4">
<div class="conversation-start">
<span>Yesterday, 4:20 PM</span>
</div>
<div class="bubble me">
Hey human!
</div>
<div class="bubble me">
Umm... Someone took a shit in the hallway.
</div>
<div class="bubble you">
... what.
</div>
<div class="bubble you">
Are you serious?
</div>
<div class="bubble me">
I mean...
</div>
<div class="bubble me">
It’s not that bad...
</div>
</div>
<div class="chat" data-chat="person5">
<div class="conversation-start">
<span>Today, 6:28 AM</span>
</div>
<div class="bubble you">
Wasup
</div>
<div class="bubble you">
Wasup
</div>
<div class="bubble you">
Wasup for the third time like is <br />you blind bitch
</div>
</div>
<div class="chat" data-chat="person6">
<div class="conversation-start">
<span>Monday, 1:27 PM</span>
</div>
<div class="bubble you">
So, how's your new phone?
</div>
<div class="bubble you">
You finally have a smartphone :D
</div>
<div class="bubble me">
Drake?
</div>
<div class="bubble me">
Why aren't you answering?
</div>
<div class="bubble you">
howdoyoudoaspace
</div>
</div>
<div class="write">
<a href="javascript:;" class="write-link attach"></a>
<input type="text" />
<a href="javascript:;" class="write-link smiley"></a>
<a href="javascript:;" class="write-link send"></a>
</div>
</div>
</div>
</div>
$('.chat[data-chat=person2]').addClass('active-chat');
$('.person[data-chat=person2]').addClass('active');
$('.left .person').mousedown(function(){
if ($(this).hasClass('.active')) {
return false;
} else {
var findChat = $(this).attr('data-chat');
var personName = $(this).find('.name').text();
$('.right .top .name').html(personName);
$('.chat').removeClass('active-chat');
$('.left .person').removeClass('active');
$(this).addClass('active');
$('.chat[data-chat = '+findChat+']').addClass('active-chat');
}
});
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
@import 'compass/css3';
@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600);
@mixin font-bold {
font-family: 'Source Sans Pro', sans-serif;
font-weight: 600;
}
@mixin font {
font-family: 'Source Sans Pro', sans-serif;
font-weight: 400;
}
@mixin placeholder {
&::-webkit-input-placeholder {
@content;
}
&:-moz-placeholder {
@content;
}
&::-moz-placeholder {
@content;
}
&:-ms-input-placeholder {
@content;
}
}
*, *:before, *:after {
box-sizing: border-box;
}
$white: #fff;
$black: #000;
$bg: #f8f8f8;
$grey: #999;
$dark: #1a1a1a;
$light: #e6e6e6;
$wrapper: 1000px;
$blue: #00b0ff;
body {
background-color: $bg;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
@include font;
background-image: url('http://s17.postimg.org/fr01hfe33/image.jpg');
background-size: cover;
background-repeat: none;
}
.wrapper {
position: relative;
left: 50%;
width: $wrapper;
height: 800px;
transform: translate(-50%, 0);
}
.container {
position: relative;
top: 50%;
left: 50%;
width: 80%;
height: 75%;
background-color: $white;
transform: translate(-50%, -50%);
.left {
float: left;
width: 37.6%;
height: 100%;
border: 1px solid $light;
background-color: $white;
.top {
position: relative;
width: 100%;
height: 96px;
padding: 29px;
&:after {
position: absolute;
bottom: 0;
left: 50%;
display: block;
width: 80%;
height: 1px;
content: '';
background-color: $light;
transform: translate(-50%, 0);
}
}
input {
float: left;
width: 188px;
height: 42px;
padding: 0 15px;
border: 1px solid $light;
background-color: #eceff1;
border-radius: 21px;
@include font();
&:focus {
outline: none;
}
}
a.search {
display: block;
float: left;
width: 42px;
height: 42px;
margin-left: 10px;
border: 1px solid $light;
background-color: $blue;
background-image: url('http://s11.postimg.org/dpuahewmn/name_type.png');
background-repeat: no-repeat;
background-position: top 12px left 14px;
border-radius: 50%;
}
.people {
margin-left: -1px;
border-right: 1px solid $light;
border-left: 1px solid $light;
width: calc(100% + 2px);
.person {
position: relative;
width: 100%;
padding: 12px 10% 16px;
cursor: pointer;
background-color: $white;
&:after {
position: absolute;
bottom: 0;
left: 50%;
display: block;
width: 80%;
height: 1px;
content: '';
background-color: $light;
transform: translate(-50%, 0);
}
img {
float: left;
width: 40px;
height: 40px;
margin-right: 12px;
border-radius: 50%;
}
.name {
font-size: 14px;
line-height: 22px;
color: $dark;
@include font-bold;
}
.time {
font-size: 14px;
position: absolute;
top: 16px;
right: 10%;
padding: 0 0 5px 5px;
color: $grey;
background-color: $white;
}
.preview {
font-size: 14px;
display: inline-block;
overflow: hidden !important;
width: 70%;
white-space: nowrap;
text-overflow: ellipsis;
color: $grey;
}
&.active,&:hover {
margin-top: -1px;
margin-left: -1px;
padding-top: 13px;
border: 0;
background-color: $blue;
width: calc(100% + 2px);
padding-left: calc(10% + 1px);
span {
color: $white;
background: transparent;
}
&:after {
display: none;
}
}
}
}
}
.right {
position: relative;
float: left;
width: 62.4%;
height: 100%;
.top {
width: 100%;
height: 47px;
padding: 15px 29px;
background-color: #eceff1;
span {
font-size: 15px;
color: $grey;
.name {
color: $dark;
@include font-bold;
}
}
}
.chat {
position: relative;
display: none;
overflow: hidden;
padding: 0 35px 92px;
border-width: 1px 1px 1px 0;
border-style: solid;
border-color: $light;
height: calc(100% - 48px);
justify-content: flex-end;
flex-direction: column;
&.active-chat {
display: block;
display: flex;
.bubble {
@include transition-timing-function(cubic-bezier(.4,-.04, 1, 1));
@for $i from 1 through 10 {
&:nth-of-type(#{$i}) {
@include animation-duration(.15s *$i);
}
}
}
}
}
.write {
position: absolute;
bottom: 29px;
left: 30px;
height: 42px;
padding-left: 8px;
border: 1px solid $light;
background-color: #eceff1;
width: calc(100% - 58px);
border-radius: 5px;
input {
font-size: 16px;
float: left;
width: 347px;
height: 40px;
padding: 0 10px;
color: $dark;
border: 0;
outline: none;
background-color: #eceff1;
@include font;
}
.write-link {
&.attach {
&:before {
display: inline-block;
float: left;
width: 20px;
height: 42px;
content: '';
background-image: url('http://s1.postimg.org/s5gfy283f/attachemnt.png');
background-repeat: no-repeat;
background-position: center;
}
}
&.smiley {
&:before {
display: inline-block;
float: left;
width: 20px;
height: 42px;
content: '';
background-image: url('http://s14.postimg.org/q2ug83h7h/smiley.png');
background-repeat: no-repeat;
background-position: center;
}
}
&.send {
&:before {
display: inline-block;
float: left;
width: 20px;
height: 42px;
margin-left: 11px;
content: '';
background-image: url('http://s30.postimg.org/nz9dho0pp/send.png');
background-repeat: no-repeat;
background-position: center;
}
}
}
}
.bubble {
font-size: 16px;
position: relative;
display: inline-block;
clear: both;
margin-bottom: 8px;
padding: 13px 14px;
vertical-align: top;
border-radius: 5px;
&:before {
position: absolute;
top: 19px;
display: block;
width: 8px;
height: 6px;
content: '\00a0';
transform: rotate(29deg) skew(-35deg);
}
&.you {
float: left;
color: $white;
background-color: $blue;
align-self: flex-start;
@include animation-name(slideFromLeft);
&:before {
left: -3px;
background-color: $blue;
}
}
&.me {
float: right;
color: $dark;
background-color: #eceff1;
align-self: flex-end;
@include animation-name(slideFromRight);
&:before {
right: -3px;
background-color: #eceff1;
}
}
}
.conversation-start {
position: relative;
width: 100%;
margin-bottom: 27px;
text-align: center;
span {
font-size: 14px;
display: inline-block;
color: $grey;
&:before,&:after {
position: absolute;
top: 10px;
display: inline-block;
width: 30%;
height: 1px;
content: '';
background-color: $light;
}
&:before {
left: 0;
}
&:after {
right: 0;
}
}
}
}
}
@keyframes slideFromLeft {
0% {
margin-left: -200px;
opacity: 0;
}
100% {
margin-left: 0;
opacity: 1;
}
}
@-webkit-keyframes slideFromLeft {
0% {
margin-left: -200px;
opacity: 0;
}
100% {
margin-left: 0;
opacity: 1;
}
}
@keyframes slideFromRight {
0% {
margin-right: -200px;
opacity: 0;
}
100% {
margin-right: 0;
opacity: 1;
}
}
@-webkit-keyframes slideFromRight {
0% {
margin-right: -200px;
opacity: 0;
}
100% {
margin-right: 0;
opacity: 1;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment