Производительность css и javascript анимации

CSS 3D Трансформации. Пример с 3D кубом

62157

3750

123

00:10:30

05.03.2016

Исходники + Demo: 🤍

Список свойств:
perspective — создает 3D пространство для элементов
transform-origin — определяет относительно какой точки элемент будет трансформироваться
transform-style — сохраняет 3D пространство для дочерних элементов
backface-visibility — отвечает за отображение обратной стороны элемента

Список методов свойства transform:
perspective — создает 3D пространство для одного элемента
translateZ — двигает элемент по оси Z
translate3d — сдвигает элемент по всем осям
scaleZ — масштабирует ось Z
scale3d — масштабирует элемент по всем осям
rotateX — вращает элемент по оси X
rotateY — вращает элемент по оси Y
rotateZ — вращает элемент по оси Z

Facebook: 🤍

CSS фичи #17 анимированная неоновая кнопка | CSS3 Button Style Neon Style

26469

1883

89

00:15:48

04.09.2019

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

Интенсив по Ruby on Rails 🤍
Канал «Хороший программист» с бесплатными уроками по Ruby 🤍

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

Больше контента в нашей группе Вконтакте
🤍
Присоединяйтесь к нашему сообществу Discord
🤍
Telegram-канал «Лысый из браузера»:
🤍

Чтобы записаться на мой курс по основам веб-разработки, напиши в нашу группу и мой ассистент скажет тебе, что делать дальше: 🤍

Заказать рекламу на канале: 🤍 или 🤍

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

Анимирование одиночного элемента или компонента

Компонент-обёртка transition, позволяет анимировать появление и исчезновение элемента или компонента в следующих случаях:

  • условный рендеринг (используя v-if)
  • условное отображение (используя v-show)
  • динамические компоненты
  • корневые элементы компонентов

Когда элемент, завёрнутый в компонент transition, вставляется или удаляется, происходят действия:

  1. Vue автоматически узнаёт, применены ли к элементу CSS-переходы или анимации. Если да, CSS-классы будут обновлены в нужные моменты времени.
  2. Когда для компонента указаны хуки JavaScript, они будут вызваны в соответствующие моменты времени.
  3. Если не обнаружено ни CSS-переходов и анимаций, ни JavaScript-хуков, операции DOM для вставки или удаления элемента будут выполнены в следующем анимационном фрейме 

Классы переходов
Есть 6 классов, применяющихся в анимациях появления и исчезновения элементов:

  • v-enter — начало анимации появления элемента. Класс добавляется перед вставкой элемента, а удаляется в следующем фрейме после вставки.
  • v-enter-active — анимация появления элемента активна. Класс остаётся в течение всей анимации, добавляется перед вставкой элемента, удаляется когда переход или анимация прекратились. 
  • v-enter-to — анимация появления элемента завершается. Класс добавляется в следующем фрейме после вставки элемента, удаляется после завершения перехода или анимации.
  • v-leave — начало анимации исчезновения элемента. Класс добавляется как только началась анимация исчезновения, а удаляется в следующем фрейме после этого.
  • v-leave-active — анимация исчезновения элемента активна. Класс остаётся в течение всей анимации, добавляется как только начинается анимация исчезновения, а удаляется когда переход или анимация прекратились
  • v-leave-to — анимация исчезновения элемента завершается. Класс добавляется в следующем фрейме после начала анимации исчезновения, удаляется после завершения перехода или анимации.

Для каждого класса указывается префикс, соответствующий имени перехода. Префикс v- применяется по умолчанию, если элемент <transition> используется без указания параметра name . Например, для <transition name=»my-transition»> вместо класса v-enter будет применяться my-transition-enter.
v-enter-active и v-leave-active позволяет указывать различные анимационные эффекты для переходов появления и исчезновения элемента. 

Controlling the reverse animation

In all the examples above you may have noticed some strange effects
when the animation is reversed — particularly when the mouse moves away
from the trigger area before the animation has completed.

The box in the animation below will rise up slowly and then shoot off
to the right useing an extreme cubic-bezier timing function, making it
start off quickly and then slow down at the end.

When you move your mouse away it will not track back over the same
path, as the vertical animation will come first, and the box will move
quickly from right to left before slowing down.

#box

The CSS for this is as follows:

We can, however, control the animation in both directions. In this
case causing the animation to perform everything in reverse:

#box

The trick is to move to original transition settings to the
:hover statement and for the ‘non-hover’ to use a transition
that reverses them:

