Повторный пользовательский интерфейс | Repeating user interface
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.3KB

  1. ПлавноОтобразитьСкрыть = function(элемент, настройки = null)
  2. {
  3. this.отобразить = () =>
  4. {
  5. this.показываем = true;
  6. элемент.style.display = "block";
  7. this.преобразования.innerHTML = `
  8. #${элемент.id}
  9. {
  10. opacity: 0;
  11. animation: ${элемент.id}ПлавноОтобразить 0.4s ease;
  12. animation-fill-mode: forwards;
  13. animation-delay: ${this.настройки.задержка}s;
  14. }
  15. `;
  16. };
  17. this.скрыть = () =>
  18. {
  19. this.показываем = false;
  20. this.преобразования.innerHTML = `
  21. #${элемент.id}
  22. {
  23. opacity: ${this.настройки.прозрачность};
  24. animation: ${элемент.id}ПлавноСкрыть 0.4s ease;
  25. animation-fill-mode: forwards;
  26. animation-delay: ${this.настройки.задержка}s;
  27. }
  28. `;
  29. };
  30. this.__задатьНастройкиПоУмолчанию = () =>
  31. {
  32. var умолчание = {
  33. "задержка": 0,
  34. "прозрачность": 1,
  35. "отклик": {},
  36. };
  37. if (!настройки)
  38. {
  39. this.настройки = умолчание;
  40. }
  41. else
  42. {
  43. this.настройки = настройки;
  44. }
  45. for (var ключ in умолчание)
  46. {
  47. if (!(ключ in this.настройки))
  48. {
  49. this.настройки[ключ] = умолчание[ключ];
  50. }
  51. }
  52. };
  53. this.__создатьКадры = () =>
  54. {
  55. this.кадры = document.createElement("style");
  56. document.head.appendChild(this.кадры);
  57. this.кадры.innerHTML = `
  58. @keyframes ${элемент.id}ПлавноОтобразить
  59. {
  60. 0%
  61. {
  62. opacity: 0;
  63. }
  64. 100%
  65. {
  66. opacity: ${this.настройки.прозрачность};
  67. }
  68. }
  69. @keyframes ${элемент.id}ПлавноСкрыть
  70. {
  71. 0%
  72. {
  73. opacity: ${this.настройки.прозрачность};
  74. }
  75. 100%
  76. {
  77. opacity: 0;
  78. }
  79. }
  80. `;
  81. };
  82. this.__создатьПреобразования = () =>
  83. {
  84. this.преобразования = document.createElement("style");
  85. document.head.appendChild(this.преобразования);
  86. };
  87. this.__отслеживатьЗавершениеАнимации = () =>
  88. {
  89. this.показываем = true;
  90. var тут = this;
  91. элемент.addEventListener(
  92. "animationend",
  93. function()
  94. {
  95. if (тут.показываем && тут.настройки.отклик.отображение)
  96. {
  97. тут.настройки.отклик.отображение();
  98. }
  99. else if (!тут.показываем)
  100. {
  101. элемент.style.display = "none";
  102. if (тут.настройки.отклик.скрытие)
  103. {
  104. тут.настройки.отклик.скрытие();
  105. }
  106. }
  107. }
  108. );
  109. };
  110. // Конструктор.
  111. this.__задатьНастройкиПоУмолчанию();
  112. this.__создатьКадры();
  113. this.__создатьПреобразования();
  114. this.__отслеживатьЗавершениеАнимации();
  115. };
  116. // Часто используемые варианты в одну строку.
  117. // 常用的单线变型
  118. // Frequently used single line variants.
  119. плавноСкрытьИУдалить = (id, настройки = null) =>
  120. {
  121. var элемент = $(`#${id}`);
  122. var плавно = new ПлавноОтобразитьСкрыть(элемент.get(0), настройки);
  123. плавно.настройки.отклик.скрытие = function() {
  124. элемент.remove();
  125. };
  126. плавно.скрыть();
  127. };
  128. // // // //
  129. плавноСкрыть = (id, настройки = null) =>
  130. {
  131. var элемент = $(`#${id}`);
  132. var плавно = new ПлавноОтобразитьСкрыть(элемент.get(0), настройки);
  133. плавно.скрыть();
  134. };