Краткий справочник по jquery

Простая анимация SVG | vivus.js

21111

892

50

00:23:55

12.11.2019

В данном видео вы узнаете как легко сделать анимацию для ваших SVG иконок на сайте. В этом нам поможет скрипт vivus.js

// Ссылки =

Vivus.js github: 🤍
Материалы урока: 🤍

// О проекте =

Меня зовут Дмитрий Валак. Я занимаюсь разработкой сайтов уже много лет, специализируюсь больше на front-end разработке и верстке сайтов, но и программирование тоже изучаю. Здесь буду делиться с вами информацией на разные темы по веб-разрабокте — HTML, CSS, Javascript, JQuery, Vue, PHP, MySQL, React, Gulp и тд.

На сайте проекта 🤍 вы найдете много полезных закрытых материалов, а так же сможете поработать со мной лично, при наличии такого желания.

// Соц. сети =

Мой ВК — 🤍
Группа BC — 🤍
Мой Instagram: 🤍

«Базовый JavaScript» от Андрея Андриевского

Пройти курс

Продолжительность: 24 видео различной длительности.

Документ об прохождении курса: не выдаётся.

Формат обучения: видеоролики. Личное общение с преподавателями, практические занятия не предусмотрены.

Программа обучения: в роликах даётся информация о массивах, условных операторах, объектах и работе с ними, работе с Dom, написании игр.

Чему можно научиться на курсе:

  • работать с циклами (while) и условными операторами (if);
  • работать с Dom;
  • писать собственные игры;
  • обрабатывать события.

Плюс курса: значительное внимание уделено практическому применению возможностей языка

Параметр easing

Этот параметр определяет динамику выполнения анимации — будет ли она проходить с замедлением, ускорением, равномерно или как то еще. Параметр easing задают с помощью функции. В стандартном jQuery доступны лишь две такие функции: «linear» и «swing» (для равномерной анимации и анимации с ускорением). По умолчанию, easing равняется «swing» . Другие варианты можно найти в плагинах, например, jQuery UI предоставляет более 30 новых динамик .

Существует возможность задавать разные значения easing для разных css-свойств, при выполнении одной анимации. Для этого нужно воспользоваться вторым вариантом функции animate() и задать опцию specialEasing . Например:

$(«#clickme»
)
.click
(function
()
{

$(«#book»
)
.animate
({

opacity:
«toggle»
,

height:
«toggle»

}
,
{

duration:
5000
,

specialEasing:
{

opacity:
«linear»
,

height:
«swing»

}

}
)
;

}
)
;

в этом случае изменение прозрачности будет происходить равномерно (linear), а высота будет изменяться с разгоном в начале и небольшим торможением в конце (swing).

Более сложные js анимации с кейфреймами

До сих пор мы имели дело с анимациями в один шаг, которые перемещали объект из точки А в точку Б. А как на счет
перемещения его из А в Б, а потом в В и Г?

В следующем примере мы рассмотрим как использовать кейфреймы для создания многоступенчатой js анимации.
Мы будем перемещать обычный квадрат вокруг другого, который будет служить в качестве коробки.

Для начала создадим ссылку на элемент #box. Мы будем использовать его в коллбэках begin() и complite(), чтобы
«открыть» коробку при запуске анимации и закрыть ее в конце анимации. Давайте рассмотрим как мы будем перемещать другой квадрат.

Для каждого свойства, которое мы хотим анимировать, мы используем массив объектов, где каждый объект
описывает определенный кейфрейм.

В нашем случае мы хотим переместить квадрат вертикально и горизонтально. Поэтому мы используем свойства translateY и
translateX и описываем массив кейфреймов для каждого из них

Важно правильно вычислить параметры длительности и задержки,
это может быть трудно

Кадры исполняются сверху вниз и запускаются одновременно для каждого свойства, которое имеет указанный массив кейфреймов.
Ход анимации будет полностью зависеть от того как установлены параметры delay и duration. Удачи с вычислениями!

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

SVG фичи #1 ❤ Анимированные SVG иконки | Animate SVG icons jQuery

31862

2654

87

00:09:39

29.06.2018

