smidl
@smidl
WordPress-разработчик

Как заставить меняться бекграунд без «рывков»?

Суть проблемы в том, что на сайте есть вот такая штука на главной странице.

Половинки свитеров меняются следующим кодом ( не плеваться на код, достался в наследство почти):

jQuery(document).ready(function($) {

// определим переменные и их начальное значение
var lcolor = 3 , rcolor = 50, leftTextColor, rightTextColor;

function leftSwitch() {
if (lcolor>5) {lcolor=0};
lcolor = lcolor+1;

// Цвет текста
if (lcolor== 1) {leftTextColor="#B69481"};
if (lcolor== 2) {leftTextColor="#3763A1"};
...

$('.lhalf').css('background-image', 'url(http://sheepontheship.ru/wp-content/themes/sheeponsheep/img/halfs/'+lcolor+'.png)');
$('.left-text').css('color', leftTextColor);

}

function rightSwitch() {
if (rcolor>50) {rcolor=0};
rcolor = rcolor+10;

// Цвет текста
if (rcolor== 10) {rightTextColor="#B69481"};
if (rcolor== 20) {rightTextColor="#3763A1"};
...

// Установим значения
$('.rhalf').css('background-image', 'url(http://sheepontheship.ru/wp-content/themes/sheeponsheep/img/halfs/'+rcolor+'.png)');
$('.right-text').css('color', rightTextColor);

setTimeout(leftSwitch, 3000);
}

setInterval(rightSwitch, 6000) // правая половинка

});


Вроде бы и работает, но если посмотреть подольше - меняется иногда рывками, такое же наблюдается и при быстрых кликах на половинки в конструкторе.

Добавлял половинкам transition:

.lhalf {
    float: left;
    width: 287px;
    min-height: 522px;
    background: transparent url(img/halfs/3.png) top left no-repeat;
    background-size: contain;
    z-index: 8;
    -webkit-transition: all .7s;
    -moz-transition: all .7s;
    -o-transition: all .7s;
    transition: all .7s;
}

.rhalf {
    float: left;
    width: 342px;
    min-height: 522px;
    background: transparent url(img/halfs/50.png) top right no-repeat;
    background-size: contain;
    margin-left: -56px;
    z-index: 10;
   -webkit-transition: all  .7s;
    -moz-transition: all  .7s;
    -o-transition: all .7s;
    transition: all .7s;
}


Не хватает знаний, чтобы понять где трабла. Спасайте, коллеги!
  • Вопрос задан
  • 293 просмотра
Решения вопроса 2
DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?
Проблема в том, что background-image - не анимируемое свойство.
https://www.w3.org/TR/css3-transitions/#animatable...

Могу только предложить блокировать кнопки выбора цвета, пока время трансформации не прошло.
Если переключать цвета медленно, то всё ок.
Ответ написан
AMar4enko
@AMar4enko
Тут проблема в том, что браузер не дурак - он не будет в ресурсах держать изображения, которые не используются на странице, также как и начинать их грузить, пока они не требуются.
Когда вы переключаете текстуры, браузер неиспользуемые "забывает" - и когда вы в очередной раз такую "забытую" текстуру суете в background-url с помощью стилей, он ее тянет из интернетов заново (посмотрите консоль запросов).
Путь решения - подгружаете изображение с помощью new Image(), конвертируете в base64, полученный base64 используете в качестве значения для background-image.

Еще вариант без base64, который, возможно, сработает - сделать для каждой текстуры по элементу, один раз установить элементам background-image и менять текстуры анимируя opacity соотв. элементов.

Можно еще с Canvas поплясать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kpa6uu
@kpa6uu
Программист Талибана [Пыхерский Алибаба]
"Рывками" меняется только при первом клике на цвет в конструкторе, т.к. в момент клика подгружаются текстурки.
Грузите их во время открытия сайта, создав прелоадер. И будет счастье)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы