diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md b/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md
index 2dd7a7a5..fefe340d 100644
--- a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md
+++ b/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md
@@ -33,7 +33,7 @@ ball.style.top = Math.round(field.clientHeight/2 - ball.offsetHeight/2)+'px';
Код выше стабильно работать не будет, потому что `IMG` идет без ширины/высоты:
```html
-
+
```
**Высота и ширина изображения неизвестны браузеру до тех пор, пока оно не загрузится, если размер не указан явно.**
@@ -43,7 +43,7 @@ ball.style.top = Math.round(field.clientHeight/2 - ball.offsetHeight/2)+'px';
Чтобы это исправить, добавим `width/height` к картинке:
```html
-
+
```
Теперь браузер всегда знает ширину и высоту, так что все работает. Тот же эффект дало бы указание размеров в CSS.
diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html b/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html
index 534da2d6..153be17e 100755
--- a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html
+++ b/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html
@@ -18,7 +18,7 @@
diff --git a/2-ui/3-event-details/5-fixevent/article.md b/2-ui/3-event-details/12-fixevent/article.md
similarity index 100%
rename from 2-ui/3-event-details/5-fixevent/article.md
rename to 2-ui/3-event-details/12-fixevent/article.md
diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.md b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.md
index 8f27252c..ecea5df5 100644
--- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.md
+++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.md
@@ -4,16 +4,15 @@
В браузере нет способа "просто получить" текущие координаты. Это может сделать обработчик события, в данном случае `mousemove`. Поэтому нужно будет поставить обработчик на `mousemove` и при каждом движении запоминать текущие координаты, чтобы `setInterval` мог раз в 100мс сравнивать их.
-Можно обойтись и без `setInterval` -- сравнивать координаты при каждом срабатывании `mousemove`. Если передвинулись на маленькое расстояние с последнего `mousemove` -- это "наведение на элемент", а на большое -- игнорируем. Вариант с `setInterval` теоретически надёжнее, но на практике и один `mousemove` работает.
+Можно обойтись и без `setInterval` -- сравнивать координаты при каждом срабатывании `mousemove`. Если передвинулись на маленькое расстояние с последнего `mousemove` -- это "наведение на элемент", а на большое -- игнорируем. Вариант с `setInterval` лучше с точки зрения производительности -- `mousemove` происходит уж очень часто, но если проверка несложная, то и `mousemove` подойдёт.
-Чтобы наш код не срабатывал чересчур часто, мы будем начинать анализ координат при заходе на элемент, а заканчивать -- при выходе с него.
-
-Если выход осуществлён, и при этом на элементе зафиксировано "состояние наведения", то нужно вызвать соответствующий обработчик `options.out`.
+Имеет смысл начинать анализ координат и отслеживание `mousemove` при заходе на элемент, а заканчивать -- при выходе с него.
Чтобы точно отловить момент входа и выхода, без учёта подэлементов (во избежание мигания), можно использовать `mouseenter/mouseleave`.
В решении, предложенном ниже, однако, используется `mouseover/mouseout`, так как это позволит легко "прикрутить" к такому объекту делегирование, если потребуется. А, чтобы не было лишних срабатываний, лишние переходы отфильтровываются.
+При этом при обнаружении "наведения на элемент" это запоминается в переменной `isHover` и вызывается `options.over`, а затем, при выходе с элемента, если было "наведение", вызывается `options.out`.
diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md
index 66de2788..db49fb3d 100644
--- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md
+++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md
@@ -42,7 +42,7 @@ new HoverIntent({
});
```
-Демо:
+Демо этого кода:
[iframe src="solution" height=110]
diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md
index ff73c43f..3dce9eb5 100644
--- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md
+++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md
@@ -20,16 +20,14 @@
Для `mouseout` всё наоборот:
+
`event.target` -- элемент, с которого ушла мышь, то есть на котором возникло событие.
`event.relatedTarget` -- элемент, на который перешла мышь.
-[online]
-В примере ниже вы можете наглядно посмотреть события `mouseover/out`, возникающие на всех элементах.
-
+В примере ниже, если у вас есть мышь, вы можете наглядно посмотреть события `mouseover/out`, возникающие на всех элементах.
[codetabs src="mouseoverout" height=220]
-[/online]
[warn header="`relatedTarget` может быть `null`"]
Свойство `relatedTarget` может быть равно `null`.
diff --git a/2-ui/3-event-details/4-drag-and-drop/1-slider/solution.md b/2-ui/3-event-details/4-drag-and-drop/1-slider/solution.md
new file mode 100644
index 00000000..cdaf826c
--- /dev/null
+++ b/2-ui/3-event-details/4-drag-and-drop/1-slider/solution.md
@@ -0,0 +1,6 @@
+
+Как можно видеть из HTML/CSS, слайдер -- это `DIV`, подкрашенный фоном/градиентом, внутри которого находится другой `DIV`, оформленный как бегунок, с `position:relative`.
+
+Бегунок немного поднят, и вылезает по высоте из родителя.
+
+На этой основе мы реализуем горизонтальный Drag'n'Drop, ограниченный по ширине. Его особенность -- в `position:relative` у переносимого элемента, т.е. координата ставится не абсолютная, а относительно родителя.
diff --git a/2-ui/3-event-details/6-drag-and-drop/1-slider/solution.view/index.html b/2-ui/3-event-details/4-drag-and-drop/1-slider/solution.view/index.html
old mode 100755
new mode 100644
similarity index 61%
rename from 2-ui/3-event-details/6-drag-and-drop/1-slider/solution.view/index.html
rename to 2-ui/3-event-details/4-drag-and-drop/1-slider/solution.view/index.html
index a8e293f1..e3f71cf8
--- a/2-ui/3-event-details/6-drag-and-drop/1-slider/solution.view/index.html
+++ b/2-ui/3-event-details/4-drag-and-drop/1-slider/solution.view/index.html
@@ -2,29 +2,7 @@
-
-
+
@@ -37,9 +15,7 @@
var sliderElem = document.getElementById('slider');
var thumbElem = sliderElem.children[0];
-thumbElem.ondragstart = function() { return false; };
thumbElem.onmousedown = function(e) {
- e = fixEvent(e);
var thumbCoords = getCoords(thumbElem);
var shiftX = e.pageX - thumbCoords.left;
// shiftY здесь не нужен, слайдер двигается только по горизонтали
@@ -47,8 +23,6 @@ thumbElem.onmousedown = function(e) {
var sliderCoords = getCoords(sliderElem);
document.onmousemove = function(e) {
- e = fixEvent(e);
-
// вычесть координату родителя, т.к. position: relative
var newLeft = e.pageX - shiftX - sliderCoords.left;
@@ -71,9 +45,21 @@ thumbElem.onmousedown = function(e) {
return false; // disable selection start (cursor change)
};
+thumbElem.ondragstart = function() {
+ return false;
+};
+
+function getCoords(elem) { // кроме IE8-
+ var box = elem.getBoundingClientRect();
+
+ return {
+ top: box.top + pageYOffset,
+ left: box.left + pageXOffset
+ };
+
+}
-
-
+