This can be useful for button and menu effects to make an element on
the page appear quickly and then fade out slowly, or vice versa.

Remember that the transitions set in the :hover statement
are the ones that will be used as the hover state is applied. The
‘default’ transition settings will be used when returning to the default
state.

Запуск CSS-transition при скролле

Если для анимации используется только один шаг и не требуется применение , например, достаточно изменения прозрачности HTML-элемента от 0 до 1, можно использовать CSS-transition вместо CSS-animation.

Метод по сути тот же. Вместо определения ключевых кадров () для CSS-класса анимации указаны свойства для .

Заставим HTML-элемент появляться, когда он перемещается в видимую область просмотра. Для этого в момент появления в окне при скролле ему надо добавить CSS-класс . Так пользователь, у которого заблокирован или не загружается JavaScript, должен всё-равно увидеть HTML-элемент в его окончательном состоянии.

Это особенно важно, поскольку анимация начинается с. Если бы не было настройки CSS-класса и JavaScript не работал, пользователь вообще не увидел бы HTML-элемент! Но если эффект перехода заключается в том, чтобы что-то исчезло, наверное, это не понадобится делать

При первом запуске JavaScript нужно удалить CSS-класс, чтобы затем, его можно было добавить обратно, когда действительно нужно запустить . Это должно быть сделано вне метода обработки наблюдения за скроллом, желательно в начале JavaScript. Вот полный код:

В этом примере CSS-transition запускается, когда элемент-оболочка при скролле появляется в окне. Если Javascript не запустился, элемент всё-равно будет виден.

See this code Use IntersectionObserver API for css-transition on x.xhtml.ru.

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

Фиксирующаяся при скролле панель навигации, только CSS.Sticky sidebar (VanillaJS).CSS: современный способ оформления скроллбаров.

Оптимизация производительности анимации

Если вы делаете HTML 5 приложение на Android, можно попробовать сделать следующее:

В параметры вашего активити допишите android:hardwareAccelerated=»true»

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

Так же не используйте событие onclick (хоть оно и работает на тачскрине). Дело в том что это событие делает задержку примерно в треть секунды и чтобы этого не было лучше используйте ontouchstart и ontouchend.

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

Анимация градиента на чистом CSS!

25136

1187

37

00:04:27

15.03.2019

В этом видео вы узнаете как сделать анимацию градиента на CSS. Будем использовать анимацию CSS — keyframes для оживления нашего градиента на фоне страницы.

Основы HTML и CSS для начинающих: 🤍
Верстка сайта транспортной компании: 🤍
Файлы урока: 🤍

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

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

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

#верстка #html #css #css3

Создание анимации на JavaScript / Библиотека Anime.js!

70534

2460

94

00:14:17

06.11.2017

Канала «Уголок веб-дизайнера»: 🤍

Анимация это отличное дополнение к любому веб-сайту. В этом уроке мы изучим с вами специальную библиотеку, которая позволяет создавать анимации на JavaScript — Anime.JS.

1) Библиотека Anime.js: 🤍
2) Документация: 🤍
3) Код из видео урока на itProger: 🤍

Основной сайт: 🤍
Конструктор сайтов: 🤍


Группа Вк — 🤍
Группа FaceBook — 🤍

Instagram: 🤍
Telegram: 🤍
Страничка Twitter — 🤍
Страничка Вк — 🤍

Начните зарабатывать на YouTube — 🤍
Видео по заработку на YouTube — 🤍

Помощь в развитии канала.
* Яндекс Деньги: 410014343706921

* Кошельки WebMoney:
— Доллар: Z331064341236
— Гривна: U386388718252
— Рубль: R214610220703

Animations in action

Now here’s another example of the kind of fun we can have in
combining different effects into single animation. Perhaps you can
already work out what’s going to happen based on the CSS?

and the HTML:

Put them together and this is the what you get:

.rocket
#outerspace

If you’re using Safari 3 you may notice some problems with the
animation, particularly when it reverses after you move the mouse away,
but in the latest version of WebKit it’s already much smoother. Also
the animation in Opera is a bit erratic, with not all the elements being
animated.

The dotted outline that appears during the animation shows the
placement of the DIV containing the rocket image. This DIV translates
across the screen while the image inside is rotated. Simple!

For the browser-impaired what’s happening is that when you move the
mouse over the space background, the rocket translates from the bottom
left to the top right over a period of 3 seconds (translate())
and also rotates 70 degrees in a clockwise direction over the first 2
seconds (rotate()). The effect is rudimentary, but shows the
potentional.

