Skip to content

Commit 5fb0e36

Browse files
committed
renovations
1 parent fbc6303 commit 5fb0e36

File tree

79 files changed

+683
-763
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+683
-763
lines changed

2-ui/1-document/15-metrics/4-put-ball-in-center/ball-half/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
<div id="field">
21-
<img src="//js.cx/clipart/ball.gif" id="ball">
21+
<img src="//js.cx/clipart/ball.svg" id="ball">
2222
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2323
</div>
2424

2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ ball.style.top = Math.round(field.clientHeight/2 - ball.offsetHeight/2)+'px';
3333
Код выше стабильно работать не будет, потому что `IMG` идет без ширины/высоты:
3434

3535
```html
36-
<img src="ball.gif" id="ball">
36+
<img src="ball.svg" id="ball">
3737
```
3838

3939
**Высота и ширина изображения неизвестны браузеру до тех пор, пока оно не загрузится, если размер не указан явно.**
@@ -43,7 +43,7 @@ ball.style.top = Math.round(field.clientHeight/2 - ball.offsetHeight/2)+'px';
4343
Чтобы это исправить, добавим `width/height` к картинке:
4444

4545
```html
46-
<img src="ball.gif" *!*width="40" height="40"*/!* id="ball">
46+
<img src="ball.svg" *!*width="40" height="40"*/!* id="ball">
4747
```
4848

4949
Теперь браузер всегда знает ширину и высоту, так что все работает. Тот же эффект дало бы указание размеров в CSS.

2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
<div id="field">
21-
<img src="//js.cx/clipart/ball.gif" width="40" height="40" id="ball">
21+
<img src="//js.cx/clipart/ball.svg" width="40" height="40" id="ball">
2222
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2323
</div>
2424

2-ui/1-document/15-metrics/4-put-ball-in-center/source.view/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
<div id="field">
21-
<img src="//js.cx/clipart/ball.gif" id="ball">
21+
<img src="//js.cx/clipart/ball.svg" id="ball">
2222
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2323
</div>
2424

2-ui/2-events-and-interfaces/3-obtaining-event-object/1-move-ball-field/solution.view/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636

3737
<div id="field">
38-
<img src="//js.cx/clipart/ball.gif" id="ball">
38+
<img src="//js.cx/clipart/ball.svg" id="ball">
3939
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4040
</div>
4141

2-ui/2-events-and-interfaces/3-obtaining-event-object/1-move-ball-field/source.view/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929

3030
<div id="field">
31-
<img src="//js.cx/clipart/ball.gif" id="ball">
31+
<img src="//js.cx/clipart/ball.svg" id="ball">
3232
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3333
</div>
3434

2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@
44

55
В браузере нет способа "просто получить" текущие координаты. Это может сделать обработчик события, в данном случае `mousemove`. Поэтому нужно будет поставить обработчик на `mousemove` и при каждом движении запоминать текущие координаты, чтобы `setInterval` мог раз в 100мс сравнивать их.
66

7-
Можно обойтись и без `setInterval` -- сравнивать координаты при каждом срабатывании `mousemove`. Если передвинулись на маленькое расстояние с последнего `mousemove` -- это "наведение на элемент", а на большое -- игнорируем. Вариант с `setInterval` теоретически надёжнее, но на практике и один `mousemove` работает.
7+
Можно обойтись и без `setInterval` -- сравнивать координаты при каждом срабатывании `mousemove`. Если передвинулись на маленькое расстояние с последнего `mousemove` -- это "наведение на элемент", а на большое -- игнорируем. Вариант с `setInterval` лучше с точки зрения производительности -- `mousemove` происходит уж очень часто, но если проверка несложная, то и `mousemove` подойдёт.
88

9-
Чтобы наш код не срабатывал чересчур часто, мы будем начинать анализ координат при заходе на элемент, а заканчивать -- при выходе с него.
10-
11-
Если выход осуществлён, и при этом на элементе зафиксировано "состояние наведения", то нужно вызвать соответствующий обработчик `options.out`.
9+
Имеет смысл начинать анализ координат и отслеживание `mousemove` при заходе на элемент, а заканчивать -- при выходе с него.
1210

1311
Чтобы точно отловить момент входа и выхода, без учёта подэлементов (во избежание мигания), можно использовать `mouseenter/mouseleave`.
1412

1513
В решении, предложенном ниже, однако, используется `mouseover/mouseout`, так как это позволит легко "прикрутить" к такому объекту делегирование, если потребуется. А, чтобы не было лишних срабатываний, лишние переходы отфильтровываются.
1614

15+
При этом при обнаружении "наведения на элемент" это запоминается в переменной `isHover` и вызывается `options.over`, а затем, при выходе с элемента, если было "наведение", вызывается `options.out`.
1716

1817

1918

