Я пытаюсь создать анимированные звуковые панели, используя jquery (js скрипка здесь: http://jsfiddle.net/rhK4n/)
HTML
<div class="eq">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
CSS
.bar {
background-color: green;
width:15px;
height:40px;
display: inline-block;
vertical-align: bottom;
}
JQuery
function fluctuate(bar) {
var hgt = Math.random() * 10;
hgt += 1;
var t = hgt * 30;
bar.animate({
height: hgt
}, t, function() {
fluctuate($(this));
});
}
$(".bar").each(function(i) {
fluctuate($(this));
});
Я хочу, чтобы саунд-бары были высотой 40 пикселей.
Однако этот метод сжимает их до c.15px, и поэтому базовый уровень перемещается вверх и вниз, я хочу, чтобы он был исправлен.
Я не могу понять, почему эта ошибка происходит.
Чтобы остановить базовый уровень от перемещения вверх и вниз, вам нужно сделать некоторые вещи с помощью CSS. Может быть несколько возможных решений, вот один.
В основном CSS всегда работает из верхней строки и базовой линии. Но, используя абсолютное позиционирование, вы можете " .eq
панели в нижней части .eq
div. Затем вам нужно разделить бары отдельно, но я думаю, что это даст вам результаты ближе к тому, что вы хотите.
Почему не высокая производительность css только звуковая анимация :)
Пожалуйста, проверьте это перо и sass css:
$bars-number: 40; // this must reflect markup changes in html too
$bar-color: blue;
.animate-bars {
display: flex;
align-items: center;
width: 300px;
height: 40px;
overflow: hidden;
background-color: lighten($bar-color, 45%);
div {
flex: 1 0 auto;
height: 100%;
margin: 0 -2px;
background-color: $bar-color;
animation: animate-bar 300ms linear infinite alternate;
transform-origin: bottom;
opacity: 0;
&:first-child {
margin-left: 0;
}
&:last-child {
margin-right: 0;
}
@for $i from 1 to $bars-number + 1 {
&:nth-child(#{$i}) {
animation-duration: (350 + random(450)) + ms;
animation-delay: random(500) + ms;
}
}
}
}
@keyframes animate-bar {
0% {
transform: scaleY(0);
opacity: .8;
}
100% {
transform: scaleY(100%);
opacity: .4;
}
}
В исходном коде вы возвращаете высоту, которая является целым числом в диапазоне [0,1), а затем добавляет 1 к значению. Затем вы масштабируете значение на 30. Вы должны возвращать случайное целое число между диапазоном [0,40) следующим образом:
var amplitude = Math.floor(Math.random() * 40) + 1;
Таким образом, ваш код может выглядеть так:
function fluctuate(bar) {
var height = Math.floor(Math.random() * 40) + 1;
//Animate the equalizer bar repeatedly
bar.animate({
height: height
}, function() {
fluctuate($(this));
});
}
$(".bar").each(function(i) {
fluctuate($(this));
});
Или, если вам нужны значения с плавающей запятой, используйте:
var height = (Math.random() * (40.000)).toFixed(4)
EDIT: Здесь работает jsFiddle, который показывает, как вы можете справиться с базовой проблемой: http://jsfiddle.net/3mhJJ/. Это решение не требует, чтобы вы отдельно располагали каждую панель эквалайзера.