Начинаем работать с SVG-графикой. Я решил, что лучше сначала получить измеримый результат, поэтому мы будем использовать jQuery библиотеку lazy line painter

Вот, кстати, ссылка на библиотеку: 🤍

Подпишитесь на канал, если вам нравятся эти видео:
🤍

Получить нужные материалы для любого веб-разработчика — 🤍

Получить консультацию куратора — 🤍

Связаться с автором: 🤍 telegram: 🤍
Мой блог: 🤍

Больше контента в нашей группе Вконтакте
🤍
Присоединяйтесь к нашему сообществу Discord
🤍

Мой канал в telegram «Лысый из браузера»
🤍

Еще у нас скоро стартует курс обучения. Напиши моему ассистенту:
🤍

Я использую хостинг Link Host с 2014 года
🤍

Tuesday

Единственное, что больше всего мне нравится в Tuesday — простота. С помощью этой библиотеки вы контролируете появление и исчезновение элементов на странице.

Но эти анимации не являются сверх-топовыми или супер-гламурными. Вместо этого они упакованы в приятный тонкий посыл, который действительно улучшает эстетику страницы, не отвлекая от контента или пользовательского опыта.

Я не видел большого количества веб-сайтов, использующих Tuesday, но это, пожалуй, самая чистая библиотека.

Она работает на чистом CSS, где стили анимации чертовски разумны. Они могут сочетаться с любым сайтом, у вас есть более десятка стилей fade in/fade out для работы.

Произвольные эффекты с .animate()

Если встроенные анимации не подходят, вы можете использовать .animate() для создания произвольной анимации большинства свойств CSS. Учтите, что вы не можете анимировать свойство color, но есть плагин, который делает его возможным.

У метода .animate() есть три аргумента:

  • объект, определяющий свойства для анимации;
  • продолжительность анимации в миллисекундах;
  • функция обратного вызова, которая будет вызываться после окончания анимации.

Метод .animate() может анимировать до указанного конечного значения или увеличить существующее значение.

Обратите внимание, что если вы хотите анимировать свойство CSS, название которого включает дефис, то нужно использовать CamelCase вариант написания свойства, если вы не возьмёте его в кавычки. К примеру, свойство font-size указывается как fontSize

Анимация на CSS и JS, Анимация на сайте для начинающих

1994

184

27

00:28:03

19.02.2022

Анимация на CSS3 делается с помощью keyframes. Для начинающих это может показаться не простой задачей но я расскажу и покажу как делать анимацию не только на CSS, но и на JS. Анимация на CSS и JS для сайта очень важна. Анимация позволяет оживить сайт и сделать его более привлекательным

Анимация текста на CSS с помощью keyframes или на JS создается достаточно просто, важно понять основы анимации и тогда вы сможете создать анимацию текста или фона, а так же многое другое для вашего сайта

Другие видео про анимацию на CSS и JS на моем канале
Анимация фона на CSS Свойство animation и 🤍keyframes: 🤍
Анимация CSS стилей на jQuery: 🤍
Плавная анимация fadeOut() и fadeIn() на jQuery: 🤍
Анимация для кнопки меню или как превратить бургер в крестик: 🤍
Анимация Canvas на JavaScript, часть 1: 🤍
Анимация Canvas на JavaScript, часть 2: 🤍

Мой репозиторий с примерами анимации на JS и кнопки меню бургера на CSS+JS
🤍
Примеры кода по анимации, переходам, трансформации и фильтрам на CSS: 🤍
Супер курс по JavaScript
🤍

Поддержать автора ₽ублем:
1. Сбер: 4274 3200 3233 1582
2. YooMoney: 🤍
3. PayPal: 🤍

Телеграм: 🤍

#animation #keyframes #cssanimation #itdoctor

Шаг 5: Делаем эффекты более реалистичным за счет добавления эффекта сглаживания

(* от англ. easing – сглаживание; изменение анимации с течением времени). Если вы хотели бы сделать эффекты более реалистичными, то вам нужен был бы дополнительный контроль над интенсивностью, с которой они выполняются. Для этого и нужен эффект сглаживания. По сути при помощи сглаживания контролируется ускорение и замедление анимации с течением времени.