2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ new HoverIntent({
4242
});
4343
```
4444

45-
Демо:
45+
Демо этого кода:
4646

4747
[iframe src="solution" height=110]
4848

2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,14 @@
2020

2121
Для `mouseout` всё наоборот:
2222

23+
2324
<ul>
2425
<li>`event.target` -- элемент, с которого ушла мышь, то есть на котором возникло событие.</li>
2526
<li>`event.relatedTarget` -- элемент, на который перешла мышь.</li>
2627
</ul>
2728

28-
[online]
29-
В примере ниже вы можете наглядно посмотреть события `mouseover/out`, возникающие на всех элементах.
30-
29+
В примере ниже, если у вас есть мышь, вы можете наглядно посмотреть события `mouseover/out`, возникающие на всех элементах.
3130
[codetabs src="mouseoverout" height=220]
32-
[/online]
3331

3432
[warn header="`relatedTarget` может быть `null`"]
3533
Свойство `relatedTarget` может быть равно `null`.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
Как можно видеть из HTML/CSS, слайдер -- это `DIV`, подкрашенный фоном/градиентом, внутри которого находится другой `DIV`, оформленный как бегунок, с `position:relative`.
3+
4+
Бегунок немного поднят, и вылезает по высоте из родителя.
5+
6+
На этой основе мы реализуем горизонтальный Drag'n'Drop, ограниченный по ширине. Его особенность -- в `position:relative` у переносимого элемента, т.е. координата ставится не абсолютная, а относительно родителя.

2-ui/3-event-details/6-drag-and-drop/1-slider/solution.view/index.html renamed to 2-ui/3-event-details/4-drag-and-drop/1-slider/solution.view/index.html

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,7 @@
22
<html>
33
<head>
44
<meta charset="utf-8">
5-
<script src="lib.js"></script>
6-
<style>
7-
.slider {
8-
border-radius: 5px;
9-
background: #E0E0E0;
10-
background: -moz-linear-gradient(left top , #E0E0E0, #EEEEEE) repeat scroll 0 0 transparent;
11-
background: -webkit-gradient(linear, left top, right bottom, from(#E0E0E0), to(#EEEEEE));
12-
background: linear-gradient(left top, #E0E0E0, #EEEEEE);
13-
width: 310px;
14-
height: 15px;
15-
margin: 5px;
16-
}
17-
.thumb {
18-
width: 10px;
19-
height: 25px;
20-
border-radius: 3px;
21-
position: relative;
22-
left: 10px;
23-
top: -5px;
24-
background: blue;
25-
cursor: pointer;
26-
}
27-
</style>
5+
<link rel="stylesheet" href="style.css">
286
</head>
297
<body>
308

@@ -37,18 +15,14 @@
3715
var sliderElem = document.getElementById('slider');
3816
var thumbElem = sliderElem.children[0];
3917

40-
thumbElem.ondragstart = function() { return false; };
4118
thumbElem.onmousedown = function(e) {
42-
e = fixEvent(e);
4319
var thumbCoords = getCoords(thumbElem);
4420
var shiftX = e.pageX - thumbCoords.left;
4521
// shiftY здесь не нужен, слайдер двигается только по горизонтали
4622

4723
var sliderCoords = getCoords(sliderElem);
4824

4925
document.onmousemove = function(e) {
50-
e = fixEvent(e);
51-
5226
// вычесть координату родителя, т.к. position: relative
5327
var newLeft = e.pageX - shiftX - sliderCoords.left;
5428

@@ -71,9 +45,21 @@
7145
return false; // disable selection start (cursor change)
7246
};
7347

48+
thumbElem.ondragstart = function() {
49+
return false;
50+
};
51+
52+
function getCoords(elem) { // кроме IE8-
53+
var box = elem.getBoundingClientRect();
54+
55+
return {
56+
top: box.top + pageYOffset,
57+
left: box.left + pageXOffset
58+
};
59+
60+
}
7461

7562
</script>
7663

7764
</body>
78-
</html>
79-
65+
</html>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
.slider {
3+
border-radius: 5px;
4+
background: #E0E0E0;
5+
background: -moz-linear-gradient(left top , #E0E0E0, #EEEEEE) repeat scroll 0 0 transparent;
6+
background: -webkit-gradient(linear, left top, right bottom, from(#E0E0E0), to(#EEEEEE));
7+
background: linear-gradient(left top, #E0E0E0, #EEEEEE);
8+
width: 310px;
9+
height: 15px;
10+
margin: 5px;
11+
}
12+
13+
.thumb {
14+
width: 10px;
15+
height: 25px;
16+
border-radius: 3px;
17+
position: relative;
18+
left: 10px;
19+
top: -5px;
20+
background: blue;
21+
cursor: pointer;
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<link rel="stylesheet" href="style.css">
6+
</head>
7+
<body>
8+
9+
<div id="slider" class="slider">
10+
<div class="thumb"></div>
11+
</div>
12+
13+
<script>
14+
// ...Ваш код..
15+
</script>
16+
17+
</body>
18+
</html>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
.slider {
3+
border-radius: 5px;
4+
background: #E0E0E0;
5+
background: -moz-linear-gradient(left top , #E0E0E0, #EEEEEE) repeat scroll 0 0 transparent;
6+
background: -webkit-gradient(linear, left top, right bottom, from(#E0E0E0), to(#EEEEEE));
7+
background: linear-gradient(left top, #E0E0E0, #EEEEEE);
8+
width: 310px;
9+
height: 15px;
10+
margin: 5px;
11+
}
12+
13+
.thumb {
14+
width: 10px;
15+
height: 25px;
16+
border-radius: 3px;
17+
position: relative;
18+
left: 10px;
19+
top: -5px;
20+
background: blue;
21+
cursor: pointer;
22+
}

2-ui/3-event-details/6-drag-and-drop/1-slider/task.md renamed to 2-ui/3-event-details/4-drag-and-drop/1-slider/task.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,8 @@
77

88
Захватите мышкой синий бегунок и двигайте его, чтобы увидеть в работе.
99

10-
Позже к этому слайдеру можно будет добавить дополнительные функции по чтению/установке значения.
11-
12-
([getCoords](#getCoords) -- в lib.js).
13-
1410
Важно:
1511
<ul>
1612
<li>Слайдер должен нормально работать при резком движении мыши влево или вправо, за пределы полосы. При этом бегунок должен останавливаться четко в нужном конце полосы.</li>
17-
<li>Курсор при передвижении слайдера должен быть рукой(`hand`) или крестиком(`move`).</li>
18-
<li>При нажатом бегунке мышь может выходить за пределы полосы слайдера, но слайдер пусть все равно работает (удобство для пользователя).</li>
13+
<li>При нажатом бегунке мышь может выходить за пределы полосы слайдера, но слайдер пусть все равно работает (это удобно для пользователя).</li>
1914
</ul>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
В решении этой задачи для переноса мы используем координаты относительно окна и `position:fixed`. Так проще.
2+
3+
А по окончании -- прибавляем прокрутку и делаем `position:absolute`, чтобы элемент был привязан к определённому месту в документе, а не в окне. Можно было и сразу `position:absolute` и оперировать в абсолютных координатах, но код был бы немного длиннее.
4+
5+
Детали решения расписаны в комментариях в исходном коде.

2-ui/3-event-details/6-drag-and-drop/2-drag-heroes/solution.view/index.html renamed to 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/solution.view/index.html

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88

99
<h2>Расставьте супергероев по полю.</h2>
1010

11-
<p>Супергерои -- это элементы с классом "draggable". Сделайте так, чтобы их можно было переносить.</p>
11+
<p>Супергерои и мяч -- это элементы с классом "draggable". Сделайте так, чтобы их можно было переносить.</p>
1212

13-
<p>Важно: если супергероя подносят к низу или верху страницы, она должна автоматически прокручиваться. Конечно, можно прокрутить и клавиатурой, но так -- удобнее. Если страница помещается на вашем экране целиком и не имеет вертикальной прокрутки -- сделайте окно браузера меньше, чтобы протестировать эту возможность.</p>
13+
<p>Важно: если супергероя подносят к низу или верху страницы, она должна автоматически прокручиваться. Если страница помещается на вашем экране целиком и не имеет вертикальной прокрутки -- сделайте окно браузера меньше, чтобы протестировать эту возможность.</p>
1414

1515
<p>Да, и ещё: супергерои ни при каких условиях не должны попасть за край экрана.</p>
1616

@@ -23,15 +23,12 @@ <h2>Расставьте супергероев по полю.</h2>
2323
<div class="hero draggable" id="hero3"></div>
2424
<div class="hero draggable" id="hero4"></div>
2525
<div class="hero draggable" id="hero5"></div>
26-
<div id="winnie" class="draggable"></div>
26+
<div class="hero draggable" id="hero6"></div>
2727

2828
<img src="//js.cx/drag-heroes/ball.png" class="draggable">
2929

3030
<div style="clear:both"></div>
3131

32-
<script src="//js.cx/libs/getCoords.js"></script>
33-
<script src="//js.cx/libs/documentScroll.js"></script>
34-
3532
<script src="soccer.js"></script>
3633
</body>
3734
</html>

2-ui/3-event-details/6-drag-and-drop/2-drag-heroes/source.view/soccer.css renamed to 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/solution.view/soccer.css

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ html, body {
1010
float: left;
1111
}
1212

13+
/* герои и мяч (переносимые элементы) */
1314
.hero {
1415
background: url(//js.cx/drag-heroes/heroes.png);
15-
width: 105px;
16+
width: 130px;
1617
height: 128px;
1718
float: left;
1819
}
@@ -26,33 +27,21 @@ html, body {
2627
}
2728

2829
#hero3 {
29-
background-position: -131px 0;
30+
background-position: -120px 0;
3031
}
3132

3233
#hero4 {
33-
background-position: -131px -128px;
34+
background-position: -125px -128px;
3435
}
3536

3637
#hero5 {
37-
background-position: -236px 0;
38-
width: 130px;
38+
background-position: -248px -128px;
3939
}
4040

41-
#winnie {
42-
background: url(//js.cx/drag-heroes/winnie.png);
43-
width: 115px;
44-
height: 128px;
45-
float: left;
41+
#hero6 {
42+
background-position: -244px 0;
4643
}
4744

4845
.draggable {
4946
cursor: pointer;
5047
}
51-
52-
.dragging {
53-
z-index: 1000;
54-
position: absolute;
55-
cursor: move;
56-
}
57-
58-

0 commit comments

Comments
 (0)