Идея взята у Dan Eden (demo), я лишь немного доработал способ.
Суть
В качестве круга используем обычный блок с рамкой. Рамка может иметь любой цвет и ширину (в этом и уникальность способа, что блок абсолютно независим от фона и прочих вещей). Рамку мы скругляем на 100% и делаем верхнюю её часть прозрачной. В этот самый пробел мы и вставляем треугольник (хак с нулевым размером блока и границей), используя наши любимые псевдо-элементы. Ну и под конец анимируем блок для имитации эффекта загрузки.
Разметка:
<span class="spinner"></span>
CSS:
.spinner {
display: block;
width: 35px;
height: 35px;
margin: 80px 150px;
position: relative;
border: 2px solid rgba(0,0,0,0.5);
border-top-color: transparent;
border-radius: 100%;
animation: spin 1s infinite linear;
}
.spinner:after {
content: '';
display: block;
width: 0;
height: 0;
position: absolute;
top: -6px;
left: 3px;
border: 6px solid transparent;
border-bottom-color: rgba(0,0,0,0.5);
transform: rotate(45deg);
}
@keyframes spin {
to { transform: rotate(360deg); }
}
Не забывайте указывать префиксы для браузеров!
Способ работает во всех современных браузерах (IE<=9, давай до свидания!)
Демо на jsfiddle