В качестве варианта сглаживания по умолчанию используется встроенный в jQuery «swing» (* колебание; анимация выполняется с низкой интенсивностью вначале / в конце, но с высокой – в середине). Плагин, разработанный Робертом Пеннерсом, для добавления эффекта сглаживания позволяет вам воспользоваться рядом его вариантов. Ознакомьтесь с разделом демоверсии для демонстрации эффекта сглаживания, чтобы ознакомиться с каждым из вариантов этого эффекта.

Однако имеется оговорка по поводу использования специального варианта сглаживания: вы можете им воспользоваться только тогда, когда задаете собственный анимационный эффект, то есть с методом animate. Сразу после подключения плагина для добавления эффекта сглаживания и для того, чтобы воспользоваться специальным вариантом сглаживания, вам нужно лишь передать его в качестве аргумента следующим образом:

Обязательно ознакомьтесь с разделом демоверсии для демонстрации эффекта сглаживания, чтобы увидеть каждый вариант сглаживания в действии. Хотя некоторые варианты сглаживания могут не подойти для всех ситуаций, ваши анимационные эффекты несомненно будут намного более привлекательными при удачном выборе определенных вариантов сглаживания.

Перемещения по дереву DOM

Название Описание
.children() Находит все дочерние элементы у выбранных элементов. 
При необходимости, можно указать селектор для 
фильтрации.
.closest() Находит ближайший, соответствующий заданному 
селектору элемент, из числа следующих: сам выбранный 
элемент, его родитель, его прародитель, и так далее, до 
начало дерева DOM.
.find() Находит элементы по заданному селектору, внутри 
выбранных элементов.
.next() Находит элементы, которые лежат непосредственно после 
каждого из выбранных элементов. 
.nextAll() Находит элементы, которые лежат после каждого из 
выбранных элементов.
.nextUntil() Находит элементы, которые лежат после каждого из 
выбранных, но не дальше элемента, удовлетворяющего 
заданному селектору.
.offsetParent() Возвращает ближайшего предка c позиционированием, 
отличным от static (позиционирование по умолчанию)
.parent() Находит родительские элементы у всех выбранных 
элементов
.parents() Находит всех предков у выбранных элементов, т.е. не 
только прямых родителей, но и прародителей, 
прапрародителей и так далее, до начало дерева DOM
.parentsUntil() Находит предков, как и .parents(), но прекращает поиск 
перед элементом, удовлетворяющим заданному селектору
.prev() Находит элементы, которые лежат непосредственно перед 
каждым из выбранных элементов
.prevAll() Находит элементы, которые лежат перед каждым из
выбранных элементов.
.prevUntil() Находит элементы, которые лежат перед каждым из 
выбранных, но не дальше элемента, соответствующего 
заданному селектору.
.siblings() Находит все соседние элементы (под соседними
понимаются элементы с общим родителем).

Реверсивные функции: ease*

Итак, у нас получилась коллекция функций расчёта времени. Их прямое использование называется «easeIn».

Иногда нужно показать анимацию в обратном режиме. Преобразование функции, которое даёт такой эффект, называется «easeOut».

В режиме «easeOut» функции оборачиваются функцией :

Другими словами, мы имеем функцию «преобразования» – , которая берет «обычную» функцию расчёта времени и возвращает обёртку над ней:

Например, мы можем взять функцию описанную выше:

Таким образом, отскоки будут не в начале функции, а в конце. Смотрится гораздо лучше:

Результат
style.css
index.html

Ниже мы можем увидеть, как трансформации изменяют поведение функции:

Если раньше анимационный эффект, такой как отскоки, был в начале, то после трансформации он будет показан в конце.

На графике выше красным цветом обозначена обычная функция и синим – после easeOut.

  • Обычный скачок – объект сначала медленно скачет внизу, а затем резко подпрыгивает вверх.
  • Обратный – объект вначале прыгает вверх, и затем скачет там.

Мы можем применить эффект дважды – в начале и конце анимации. Такая трансформация называется «easeInOut».

Для функции расчёта времени, анимация будет вычисляться следующим образом:

Код функции-обёртки:

В действии, :

Результат
style.css
index.html

Функция «easeInOut» объединяет два графика в один: (обычный) для первой половины анимации и (обратный) – для второй половины.

