Повторный пользовательский интерфейс | 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.

123 line
3.5KB

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