Задать вопрос
@kirill-93

Дергается элемент при изменении размера iframe?

Здравствуйте! Помогите, пожалуйста, мучаюсь уже третий день.
Понадобилось сделать виджет, который будет устанавливаться на сайты клиентов. Виджет - айфрейм, который загружает страницу с формой. По умолчанию вместо формы показывается кнопка, при нажатии на которую открывается форма. В общем работать это должно, как какой-нибудь онлайн чат (Jivo и тп).
Я решил сделать следующим образом:
1) Клиентам, которые захотят у себя форму установить мы отправляем js-код, который добавляет айфреймна страницу клиента и загружает в айфрейм нашу страницу с формой.
2) Наша страница с формой имеет два состояния: открыт/закрыт. Но размеры у кнопки и открытой формы разные, поэтому айфрейм на странице клиента должен менять размер. Для этого при нажатии на кнопку летит postMessage в родительское окно (на сайт клиента), которое меняет размер фрейма.

Вот примерный код, который устанавливает себе клиент:
<style>
/*Iframe отображает кнопку, поэтому размер маленький*/
.widget {width:100px; height: 100px; position: fixed; bottom:40px;right: 40px; border:1px solid red;}
/*Iframe отображает открытую форму, поэтому его размер увеличен под нее*/
.widget.open {width: 300px; height: 500px;}
</style>
<script>
window.addEventListener('message', e => {
    //Просто меняем размер iframe
    document.querySelector('.widget').classList.toggle('open');
});
</script>
<iframe class="widget" src="widget.html"></iframe>


А вот код самой страницы widget.html:
<style>
/*.button - кнопка формы*/
.button {width: 80px; height: 80px; background: blue; position: fixed; bottom: 10px; right: 10px;}
/*.form - открытая форма*/
.form {width: 300px; height: 500px; background: yellow; position: fixed; bottom: 0; right: 0; display: none;}
.form.open {display: block}
</style>
<script>
document.querySelector('.button').onclick = e => {
    //Отправляем postMessage на изменения окна iframe
    parent.postMessage(...);
    //Показываем/скрываем форму
    document.querySelector('.form').classList.toggle('open');
};
</script>
<div class="button"></div>
<div class="form"></div>


Вот такой код работает как задумано и все хорошо на локальном ПК. Но когда я это выложил на хостинг и разнес по разным доменам, появился неприятный эффект.
5f0579e76694c958095924.gif

При изменении размера фрейма содержимое его немного дергается. Если присмотреться, то иногда видно, что позиция кнопки внутри на долю секунды перемещается вверх. Как будто айфрейм увеличился, а кнопка внутри "неуспевает" оставаться приклеенной к правому нижнему углу и сначала перемещается наверх вслед за айфреймом, а затем возвращается на нужное место.
Примечательно, что при разработке, когда оба файла на локальной машине, такой проблемы нет. Это странно, ведь postMessage передается между окнами браузера и не должно быть разницы где находится сайт.
Помогите, пожалуйста, решить проблему.
  • Вопрос задан
  • 97 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 11:03
5000 руб./за проект
18 дек. 2024, в 10:44
130000 руб./за проект
18 дек. 2024, в 10:02
7000 руб./за проект