Разница хорошо заметна, если сравнивать графики , и для функции :

  • Красный обычный вариант ().
  • Зелёный – .
  • Синий – .

Как видно, график первой половины анимации представляет собой уменьшенный , а второй – уменьшенный . В результате, анимация начинается и заканчивается одинаковым эффектом.

Использование requestAnimationFrame

Теперь давайте представим, что у нас есть несколько анимаций, работающих одновременно.

Если мы запустим их независимо с помощью , тогда браузеру будет необходимо выполнять отрисовку гораздо чаще, чем раз в .

Это происходит из-за того, что каждая анимация имеет своё собственное время старта и «каждые 20 миллисекунд» для разных анимаций – разные. Интервалы не выравнены и у нас будет несколько независимых срабатываний в течение .

Другими словами:

…Меньше нагружают систему, чем три независимых функции:

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

Существует ещё одна вещь, про которую надо помнить: когда CPU перегружен или есть другие причины делать перерисовку реже (например, когда вкладка браузера скрыта), нам не следует делать её каждые .

Но как нам узнать об этом в JavaScript? Спецификация Animation timing описывает функцию , которая решает все описанные проблемы и делает даже больше.

Синтаксис:

Такой вызов планирует запуск функции на ближайшее время, когда браузер сочтёт возможным осуществить анимацию.

Если в происходит изменение элемента, тогда оно будет сгруппировано с другими и CSS-анимациями. Таким образом браузер выполнит один геометрический пересчёт и отрисовку, вместо нескольких.

Значение может быть использовано для отмены анимации:

Функция имеет один аргумент – время прошедшее с момента начала загрузки страницы в миллисекундах. Это значение может быть получено с помощью вызова performance.now().

Как правило, запускается очень скоро, если только не перегружен CPU или не разряжена батарея ноутбука, или у браузера нет какой-то ещё причины замедлиться.

Код ниже показывает время между первыми 10 запусками . Обычно оно 10-20 мс:

Magic

Забавная анимация с примесью игривости — вот, как лучше всего можно описать библиотеку Magic.

Вся эта коллекция фокусируется на анимации CSS3, при этом выдвигая пользовательские стили, которые не могут быть найдены в другом месте. Это довольно большая коллекция кодов CSS3, и вы найдете здесь много аккуратных трюков. Повороты, перспективы переворачивания, эффекты исчезновения и много чего ещё.

Если вы посмотрите на , то можете проверить некоторые из этих эффектов в действии.

Конечно, эта библиотека по-прежнему намного меньше, чем другие библиотеки CSS3, поэтому она не может конкурировать с Tuesday или Animate.css. Но здесь есть много аккуратных веб-анимации, которые вы просто не найдете в других библиотеках.

По мотивам:

Анимация с jQuery. jQuery

511

31

2

00:10:05

17.12.2020

Видео урок из курса по библиотеке jQuery. jQuery позволяет быстро реализовывать интерактив на странице с HTML версткой. В ходе этого мини курса мы создадим калькулятор для расчета стоимости авто на сайте.

️ Скоро здесь появится ссылка чтобы скачать файлы из этих уроков. ️

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Курс для начинающих: Верстка сайтов. HTML5 + CSS3
🤍

Курс JavaScript frontend разработка
🤍

Курс по разработке сайтов на PHP и MySql
🤍
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Сайт школы ВебКадеми: 🤍
Вступайте в группу Вконтакте: 🤍
Подписывайтесь на Telegram: 🤍

Js анимация зарядки аккумулятора

В этом примере мы создадим анимированную иконку зарядки батареи, похожую на ту, что в наших смартфонах. Это легко сделать,
используя небольшое количество HTML и CSS. Вот код анимации:

Мы создали 3 элемента div с классом segment, которые расширяются (width: 20) один за другим.
Для достижения эффекта зарядки нам нужно использовать разные задержки для каждого сегмента. Параметр delay у нас только
один, поэтому в этой ситуации мы будем использовать параметр на основе функции, который создает разное значение для каждой цели.

Для этого вместо одного значения мы предоставляем функцию с тремя аргументами (target, index и targetsLength).
В нашем случае функция возвращает index, умноженный на 500 миллисекунд, что заставляет каждый элемент начать
анимацию через полсекунды после предыдущего.