To have more control over the animation paths and timing, you can set
up WebKit Keyframes. They also allow
the animations to run automatically, and continuously, rather than just
in response to mouse events.

Дополнительные значения CSS-свойства animation

Кроме использованных для данных примеров значений у CSS-свойства animation есть и другие, которые могут вам пригодиться.

  • animation-name – позволяет задать имя анимации

    PHP

    animation-name: scale;

    1 animation-namescale;
  • animation-duration – определяет время анимации. Может задаваться в секундах и миллисекундах.

    PHP

    animation-duration: 3s;

    1 animation-duration3s;
  • animation-delay – позволяет задать задержку для анимации, например чтобы она начиналась или повторялась не сразу после загрузки страницы, а с небольшой паузой.

    PHP

    animation-delay: 3s;

    1 animation-delay3s;
  • animation-iteration-count – задаёт количество повторений анимации. Может задаваться числом или значением infinite для бесконечного количества повторов.

    PHP

    animation-iteration-count: 2;

    1 animation-iteration-count2;
  • animation-play-state – позволяет останавливать или запускать анимацию. Можно использовать для остановки анимации при наведении на элемент или в JavaScript для создания сложных анимации. Имеет основные значения paused для остановки анимации и running для возобновления.

    PHP

    .animate-block:hover {
    animation-play-state: paused;
    }

    1
    2
    3

    .animate-blockhover{

    animation-play-statepaused;

    }

  • animation-fill-mode – позволяет управлять порядком применения определённых CSS-свойств к объекту. Имеет следующие значения:
    • forwards – анимация доходит до конечного состояния и не возвращается к предыдущему состоянию
    • backwards — после загрузки страницы состояние элемента возвращается к первому кадру
    • both – объединяет предыдущие 2 свойства
    • none – состояния элемента не меняется до и после анимации
    • inherit – наследует значение родительского блока

    PHP

    animation-fill-mode: both;

    1 animation-fill-modeboth;
  • animation-timing-function – позволяет задавать значение скорости анимации в начале и в конце.Имеет такие значения:
    • ease — начинается медленно, потом разгоняется и опять замедляется
    • ease-in – начинается медленно, а потом ускоряется
    • ease-out – начинается быстро, а потом замедляется
    • ease-in-out – медленно начинается и заканчивается
    • linear – происходи равномерно
    • step-start – разбивает анимацию на шаги
    • step-end – изменения происходят в конце каждого шага
    • steps(количество шагов,start|end) – ступенчатая анимация
    • cubic-bezier(x1, y1, x2, y2) – анимация по кривой Безье. Вместо переменных в скобках задаются значения от 0 до 1.

Так же можно задавать сразу несколько значений для CSS-свойства animation:

PHP

animation: example 5s ease both;

1 animationexample5sease both;

CSS-анимация поворота и скругления углов

