CSS más fácil para notificaciones de estilo "rojo" de Facebook

87

Necesito una notificación al estilo de Facebook, pero conseguir algo que se vea bien en varios navegadores parece complicado. Por ejemplo, los diferentes navegadores parecen tratar los rellenos de manera diferente, lo que resulta en notificaciones de aspecto extraño.

¿Cuál es la mejor forma en todos los navegadores de garantizar que las notificaciones se muestren correctamente? No es adverso al uso de javascript, pero es preferible el CSS puro.

ingrese la descripción de la imagen aquí

ming yeow
fuente
7
Facebook usa CSS3: si el usuario no tiene un navegador que lo admita, existen otras reglas para que se degrade. Por ejemplo, los usuarios de IE no obtendrían esquinas redondeadas.
Chris Baker
¿De Verdad? esa es una gran información.
ming yeow

Respuestas:

172

La mejor forma de conseguirlo es mediante el posicionamiento absoluto :

/* Create the blue navigation bar */
.navbar {
  background-color: #3b5998;
  font-size: 22px;
  padding: 5px 10px;
}

/* Define what each icon button should look like */
.button {
  color: white;
  display: inline-block; /* Inline elements with width and height. TL;DR they make the icon buttons stack from left-to-right instead of top-to-bottom */
  position: relative; /* All 'absolute'ly positioned elements are relative to this one */
  padding: 2px 5px; /* Add some padding so it looks nice */
}

/* Make the badge float in the top right corner of the button */
.button__badge {
  background-color: #fa3e3e;
  border-radius: 2px;
  color: white;
 
  padding: 1px 3px;
  font-size: 10px;
  
  position: absolute; /* Position the badge within the relatively positioned button */
  top: 0;
  right: 0;
}
<!-- Font Awesome is a great free icon font. -->
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet"/>

<div class="navbar">
  <div class="button">
    <i class="fa fa-globe"></i>
    <span class="button__badge">2</span>
  </div>
  <div class="button">
    <i class="fa fa-comments"></i>
    <span class="button__badge">4</span>
  </div>
</div>

Titus
fuente
1
Cambie <div id = "notif_Container"> a <div id = "noti_Container"> para que funcione
Vackup
3
Aprobado por la compatibilidad con ie7, 8 y 9. Ie6 funciona un poco también, pero ya no me importa :)
Benjamin Crouzier
1
Esto es increíble, tuve que ponerlo en la sección <li> de una pestaña de Jquery para que funcione, pero funciona muy bien.
sudoroso
Funciona incluso si lo usé varias veces en una página simplemente reemplazando la identificación del contenedor.
Web_Developer
34

Aquí hay uno que incluye animación para cuando cambia el conteo.

http://jsfiddle.net/rahilsondhi/FdmHf/4/

<ul>
<li class="notification-container">
    <i class="icon-globe"></i>
    <span class="notification-counter">1</span>
</li>

    .notification-container {
    position: relative;
    width: 16px;
    height: 16px;
    top: 15px;
    left: 15px;

    i {
        color: #fff;
    }
}

.notification-counter {   
    position: absolute;
    top: -2px;
    left: 12px;

    background-color: rgba(212, 19, 13, 1);
    color: #fff;
    border-radius: 3px;
    padding: 1px 3px;
    font: 8px Verdana;
}




$counter
.css({opacity: 0})
.text(val)
.css({top: '-10px'})
.transition({top: '-2px', opacity: 1})

Animación con jQuery:

$('button').click(function()
{
    var $counter = $('.notification-counter')
    var val = parseInt $counter.text();
    val++;
    $counter.css({opacity: 0}).text(val).css({top:'-10px'}).animate({top: '-1px', opacity: 1}, 500);
});

Utiliza Font Awesome para el icono del globo y jQuery Transit para la animación.

Rahil Sondhi
fuente
2
@AmbiguousTk se sirve con un complemento de transición jquery.transit.min.js O en su lugar, puede usar: code$ counter.css ({opacity: 0}) .text (val) .css ({top: '-10px'}). animar ({top: '-1px', opacidad: 1}, 500); code
Marcel Djaman
¡Muchas gracias! Me ahorra tiempo.
Adrian P.
4

Probablemente absoluteposicionamiento:

<div id="globe" style="height: 30px; width: 30px; position: relative;">
 <img src="/globe.gif" />
 <div id="notification" style="position: absolute; top: 0; right;0;">1</div>
</div>

Algo como eso. Obviamente, querrá cambiar los detalles y probablemente usar imágenes de fondo. El punto es enfatizar el posicionamiento absoluto que es realmente consistente en todos los navegadores, al menos en mi experiencia.

Dustin Laine
fuente
1

Margen:

<div id="ContainerDiv">
    <div id="MainImageDiv"> //Add the image here or whatever you want </div>
    <div id="NotificationDiv"> </div>
</div>

CSS:

#NotificationDiv {
    position: absolute;
    left: -10 //use negative values to push it above the #MainImageDiv
    top: -4 
    ...
}
neebz
fuente
0

Estoy seguro de que las respuestas sobre el posicionamiento absoluto son correctas. Por el bien del experimento, traté de hacer una solución solo para SVG. El resultado está lejos de ser ideal, ¿tal vez alguien conoce una solución más elegante para un rompecabezas svg similar? :)

http://jsfiddle.net/gLdsco5p/3/

<svg width="64" height="64" viewBox="0 0 91 91">
    <rect id="Artboard1" x="0" y="0" width="90.326" height="90.326" style="fill:none;"/>
    <g id="Artboard11" serif:id="Artboard1">
        <g id="user-circle-o" transform="matrix(2.69327,0,0,2.69327,7.45723,7.45723)">
            <path d="M14,0C21.734,0 28,6.266 28,14C28,21.688 21.766,28 14,28C6.25,28 0,21.703 0,14C0,6.266 6.266,0 14,0ZM23.672,21.109C25.125,19.109 26,16.656 26,14C26,7.391 20.609,2 14,2C7.391,2 2,7.391 2,14C2,16.656 2.875,19.109 4.328,21.109C4.89,18.312 6.25,16 9.109,16C10.375,17.234 12.093,18 14,18C15.907,18 17.625,17.234 18.891,16C21.75,16 23.11,18.312 23.672,21.109ZM20,11C20,7.687 17.312,5 14,5C10.688,5 8,7.688 8,11C8,14.312 10.688,17 14,17C17.312,17 20,14.312 20,11Z" style="fill:rgb(190,190,190);fill-rule:nonzero;"/>
        </g>
        <g transform="matrix(1,0,0,1,1.36156,0)">
            <circle cx="63.708" cy="18.994" r="9.549" style="fill:rgb(255,0,0);"/>
        </g>
        <g transform="matrix(1.66713,0,0,1.66713,-51.5278,-2.33264)">
            <text  id="counter" x="68.034px" y="15.637px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:7.915px;fill:white;">1</text>
        </g>
    </g>
</svg>
nektobit
fuente