Также мы используем параметр endDelay для приостановке анимация перед повторным запуском.

От автора

Анимация — концепция, часто вызывающая у людей разногласия. Одни клянутся в ее полезности, другие яро уверяют в том, что ею злоупотребляют. Тем не менее, при правильном использовании за счет анимационных эффектов пользовательский интерфейс часто приукрашивается и становится более аккуратным и понятным для пользователей. В этом руководстве мы начнем с некоторых основ jQuery, затем разберемся с тем, как создать нашу первую анимацию, а потом перейдем к созданию эффекта и, наконец, разработке нечто, что можно будет использовать в реальном мире разработки.

Заинтересовало? Давайте прямо сейчас и приступим! Пожалуйста, обратите особое внимание на то, что, поскольку это руководство предназначено для аудитории начинающих веб-разработчиков, я, вероятно, буду слегка дотошно объяснять некоторые моменты. Потерпите немножко

Если вам интересно, то ознакомьтесь с первой частью демоверсии простого эффекта, который будем сегодня создавать.

Какие свойства можно анимировать с помощью Anime.js

Теперь вы знаете, как определить разные элементы, которые нужно анимировать. Пришло время узнать, какие свойства и атрибуты могут быть анимированы при использовании библиотеки.

Свойства CSS

К таким, например, относятся ширина, высота и цвет для разных целевых элементов. Финальные значения разных анимируемых свойств вроде определяются с использованием lowerCamelCase. Таким образом превращается в . Код ниже иллюстрирует анимацию положения объекта  и цвета фона () целевого объекта.

See the Pen Animating CSS Properties in Anime.js by Monty (@Shokeen) on CodePen.

Свойства могут принимать разные виды значений, которые они бы приняли при использовании обычного CSS. Например, свойство может иметь такие значения: , или . Вы также можете не указывать единицу измерения после числа, но в таком случае ею станет по умолчанию. Аналогичные действия можно выполнить с , указав цвет в виде шестнадцатеричного значения или при помощи кода RGB или HSL.

CSS-трансформирование

Преобразование по осям X и Y достигается с помощью свойств и . Аналогичным образом можно масштабировать, наклонять или вращать элемент вдоль определённой оси, используя свойства:  (масштабирование), (наклон) или (поворот), соответствующие этой конкретной оси.

Существует возможность определения разных углов или в градусах, или с помощью свойства . Значение turn, равное 1, соответствует 360 градусам. Это позволяет сделать вычисления проще, так как вы знаете, на сколько нужно повернуть элементы относительно своей оси. В примере ниже показано, как происходит анимация масштабирования, перехода или поворота как единичного свойства, так и всех сразу.

See the Pen Animating CSS Transforms in Anime.js by Monty (@Shokeen) on CodePen.

Атрибуты SVG

Единственное условие заключается в том, что значение атрибутов должно быть числовым. Способность анимировать разные атрибуты открывает возможности для создания некоторых классных эффектов. Поскольку эта статья ознакомительная, в ней будут приведены простые примеры.

По мере углубления в библиотеку вы будете узнавать, как создаются более сложные анимации. Ниже представлен код для анимации атрибутов круга , и . Как и с другими свойствами CSS, для надо использовать CamelCase, чтобы код работал корректно.

See the Pen Animating SVG Attributes in Anime.js by Monty (@Shokeen) on CodePen.

Атрибуты DOM

Можно анимировать числовые атрибуты DOM, подобно тому, как вы анимировали атрибуты SVG. Это может быть полезным для работы с элементом в HTML5. У него есть два атрибута: и . В примере ниже будет выполняться анимация атрибута , чтобы продемонстрировать прогресс перемещения файла на жёсткий диск.

See the Pen Animating DOM Attributes in Anime.js by Monty (@Shokeen) on CodePen.

Рисование в JavaScript

Существует несколько технологий создания векторной графики, которые могут
быть использованы в сценариях JavaScript. Это, например, такие технологии,
как SVG, VML, FLASH. Кроме того
HTML-тег
предоставляет API для рисования из сценариев. Именно на последней технологии и остановимся чуть более подробно.