Для реализации такой анимации мы воспользуемся свойством border-radius (//impuls-web.ru/skruglenie-uglov-css/), а так же свойством transform со значением rotate для поворота элемента.
Временной интервал в данном случае будет немного больше чем в предыдущих примерах.

PHP

.animate-block5 {
animation: radius 10s infinite;
}
@keyframes radius {
0%{
border-radius:0px; /*Радиус скругления углов*/
transform: rotate(0deg); /*Поворот*/
}
50%{
border-radius:100%;
transform: rotate(360deg);
}
100%{
border-radius:0px;
transform: rotate(0deg);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

.animate-block5{

animationradius10sinfinite;

}
 

@keyframesradius{

%{

border-radius0px;/*Радиус скругления углов*/

transformrotate(0deg);/*Поворот*/

}

50%{

border-radius100%;

transformrotate(360deg);

}

100%{

border-radius0px;

transformrotate(0deg);

}

}

Множественные трансформации на одном элементе

Для применения множественных трансформаций к одному и тому же элементу просто перечислите настройки через пробел. К примеру:

<style type="text/css">

    #submenu {
        background-color: #eee;
        -webkit-transition: all 1s ease-in-out;
        -moz-transition: all 1s ease-in-out;
        -o-transition: all 1s ease-in-out;
        -ms-transition: all 1s ease-in-out;
        transition: all 1s ease-in-out;
    }
    #submenu:hover {
        background-color: #fc3;
        -webkit-transform: rotate(360deg) scale(2);
        -moz-transform: rotate(360deg) scale(2);
        -o-transform: rotate(360deg) scale(2);
        -ms-transform: rotate(360deg) scale(2);
        transform: rotate(360deg) scale(2);
    }

</style>

Данные настройки при наводке мыши за 1 секунду изменят цвет под-меню, повернут его, увеличат в размере.

box 1
box 2

Добавление CSS-класса, когда элемент появляется при скролле (прокрутке страницы вверх-вниз)

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

Вот три способа определить, когда элемент находится в видимой области окна:

  1. Использовать Intersection Observer API
  2. Измерять смещение элемента при скролле страницы
  3. Использовать стороннюю JavaScript-библиотеку, которая реализует №1 или №2

Для базовой анимации с запуском при скролле, оптимально использование Intersection Observer API, потому что он требует меньше кода, удобнее и лучше с точки зрения производительности.

API-интерфейс Intersection Observer позволяет отслеживать момент пересечения одного элемента с другим, и сообщает, когда это происходит. Этот способ идеально подходит для запуска CSS-анимации при скролле страницы. Всё, что нужно знать — когда HTML-элемент пересекается с окном просмотра. Если он пересекается, значит — находится в видимой области окна и в этот момент надо запустить CSS-анимацию.

Intersection Observer API можно рассматривать, как обычный слушатель событий, но с некоторыми дополнительными опциями. Вместо того, чтобы прикреплять прослушивание событий к HTML-элементу, надо заставить наблюдателя отслеживать элемент и его положение на странице.

Начнём с создания наблюдателя и заставим его отслеживать HTML-элемент:

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

Когда функция обратного вызова (callback) запускается, она возвращает массив записей из целевых (target) элементов, которые были запрошены, а также некоторую дополнительную информацию о них. В функцию всегда будет возвращаться массив, даже если наблюдение ведётся только за одним элементом, как здесь.

В функции обратного вызова можно перебрать массив записей, чтобы указать, что с ними нужно сделать. Каждая запись имеет свойство , которое может быть или . Если оно возвращает , это означает, что элемент находится в видимой области окна (viewport).

Собираем всё вместе

Обратите внимание, что — это объект, предоставленный наблюдателем, а — это фактический элемент, за которым который ведется наблюдение, поэтому именно ему нужно добавить CSS-класс для запуска анимации

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

See this code Use IntersectionObserver API for add class name on x.xhtml.ru.

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

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

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

Чтобы элемент-оболочку было видно, для примера, ему добавлена пунктирная рамка. Попробуйте прокрутить вверх и вниз документ в окне ниже:

See this code Use IntersectionObserver API for add-remove class name on x.xhtml.ru.

Теперь — порядок! Добавляя и удаляя CSS-класс каждый раз, когда при скролле страницы HTML-элемент входит в область просмотра, запускается CSS-анимация.

Воздействие на элемент вне времени анимации

  • Результат
  • css

none

forwards

backwards

both

С помощью свойства animation-fill-mode можно определить будет ли анимация воздействовать на элемент вне времени воспроизведения анимации (до начала или после окончания).

Значения:

  • none — анимация воздействует на элемент только во время воспроизведения, по окончании элемент возвращается в исходное состояние.
  • forwards — анимация воздействует на элемент по окончании воспроизведения.
  • backwards — анимация воздействует на элемент до начала воспроизведения.
  • both — анимация воздействует на элемент и до начала, и после окончания воспроизведения.

Использование различных видов анимации

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

При событии :hover, синий квадрат, повернётся, поменяет цвет на красный, и передвинется из верхнего левого угла в правый нижний.

#stage
#block

Первое, что вы наверное должны были заметить, так это особенность передвижения квадрата. Теперь оно не резкое, а более “изогнутое”. Всё благодаря функциям ease-out и ease-in.

Также обратите внимание, что изменение цвета происходит до поворота. Фишка в том, что вы можете разбить -webkit-transition на несколько записей:

Фишка в том, что вы можете разбить -webkit-transition на несколько записей:

#block {
  ...
  background: blue;
  ...
  -webkit-transition-property: left, top, background, -webkit-transform;
  -webkit-transition-duration: 2s, 2s, 1s, 1s;
  -webkit-transition-timing-function: ease-out, ease-in, linear, ease-in-out;
  -webkit-transition-delay: 0, 0, 0, 1s;
  ...
}
#stage:hover #block {
  left: 100px;
  top: 100px;
  background: red;
  -webkit-transform: rotate(360deg);
}

Что можно анимировать в CSS?

