/* 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>
/* IGNORE this Javascript part.
It's just here to let you change the size with
a slider. Press Run and try it. */
var boxes = document.getElementsByClassName("mailbox");
function updateFontSize(size) {
for (var i = 0; i < boxes.length; i++) {
boxes[i].style.fontSize = size + "px";
}
}
var px = getComputedStyle(boxes[0]).fontSize
var label = document.getElementById("label");
label.innerHTML = px
var slider = document.getElementById('slider');
slider.value = px.slice(0, -2)
slider.onchange = () => {
label.innerHTML = slider.value + "px";
updateFontSize(slider.value);
}
.mailbox {
position: relative;
font-size: 16px;
line-height: 2.5em;
margin: 0.3em;
}
.notification {
/* circle shape, size and position */
position: absolute;
right: -0.7em;
top: -0.7em;
min-width: 1.6em; /* or width, explained below. */
height: 1.6em;
border-radius: 0.8em; /* or 50%, explained below. */
border: 0.05em solid white;
background-color: red;
/* number size and position */
display: flex;
justify-content: center;
align-items: center;
font-size: 0.8em;
color: white;
}
6条答案
按热度按时间uajslkp61#
最好的方法是使用绝对定位:
4szc88ey2#
这里有一个包含计数变化时的动画。
http://jsfiddle.net/rahilsondhi/FdmHf/4/
jQuery动画:
它使用Font Awesome作为地球仪图标,使用jQuery Transit作为动画。
ql3eal8s3#
responsive字体相关大小整形解决方案
正如其他答案所说,相对定位的父项的绝对定位是将指示器定位在右上角(或您喜欢的任何角落)的非常可靠的方法。
但还有其他非常重要的考虑因素:
1.大小:不仅仅是相对于它所标记的内容,还包括如果数字变长会发生什么?
1.形状:理想情况下是圆形,但如果数字变长会发生什么?
1.浮动外观:它应该看起来漂浮在角落之上,而不是在里面。
1.边框:可选地,根据所涉及的颜色,您可能需要一个微妙的边界或阴影。
1.可访问性:对通知进行适当的标记,以便视力受损者可访问该通知。
像公认的答案那样以
px
为单位执行上述操作非常混乱、脆弱,而且根本不是responsive。下面的CSS以一种优雅的响应方式解决了上述所有问题:
关键事项:
1.具有
.notification
类的元素将显示在包含它的元素的右上角。例如,它将显示在此邮箱按钮的右上角:
如果它的位置看起来不对,请使用浏览器的开发工具来检查父元素的真实边界。
1.如果您希望无论计数多大,指示器都是圆形,请将
min-width
更改为width
,并将border-radius
设置为50%
。上面的CSS被设计为在计数变大时水平拉伸,如下所示(就像许多人的收件箱一样🤣)。1.对于可访问性,您应该在notification元素中包含
role="status"
,如上所示。现场演示
这里有一个实时演示,沿着一个滑块,以便您可以看到它如何响应字体大小的变化:
比较the accepted answer:
要查看差异,请运行以下接受答案方法的现场演示:
tv6aics14#
可能是
absolute
定位:差不多吧显然,您可能希望更改细节,并可能使用背景图像。重点是强调绝对定位,它在浏览器中确实是一致的,至少在我的经验中是这样。
oyjwcjzk5#
标记:
CSS:
ulmd4ohb6#
我确信关于绝对定位的答案是正确的。为了实验,我尝试了一个仅SVG的解决方案。结果远非理想,也许有人知道一个更优雅的解决类似的svg难题的方法?:)
http://jsfiddle.net/gLdsco5p/3/