Основная часть прикладного интерфейса определена не в
элементе , а в объекте «контекста рисования».
Получить доступ к этому объекту можно методом элемента, играющего роль «холста» для рисования.

Следующий сценарий показывает пример использования в JavaScript.

<html>
<head>  

<script>
//Создает рисунок после загрузки документа
window.onload = function() 
{ 
  //Получить элемент холста
  var canvas = document.getElementById("square");   
  var context = canvas.getContext("2d");  //Получить 2D контекст
  context.fillStyle = "#0f0";             //Цвет заливки зелёный
  context.fillRect(0, 0, 20, 20);         //Залить квадрат
  canvas = document.getElementById("circle"); //Новый элемент холста
  context = canvas.getContext("2d");          //Получить его контекст
  context.fillStyle = "#f00";                 //Цвет заливки красный
  context.beginPath();                        //Начать рисование
  //Добавить в рисунок окружность с радиусом 10 
  //и с центром в точке (15,15)
  context.arc(15, 15, 10, 0, 2*Math.PI, true);
  context.fill( );                            //Залить фигуру
}
</script>

</head>

<body>

Зелёный квадрат: <canvas id="square" width=20 height=20></canvas>
<br><br>
Красный круг: <canvas id="circle" width=30 height=30></canvas>

</body>

</html>

Структура анимации

Теперь мы можем создать более сложную функцию анимации с помощью :

Функция имеет три аргумента, которые описывают анимацию:

Продолжительность анимации. Например, .

Функция расчёта времени, как CSS-свойство , которая будет вычислять прогресс анимации (как ось у кривой Безье) в зависимости от прошедшего времени ( в начале, в конце).

Например, линейная функция значит, что анимация идёт с одной и той же скоростью:

График функции:

Это как если бы в передать значение . Ниже будут представлены более интересные примеры.

Функция отрисовки, которая получает аргументом значение прогресса анимации и отрисовывает его. Значение означает, что анимация находится в начале, и значение – в конце.

Эта та функция, которая на самом деле и рисует анимацию.

Вот как она могла бы двигать элемент:

…Или делать что-нибудь ещё. Мы можем анимировать что угодно, как захотим.

Теперь давайте используем нашу функцию, чтобы анимировать свойство от до .

Нажмите на элемент для того, чтобы посмотреть пример:

Результат
animate.js
index.html

Код:

В отличие от CSS-анимаций, можно создать любую функцию расчёта времени и любую функцию отрисовки. Функция расчёта времени не будет ограничена только кривой Безье, а функция может менять не только свойства, но и создавать новые элементы (например, для создания анимации фейерверка).

«Видеоуроки JavaScript» от AmperkaRu

Пройти курс

Длительность: 10 видеоуроков продолжительностью 2-11 минут.

Документ о прохождении обучения: не предусмотрен.

Формат обучения: видеоуроки. Пользователь сам решает, когда смотреть. Тестовые испытания не проводятся.

Программа курса: в рамках обучения отдельное внимание уделяется циклам, переменным, объектам, массивам, условным операторам, созданию библиотек и работе с ними. Обучаясь на курсе, можно:

Обучаясь на курсе, можно:

  • получить базовые знания о JavaScript, возможностях языка;
  • создавать библиотеки для Iskra JS и Espruino;
  • управлять последовательным портом на Iskra JS.

Плюсы курса: доступное изложение материала.

Заключение

Вот и все. В этом руководстве было дано объяснение того, как создать анимационные эффекты при помощи jQuery, а также приведен пример из реального мира разработки удачного применения полученных знаний. Надеюсь, что вам было интересно работать с этим руководством и оно оказалось вам полезным.  При желании можете повторно использовать этот код где угодно в ваших проектах и присоединиться к обсуждению здесь, если у вас возникнут трудности.

Есть вопросы? Хотите пожелать что-то приятное? Имеются какие-либо критические замечания? Перейдите к разделу с комментариями и оставьте мне комментарий. Удачного вам программирования!

Подпишитесь на нас на Twitter или на Nettuts+ RSS Feed, чтобы быть в курсе о лучших руководствах по веб-разработке. Готово.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: