Facebookスタイルの「赤」通知の最も簡単なCSS


88

Facebookスタイルの通知が必要ですが、クロスブラウザで見栄えのするものを取得するのは難しいようです。たとえば、ブラウザが異なればパディングの処理も異なるようで、通知の外観がおかしくなります。

通知が適切に表示されるようにするための最良のクロスブラウザー方法は何ですか?javascriptの使用に悪影響はありませんが、もちろん純粋なcssが望ましいです

ここに画像の説明を入力してください


7
FacebookはCSS3を使用しています-ユーザーがCSS3をサポートするブラウザーを持っていない場合、それを低下させる他のルールがあります。たとえば、IEユーザーは角を曲がることはありません。
クリスベイカー

本当に?それは素晴らしい情報です。
ming yeow 2011

回答:


172

これを実現する最良の方法は、絶対位置決めを使用することです。

/* 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>


1
<div id = "notif_Container">を<divid = "noti_Container">に変更して機能させる
Vackup 2012

3
ie7、8、9のサポートに賛成です。Ie6も同様に機能しますが、もう気にしません:)
Benjamin Crouzier 2013年

1
これは素晴らしいです。機能させるには、Jqueryタブの<li>セクションに配置する必要がありましたが、うまく機能します。
汗まみれの2015年

コンテナのIDを置き換えるだけで、ページで何度も使用した場合でも機能します。
web_Developer 2016

34

これは、カウントが変更されたときのアニメーションを含むものです。

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})

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);
});

地球のアイコンにはFontAwesomeを使用し、アニメーションにはjQueryTransitを使用します。


2
@AmbiguousTkトランジションプラグインjquery.transit.min.jsによって提供されます。または、代わりに:code$ counter.css({opacity:0})。text(val).css({top: '-10px'})を使用できます。 animate({top: '-1px'、opacity:1}、500); code
Marcel Djaman 2013年

どうもありがとう!私の時間を節約します。
エイドリアンP.

4

おそらくabsoluteポジショニング:

<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>

そんな感じ。明らかに、詳細を変更し、おそらく背景画像を使用する必要があります。重要なのは、少なくとも私の経験では、ブラウザ間で実際に一貫している絶対的な位置付けを強調することです。


1

マークアップ:

<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 
    ...
}

0

絶対位置についての答えは正しいと確信しています。実験のために、SVGのみのソリューションを作成しようとしました。結果は理想からほど遠いです、多分誰かが同様のsvgパズルへのよりエレガントな解決策を知っていますか?:)

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.