Пока мы только обсудили синтаксис свойства transition. Теперь давайте поговорим о свойствах, какие из них мы можем анимировать, а какие нет. Потому что есть некоторые вещи, которые просто не имеет смысла анимировать, а некоторые свойства анимировать просто невозможно.

Анимируемые свойства

Взять, к примеру, такие свойства, как:

  1. font-size;
  2. background-color;
  3. width;
  4. left (на какое расстояние от левой стороны элемент может быть перемещен …

Очевидно, анимировать эти свойства имеет смысл. Если вы измените их значения, это изменит элемент визуально. Если вы измените размер шрифта, скажем, с 14 до 28 пикселей, вы увидите, что шрифт плавно увеличился, произошла анимация, которая длилась какое-то время. Анимация всегда имеет смысл, если значение свойств это четкие (чаще всего числовые) значения. Если вы увеличите размер шрифта до 100 пикселей, то вы явно увидите, как буквы растут. Плавное изменение цвета фона также можно пронаблюдать . Эти свойства являются анимируемыми.

Вообще запомните, если вы представить, что это анимируется – значит это можно анимировать. Чаще всего это работает.

Не анимируемые свойства

А вот список свойств, которые нельзя анимировать (пример):

  1. display;
  2. font-family;
  3. position…

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

Возьмем display. Можете ли вы представить, как визуально будет происходить изменение между «display: block;» и «display: inline-block;»? Как может плавно измениться внешний вид элемента между «position: relative;» и «position: absolute;»? Нет, конечно же, элемент будет выглядеть иначе при изменении этих свойств. Но как вы можете представить себе переход? Вы не можете этого сделать. Верно? Вы не можете представить себе превращение шрифта Helvetica в шрифт Georgia, каждой буквы, это просто не сработает. Вы можете изменить эти шрифты, но они резко изменятся, никакой анимации не произойдет.

Производительность анимации в CSS

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

В общем вот вещи, которые наиболее хорошо подходят для анимации:

  1. Позиционирование на странице
  2. Масштабирование
  3. Вращение
  4. Прозрачность

Причем, первые три пункта этого списка, это все параметры свойства transform (translate, scale, rotate). Позиционирование происходит по осям X и Y.

А это именно то, что нас интересует, когда мы говорим о производительности анимации. В общем, самые подходящие свойства для анимации это transform и opacity. При анимировании чего либо другого, fps анимации может упасть гораздо ниже 60fps.

Давайте резюмируем этот пункт следующим. Старайтесь избегать перерисовки элементов на веб странице и анимации элементов, которые браузеру сложно отрендерить (например, тени).

Animating your Transforms

While CSS Transformation in itself is a powerful tool for developers
(though I shudder to think what will happen as it becomes more widely
used), the ability to animate the same effects using
-webkit-transition is far more exciting. Move your mouse over
the following four boxes for a demonstration:

box 1
box 2
box 3
box 4

What you see above is the four boxes from the previous section, in
their default states. When you mouseover any of the boxes, however, the
CSS transformation is applied as a one second animation. When the mouse
moves away the animation is reversed, taking each box back to its
original state.

And we can do this without using JavaScript — only HTML and CSS!
Here is the complete code for ‘box 1’ which slides to the right and
back:

If you think that’s cool, realise that CSS Animation can be applied
not just to the transforms, but also to other CSS properties including:
opacity, colour and a bunch of others.

In the next example the box on the left begins as small and green
with square corners, while the one on the right is larger, with a red
border and rounded corners. Hovering over either of the boxes will
trigger an animation that makes box 1 take on the appearance of box 2
and vice versa.

box 1
box 2

Again, we’re still only using HTML and CSS to make this happen.
Without CSS Transforms the two boxes will still change their
border-color, and possibly also the border-radius, but it happens immediately
rather than as a one second animation.

For more advanced examples you can read our new article on using JavaScript to trigger the
animation. And for an alternative to CSS transitions, and finer
control over the animation paths and timing, you can use Window.requestAnimationFrame.

Multiple Transforms on one element

To apply more than one transformation to a single element simply list
them one after another separated by spaces. The submenu for example at
the top right of this page has the following styles:

Note that IE10 now uses no prefix for transitions, but
-ms- is still required for transforms.

This means that when you hover over the submenu, it will change
colour, rotate and double in size over a period of one second as shown
here:

<=>

These effects are now available in the latest public release of
Safari, so in principle all OSX users will be able to see these effects.
Whether it’s a good idea to add them to your website I’ll leave up to
you.

Thanks to misterbisson those without WebKit can now see a screencast of the menu animation:

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

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

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

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