Oliwis! Greetings from your little incubus, always looking for a little vitality to keep him full of energy and good mood. Today I bring you something super interesting and a bit different from the concept of art that we all know. For me it has also been a surprise to discover that I have the power to create this kind of things.
What I am going to show you is a chatbox. But what is a chatbox? It is what streamers use to display the chat during their streams and allow their viewers to interact with them. However, some take this a step further and create custom designs for their chat, adding a unique touch to their streams.
Instructions:
Viewer name:
#log .meta:meta class that is inside an element with the id log.position: relative;:.meta element to be positioned relatively. This means that it will be positioned relative to its normal position in the document flow.top: 15px;:15px down from its original position.display: inline;:span), allowing other elements to be on the same line.background: linear-gradient(to right, #fdb9a3, #f15488);:#fdb9a3 and ending with the color #f15488.border-radius: 15px 15px 15px 15px;:15px at each corner.padding: 0.3em;:0.3em space inside the element, between its content and its borders.white-space: nowrap;:text-overflow: ellipsis;:...) when the text content is too long to fit in the bounded area of the element. This property works in conjunction with white-space: nowrap and overflow: hidden.overflow: hidden;:box-shadow: 3px 5px 1px #af3349;:3px, a vertical offset of 5px, a blur of 1px, and a shadow color of #af3349.z-index: 99;:z-index values.This code block styles elements with the meta class inside the log so that they look aesthetically pleasing with a background gradient, rounded edges, and a shadow, while ensuring that the textual content does not overflow and that the text stays on a single line.
#log .meta {
position: relative;
top: 15px;
display: inline;
background: linear-gradient(to right, #fdb9a3, #f15488);
border-radius: 15px 15px 15px 15px;
padding: 0.3em;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
box-shadow: 3px 5px 1px #af3349;
z-index: 99;
}
Viewer Message
#log .message:message that is inside an element with the id log.color: #292929;:#292929, a shade of dark gray.background: #f49caf;:#f49caf, a shade of pink.font-weight: bold;:padding: 1em 1em 0.8em 0.8em;:1em on the top and right, and 0.8em on the bottom and left.border-radius: 15px;:15px.word-wrap: break-word;:width: 65%;:65% of the width of its parent container.box-shadow: 5px 7px 4px #c83d56;:5px, a vertical offset of 7px, a blur of 4px, and a shadow color of #c83d56.position: relative;:top, right, bottom, and left properties.This code block styles elements with the message class within the #log container to look visually appealing with a specific text and background color, bold text, generous padding, rounded corners, and a shadow. The word-wrap property ensures that text does not overflow the container, while the position: relative allows for tight positioning within the normal flow of the document.
#log .message {
color: #292929;
background: #f49caf;
font-weight: bold;
padding: 1em 1em 0.8em 0.8em;
border-radius: 15px;
word-wrap: break-word;
width: 65%;
box-shadow: 5px 7px 4px #c83d56;
position: relative;
}
Element Wrapping:
#log > div:div elements that are direct children of the element with the id log.> symbol indicates that the style only applies to direct children, not grandchildren or elements deeper in the DOM hierarchy.margin: 1em;:div direct children of #log.1em margin is applied on all sides (top, right, bottom, and left).1em is a relative unit that corresponds to the font size of the current element. Therefore, the margin will be equal to the font size of the element.This CSS rule adds a 1em space (margin) around each div that is a direct child of the container with the id log, visually separating each div from the other surrounding elements.
#log > div {
margin: 1em;
}
Adding emote:
img:<img> tag is used to display an image on the web page. In this case, the image is placed inside a span container with the meta class, which also contains the user's name and possible badges.chat-emote class, gelatine:chat-emote class assigned to the <img> tag suggests that the image is related to an emote or a visual element associated with chat messages.src):src property of the <img> tag points to a specific URL. This URL provides the location of the image on the web, which will be loaded and displayed at that specific place within the chat message.alt attribute:alt attribute provides alternative text for the image. This text is displayed if the image cannot be loaded and is important for accessibility as it describes the image to screen reader users. In this case, the alternative text is "Chat Background".The <img> tag inside the element with the meta class is placed to display a specific image (give a more unique style) associated with the user who sent the message. This enriches the chat experience by adding visual elements that can convey additional information or simply decorate the message.
<span class="meta" style="color: {color}">
<img class="chat-emote gelatine " src="URL_IMG" alt="Chat Background">
<span class="badges">
</span>
Setting emote class chat-emote:
width: 6%;:display: inline-block;:margin: 0px;:position: relative;:top: 0.5em;:0.5em down from its original position. The em unit is relative to the font size of the current element, so 0.5em is half the font size of the element. This is used to adjust the vertical alignment of the image within its container.These properties ensure that emote images look well aligned, correctly sized, and without unnecessary space around them, providing a clean and professional look in the chat.
.chat-emote {
width: 6%;
display: inline-block;
margin: 0px;
position: relative;
top: 0.5em;
}
Emote animation:
.element class
margin: 0 auto;:0 at the top and bottom and auto on the left and right sides. This horizontally centers the element within its container.animation-name: stretch;:stretch. The stretch animation must be defined in a @keyframes block elsewhere in the CSS.animation-duration: 1.5s;:1.5 seconds.animation-timing-function: ease-out;:ease-out causes the animation to start fast and then slow down towards the end.animation-delay: 0;:0 seconds).animation-direction: alternate;:animation-iteration-count: infinite;:animation-fill-mode: none;:animation-play-state: running;:.element {
margin: 0 auto;
animation-name: stretch;
animation-duration: 1.5s;
animation-timing-function: ease-out;
animation-delay: 0;
animation-direction: alternate;
animation-iteration-count: infinite;
animation-fill-mode: none;
animation-play-state: running;
}
@keyframes stretch block
0% and 100%:
Defines the start and end states of the animation.
transform: scale(0.7);:
At 0% (start of animation), the element is scaled to 70% of its original size.
border-radius: 100%;:
At 0%, the element's border is completely rounded, forming a circle.
transform: scale(1);:
At 100% (end of animation), the element is scaled back to its original size (100%).
@keyframes stretch {
0% {
transform: scale(0.7);
border-radius: 100%;
}
100% {
transform: scale(1);
}
}
.gelatine class
animation: gelatine 0.5s infinite;:gelatine animation to the element, with a duration of 0.5 seconds, and repeats infinitely..gelatine {
animation: gelatine 0.5s infinite;
}
@keyframes jelly block
from, to { transform: scale(1, 1); }:
Defines that at the start and end of the animation, the element will have its original size (scale(1, 1)).
25% { transform: scale(0.9, 1.1); }:
At 25% of the animation cycle, the element is scaled to 90% of its width and 110% of its height, creating a vertical stretching effect.
50% { transform: scale(1.1, 0.9); }:
At 50% of the animation cycle, the element is scaled to 110% of its width and 90% of its height, creating a horizontal stretching effect.
75% { transform: scale(0.95, 1.05); }:
At 75% into the animation cycle, the element is scaled to 95% of its width and 105% of its height, creating a slight vertical stretching effect.
@keyframes gelatine {
from, to { transform: scale(1, 1); }
25% { transform: scale(0.9, 1.1); }
50% { transform: scale(1.1, 0.9); }
75% { transform: scale(0.95, 1.05); }
}
Summary
stretch animation that alternates between two states (smallest to largest) infinitely and with a duration of 1.5 seconds.gelatine animation that scales the element in different proportions to create a bounce effect, with a duration of 0.5 seconds and that repeats infinitely.Full code for the emote animation:
.element{
margin: 0 auto;
animation-name: stretch;
animation-duration: 1.5s;
animation-timing-function: ease-out;
animation-delay:0;
animation-direction: alternate;
animation-iteration-count: infinite;
animation-fill-mode: none;
animation-play-state:running;
}
@keyframes stretch {
0% {
transform:scale(0.7);
border-radius: 100%;
}
100%{
transform: scale (1);
}
}
.gelatine {
animation: gelatine 0.5s infinite;
}
@keyframes gelatine {
from, to { transform: scale(1, 1); }
25% { transform: scale(0.9, 1.1); }
50% { transform: scale(1.1, 0.9); }
75% { transform: scale(0.95, 1.05); }
}
Class name settings:
margin-left: 0.2em;:.name class.0.2em is a unit relative to the font size of the element. This means that the margin will be equal to 20% of the font size. The extra margin provides a small space between the .name element and the content to its left.font-weight: bold;:.name class.color: #000000;:#000000 is the hex code for the color black).In general, these styles ensure that names within elements with the .name class appear clearly prominent and well positioned within their container.
.name {
margin-left: 0.2em;
font-weight: bold;
color: #000000;
}
Full code
<div id="log" class="sl__chat__layout">
</div>
<script type="text/template" id="chatlist_item">
<div data-from="{from}" data-id="{messageId}">
<span class="meta" style="color: {color}">
<img class="chat-emote gelatine " src="url_imagen" alt="Chat Background">
<span class="badges">
</span>
<span class="name">{from}</span>
</span>
<span class="message">
{message}
</span>
</div>
</script>
@import url(https://fonts.googleapis.com/css?family=Roboto:700);
* {
box-sizing: border-box;
}
html, body {
height: 100%;
overflow: hidden;
}
body {
background: {background_color};
font-family: 'Calibri';
font-weight: 500;
font-size: {font_size};
line-height: 1.5em;
color: {text_color};
}
#log>div {
animation: fadeInRight .3s ease forwards, fadeOut 0.5s ease {message_hide_delay} forwards;
-webkit-animation: fadeInRight .3s ease forwards, fadeOut 0.5s ease {message_hide_delay} forwards;
}
.colon {
display: none;
}
#log {
position: absolute;
bottom: 0;
left: 0;
padding: 0 10px 10px;
width: 100%;
}
#log>div {
margin: 1em;
}
#log>div.deleted {
visibility: hidden;
}
#log .emote {
background-repeat: no-repeat;
background-position: center;
background-size: contain;
padding: 0.4em 0.2em;
position: relative;
}
#log .emote img {
display: inline-block;
height: 1em;
opacity: 0;
}
#log .message,#log .meta {
vertical-align: top;
display: table-cell;
padding-bottom: 0.1em;
}
#log .meta {
position: relative;
top: 15px;
display: inline;
background: linear-gradient(to right, #fdb9a3, #f15488);
border-radius: 15px 15px 15px 15px;
padding: 0.3em;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
box-shadow: 3px 5px 1px #af3349;
z-index: 99;
}
#log .message {
color: #292929;
background: #f49caf;
font-weight: bold;
padding: 1em 1em 0.8em 0.8em;
border-radius: 15px;
word-wrap: break-word;
width: 65%;
box-shadow:5px 7px 4px #c83d56;
position:relative;
}
.badge {
display: inline-block;
margin-right: 0.2em;
position: relative;
height: 1em;
vertical-align: middle;
top: -0.1em;
}
.name {
margin-left: 0.2em;
font-weight: bold;
color:#000000;
}
.chat-emote{
width: 6%;
display: inline-block;
margin:0px;
position: relative;
top: 0.5em;
}
.element{
margin: 0 auto;
animation-name: stretch;
animation-duration: 1.5s;
animation-timing-function: ease-out;
animation-delay:0;
animation-direction: alternate;
animation-iteration-count: infinite;
animation-fill-mode: none;
animation-play-state:running;
}
@keyframes stretch {
0% {
transform:scale(0.7);
border-radius: 100%;
}
100%{
transform: scale (1);
}
}
.gelatine {
animation: gelatine 0.5s infinite;
}
@keyframes gelatine {
from, to { transform: scale(1, 1); }
25% { transform: scale(0.9, 1.1); }
50% { transform: scale(1.1, 0.9); }
75% { transform: scale(0.95, 1.05); }
}
Final score
¡Oliwis! Les saluda su nekito íncubo, siempre en busca de un poco de vitalidad para mantenerse lleno de energía y buen humor. Hoy les traigo algo súper interesante y un tanto diferente al concepto de arte que todos conocemos. Para mí también ha sido una sorpresa descubrir que tengo el poder de crear este tipo de cosas.
Lo que les voy a mostrar es un chatbox. Pero, ¿qué es un chatbox? Es lo que utilizan los streamers para visualizar el chat durante sus transmisiones y permitir que sus viewers interactúen con ellos. Sin embargo, algunos llevan esto un paso más allá y crean diseños personalizados para su chat, añadiendo un toque único a sus streams.
Instrucciones:
Nombre del viewer:
#log .meta:
meta que está dentro de un elemento con el id log.position: relative;:
.meta está posicionado de manera relativa. Esto significa que se posicionará en relación a su posición normal en el flujo del documento.top: 15px;:
15px hacia abajo desde su posición original.display: inline;:
span), permitiendo que otros elementos estén en la misma línea.background: linear-gradient(to right, #fdb9a3, #f15488);:
#fdb9a3 y terminando con el color #f15488.border-radius: 15px 15px 15px 15px;:
15px en cada esquina.padding: 0.3em;:
0.3em dentro del elemento, entre su contenido y sus bordes.white-space: nowrap;:
text-overflow: ellipsis;:
...) cuando el contenido del texto es demasiado largo para caber en el área delimitada del elemento. Esta propiedad funciona en conjunto con white-space: nowrap y overflow: hidden.overflow: hidden;:
box-shadow: 3px 5px 1px #af3349;:
3px, un desplazamiento vertical de 5px, un desenfoque de 1px y un color de sombra #af3349.z-index: 99;:
z-index más bajos.Este bloque de código estiliza los elementos con la clase meta dentro del log para que se vean estéticamente agradables con un degradado de fondo, bordes redondeados, y una sombra, mientras se asegura de que el contenido textual no se desborde y que el texto se mantenga en una sola línea.
#log .meta {
position: relative;
top: 15px;
display: inline;
background: linear-gradient(to right, #fdb9a3, #f15488);
border-radius: 15px 15px 15px 15px;
padding: 0.3em;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
box-shadow: 3px 5px 1px #af3349;
z-index: 99;
}
Mensaje del viewer
#log .message:
message que está dentro de un elemento con el id log.color: #292929;:
#292929, un tono de gris oscuro.background: #f49caf;:
#f49caf, un tono rosado.font-weight: bold;:
padding: 1em 1em 0.8em 0.8em;:
1em en la parte superior y derecha, y 0.8em en la parte inferior e izquierda.border-radius: 15px;:
15px.word-wrap: break-word;:
width: 65%;:
65% del ancho de su contenedor padre.box-shadow: 5px 7px 4px #c83d56;:
5px, un desplazamiento vertical de 7px, un desenfoque de 4px, y un color de sombra #c83d56.position: relative;:
top, right, bottom y left.Este bloque de código estiliza los elementos con la clase message dentro del contenedor #log para que se vean visualmente atractivos con un color de texto y fondo específicos, texto en negrita, un padding generoso, esquinas redondeadas, y una sombra. La propiedad word-wrap asegura que el texto no se desborde del contenedor, mientras que el position: relative permite un posicionamiento ajustado dentro del flujo normal del documento.
#log .message {
color: #292929;
background: #f49caf;
font-weight: bold;
padding: 1em 1em 0.8em 0.8em;
border-radius: 15px;
word-wrap: break-word;
width: 65%;
box-shadow: 5px 7px 4px #c83d56;
position: relative;
}
Acomodo de elementos:
#log > div:
div que son hijos directos del elemento con el id log.> indica que el estilo solo se aplica a los hijos directos, no a los nietos o elementos más profundos en la jerarquía del DOM.margin: 1em;:
div hijos directos de #log.1em se aplica en todos los lados (superior, derecho, inferior e izquierdo).1em es una unidad relativa que corresponde al tamaño de la fuente del elemento actual. Por lo tanto, el margen será igual al tamaño de la fuente del elemento.Esta regla CSS añade un espacio (margen) de 1em alrededor de cada div que es un hijo directo del contenedor con el id log, separando visualmente cada div de los demás elementos circundantes.
#log > div {
margin: 1em;
}
Agregar emote:
Propósito del img:
<img> se utiliza para mostrar una imagen en la página web. En este caso, la imagen está situada dentro de un contenedor span con la clase meta, que también contiene el nombre del usuario y los posibles badges.Clase chat-emote , gelatine:
chat-emote asignada a la etiqueta <img> sugiere que la imagen está relacionada con un emote o un elemento visual asociado a los mensajes de chat.Fuente de la imagen (src):
src de la etiqueta <img> apunta a una URL específica. Esta URL proporciona la ubicación de la imagen en la web, la cual será cargada y mostrada en ese lugar específico dentro del mensaje de chat.Atributo alt:
alt proporciona texto alternativo para la imagen. Este texto se muestra si la imagen no se puede cargar y es importante para la accesibilidad, ya que describe la imagen a los usuarios de lectores de pantalla. En este caso, el texto alternativo es "Chat Background".La etiqueta <img> dentro del elemento con la clase meta se coloca para mostrar una imagen específica (dar un estilo mas unico) asociada con el usuario que envió el mensaje. Esto enriquece la experiencia del chat al añadir elementos visuales que pueden transmitir información adicional o simplemente decorar el mensaje.
<span class="meta" style="color: {color}">
<img class="chat-emote gelatine " src="URL_IMG" alt="Chat Background">
<span class="badges">
</span>
Ajustar emote clase chat-emote:
width: 6%;:
display: inline-block;:
inline), pero con las capacidades de un bloque (block). Esto significa que se puede establecer un ancho y un alto, y los márgenes y el relleno se comportarán de manera similar a los de un elemento de bloque.margin: 0px;:
position: relative;:
top: 0.5em;:
0.5em hacia abajo desde su posición original. La unidad em es relativa al tamaño de la fuente del elemento actual, por lo que 0.5em es la mitad del tamaño de la fuente del elemento. Esto se usa para ajustar la alineación vertical de la imagen dentro de su contenedor.Estas propiedades aseguran que las imágenes de los emotes se vean bien alineadas, correctamente dimensionadas y sin espacio innecesario alrededor, proporcionando una apariencia limpia y profesional en el chat.
.chat-emote {
width: 6%;
display: inline-block;
margin: 0px;
position: relative;
top: 0.5em;
}
Animacion emote:
Clase .element
margin: 0 auto;:
0 en la parte superior e inferior y auto en los lados izquierdo y derecho. Esto centra horizontalmente el elemento dentro de su contenedor.animation-name: stretch;:
stretch. La animación stretch debe estar definida en un bloque @keyframes en otro lugar del CSS.animation-duration: 1.5s;:
1.5 segundos.animation-timing-function: ease-out;:
ease-out hace que la animación comience rápido y luego disminuya la velocidad hacia el final.animation-delay: 0;:
0 segundos).animation-direction: alternate;:
animation-iteration-count: infinite;:
animation-fill-mode: none;:
animation-play-state: running;:
.element {
margin: 0 auto;
animation-name: stretch;
animation-duration: 1.5s;
animation-timing-function: ease-out;
animation-delay: 0;
animation-direction: alternate;
animation-iteration-count: infinite;
animation-fill-mode: none;
animation-play-state: running;
}
Bloque @keyframes stretch
0% y 100%:
transform: scale(0.7);:
0% (inicio de la animación), el elemento se escala a 70% de su tamaño original.border-radius: 100%;:
0%, el borde del elemento es completamente redondeado, formando un círculo.transform: scale(1);:
100% (final de la animación), el elemento se escala de nuevo a su tamaño original (100%).@keyframes stretch {
0% {
transform: scale(0.7);
border-radius: 100%;
}
100% {
transform: scale(1);
}
}
Clase .gelatine
animation: gelatine 0.5s infinite;:
gelatine al elemento, con una duración de 0.5 segundos, y se repite infinitamente..gelatine {
animation: gelatine 0.5s infinite;
}
Bloque @keyframes gelatine
from, to { transform: scale(1, 1); }:
scale(1, 1)).25% { transform: scale(0.9, 1.1); }:
25% del ciclo de animación, el elemento se escala a 90% de su ancho y 110% de su alto, creando un efecto de estiramiento vertical.50% { transform: scale(1.1, 0.9); }:
50% del ciclo de animación, el elemento se escala a 110% de su ancho y 90% de su alto, creando un efecto de estiramiento horizontal.75% { transform: scale(0.95, 1.05); }:
75% del ciclo de animación, el elemento se escala a 95% de su ancho y 105% de su alto, creando un ligero efecto de estiramiento vertical.@keyframes gelatine {
from, to { transform: scale(1, 1); }
25% { transform: scale(0.9, 1.1); }
50% { transform: scale(1.1, 0.9); }
75% { transform: scale(0.95, 1.05); }
}
Resumen
stretch) que alterna entre dos estados (de menor a mayor tamaño) de forma infinita y con una duración de 1.5 segundos.gelatine) que escala el elemento en diferentes proporciones para crear un efecto rebote, con una duración de 0.5 segundos y que se repite infinitamente.Codigo completo de la animacion emote:
.element{
margin: 0 auto;
animation-name: stretch;
animation-duration: 1.5s;
animation-timing-function: ease-out;
animation-delay:0;
animation-direction: alternate;
animation-iteration-count: infinite;
animation-fill-mode: none;
animation-play-state:running;
}
@keyframes stretch {
0% {
transform:scale(0.7);
border-radius: 100%;
}
100%{
transform: scale (1);
}
}
.gelatine {
animation: gelatine 0.5s infinite;
}
@keyframes gelatine {
from, to { transform: scale(1, 1); }
25% { transform: scale(0.9, 1.1); }
50% { transform: scale(1.1, 0.9); }
75% { transform: scale(0.95, 1.05); }
}
Ajustes clase name:
margin-left: 0.2em;:
.name.0.2em es una unidad relativa al tamaño de la fuente del elemento. Esto significa que el margen será equivalente al 20% del tamaño de la fuente. El margen adicional proporciona un pequeño espacio entre el elemento .name y el contenido a su izquierda.font-weight: bold;:
.name.color: #000000;:
#000000 es el código hexadecimal para el color negro).En general, estos estilos aseguran que los nombres dentro de los elementos con la clase .name se vean claramente destacados y bien posicionados dentro de su contenedor.
.name {
margin-left: 0.2em;
font-weight: bold;
color: #000000;
}
Codigo completo
<div id="log" class="sl__chat__layout">
</div>
<script type="text/template" id="chatlist_item">
<div data-from="{from}" data-id="{messageId}">
<span class="meta" style="color: {color}">
<img class="chat-emote gelatine " src="url_imagen" alt="Chat Background">
<span class="badges">
</span>
<span class="name">{from}</span>
</span>
<span class="message">
{message}
</span>
</div>
</script>
@import url(https://fonts.googleapis.com/css?family=Roboto:700);
* {
box-sizing: border-box;
}
html, body {
height: 100%;
overflow: hidden;
}
body {
background: {background_color};
font-family: 'Calibri';
font-weight: 500;
font-size: {font_size};
line-height: 1.5em;
color: {text_color};
}
#log>div {
animation: fadeInRight .3s ease forwards, fadeOut 0.5s ease {message_hide_delay} forwards;
-webkit-animation: fadeInRight .3s ease forwards, fadeOut 0.5s ease {message_hide_delay} forwards;
}
.colon {
display: none;
}
#log {
position: absolute;
bottom: 0;
left: 0;
padding: 0 10px 10px;
width: 100%;
}
#log>div {
margin: 1em;
}
#log>div.deleted {
visibility: hidden;
}
#log .emote {
background-repeat: no-repeat;
background-position: center;
background-size: contain;
padding: 0.4em 0.2em;
position: relative;
}
#log .emote img {
display: inline-block;
height: 1em;
opacity: 0;
}
#log .message,#log .meta {
vertical-align: top;
display: table-cell;
padding-bottom: 0.1em;
}
#log .meta {
position: relative;
top: 15px;
display: inline;
background: linear-gradient(to right, #fdb9a3, #f15488);
border-radius: 15px 15px 15px 15px;
padding: 0.3em;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
box-shadow: 3px 5px 1px #af3349;
z-index: 99;
}
#log .message {
color: #292929;
background: #f49caf;
font-weight: bold;
padding: 1em 1em 0.8em 0.8em;
border-radius: 15px;
word-wrap: break-word;
width: 65%;
box-shadow:5px 7px 4px #c83d56;
position:relative;
}
.badge {
display: inline-block;
margin-right: 0.2em;
position: relative;
height: 1em;
vertical-align: middle;
top: -0.1em;
}
.name {
margin-left: 0.2em;
font-weight: bold;
color:#000000;
}
.chat-emote{
width: 6%;
display: inline-block;
margin:0px;
position: relative;
top: 0.5em;
}
.element{
margin: 0 auto;
animation-name: stretch;
animation-duration: 1.5s;
animation-timing-function: ease-out;
animation-delay:0;
animation-direction: alternate;
animation-iteration-count: infinite;
animation-fill-mode: none;
animation-play-state:running;
}
@keyframes stretch {
0% {
transform:scale(0.7);
border-radius: 100%;
}
100%{
transform: scale (1);
}
}
.gelatine {
animation: gelatine 0.5s infinite;
}
@keyframes gelatine {
from, to { transform: scale(1, 1); }
25% { transform: scale(0.9, 1.1); }
50% { transform: scale(1.1, 0.9); }
75% { transform: scale(0.95, 1.05); }
}
Resultado Final
Separator, image of a little pig made by @softy1231 softy1231
Vtuber, Panels made by @panna-natha pannanatha
Logo made by KivaVT