Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Schulzkafer
82 / 50 / 2
Регистрация: 31.12.2019
Сообщений: 418

Рисунок сдвигается на неравные расстояния при relative

05.07.2020, 01:52. Показов 2653. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
(3я задача из https://learn.javascript.ru/focus-blur#tasks)

объясните, пожалуйста, почему в моем решении при нажатии на стрелки рисунок передвигается на неравные расстояния(влево-вправо), в неправильные для меня стороны(вверх) и на неправильные для меня значения(не на 20px)?
все это происходит только при relative, при absolute все нормально

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<!DOCTYPE HTML>
<html>
 
<head>
  <meta charset="utf-8">
  <style>
    #mouse {
      display: inline-block;
      cursor: pointer;
      margin: 0;
      position: relative;
    }
 
    #mouse:focus {
      outline: 1px dashed black;
    }
  </style>
</head>
 
<body>
 
  <p>Кликните по "изображению" мыши и перемещайте её с помощью клавиш со стрелками.</p>
 
  <pre id="mouse">
 _   _
(q\_/p)
 /. .\
=\_t_/=   __
 /   \   (
((   ))   )
/\) (/\  /
\  Y  /-'
 nn^nn
</pre>
 
 
  <script>
 
    let mouse = document.getElementById('mouse');
     mouse.tabIndex = 0;
 mouse.onclick = function (event) {
// mouse.focus()
document.body.onkeydown = function(event) {
        if (event.key == 'ArrowRight') {
    mouse.style.left = mouse.getBoundingClientRect().left + 20 + 'px';
    } else if (event.key == 'ArrowLeft') {
        mouse.style.left = mouse.getBoundingClientRect().left - 20 + 'px';
        } else if (event.key == 'ArrowUp') {
        mouse.style.top = mouse.getBoundingClientRect().top - 20 + 'px';
    } else if (event.key == 'ArrowDown') {
        mouse.style.top = mouse.getBoundingClientRect().top + 20 + 'px';
}
 
 }
 
 mouse.onblur = function() {
    document.body.onkeydown ='';
    //console.log(document.body.onkeydown)
 }
}
  </script>
</body>
 
</html>
Добавлено через 29 минут
вопрос №2)
напишу сразу еще этот вопрос чтобы его не забыть,
если ваш ответ не включит автоматически ответ на этот второй мой вопрос:
пункт а : console.dir(mouse.getBoundingClientRect( ).left);
пункт b : console.dir(mouse.style.left) -- показывает меньшее значение чем пункт а. Почему ?

Добавлено через 6 минут
очевидно что тут все дело в родителе, но как мне казалось тут в качестве родителя выступает окно браузера и в случае с absolute и в случае с relative одинаково http://htmlbook.ru/css/left
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2020, 01:52
Ответы с готовыми решениями:

Position: relative (сдвигается сайт)
Форумчане прощу помощи: сдвигаю языковую понель вниз, но при этом сдвигаетя сам сайт на ширину самой языковой панели. При применении...

Меняю position:relative на absolute и вложенный блок сдвигается вниз
Здравствуйте, столкнулась с такой проблемой: когда меняю у родительского блока (class=&quot;business&quot;) position: relative на absolute,...

Fixed absolute и relative. Как сделать fixed блок по центру relative родителя?
Хелп плз( сломал голову уже и поиск ни к чему толковому не привел. &lt;div id=&quot;content&quot;&gt; &lt;div...

6
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
05.07.2020, 07:41
Лучший ответ Сообщение было отмечено Schulzkafer как решение

Решение

Schulzkafer, 1). При position relative положение меняется относительно начальной позиции самого элемента(см. рис. 2 по вашей ссылке) Пример: чтобы сдвинуть #mouse на 10px влево, нужно изменить left на -10px (style.left = parseInt(style.left) - 10 + 'px')
2). getBoundingClientRect возвращает положение элемента относительно видимой части страницы(viewport). Добиться чтобы mouse.getBoundingClientRect().top/r/b/l был равен style.top/r/b/l, можно с помощью position fixed.
1
 Аватар для Schulzkafer
82 / 50 / 2
Регистрация: 31.12.2019
Сообщений: 418
05.07.2020, 19:06  [ТС]
еще добавлю: надо указать самого начала начальные координаты вот так:
JavaScript
1
2
mouse.style.left='1px';
mouse.style.top='1px';
причем если мы укажем это только в CSS, то работать не будет:
JavaScript
1
2
3
4
 #mouse {
top:1px;
left:1px;
        }
Впрочем, эта путаница с relative и absolute будет сопровожтать меня еще долго))\
Будьте добры, подскажите еще ответ на это вопрос:
почему у нас mouse.offsetLeft равен 8px ? Это значение откуда? почему оно, например, не ноль или не 100 ?)
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
06.07.2020, 04:39
Лучший ответ Сообщение было отмечено Schulzkafer как решение

Решение

Цитата Сообщение от Schulzkafer Посмотреть сообщение
еще добавлю: надо указать самого начала начальные координаты вот так
Или как вариант (style.left = parseInt(style.left || 0) - 10 + 'px').
Цитата Сообщение от Schulzkafer Посмотреть сообщение
почему у нас mouse.offsetLeft равен 8px ?
Schulzkafer, у body margin 8px, пользуйтесь инструментами разработчика в браузере - полезная штука
1
 Аватар для Schulzkafer
82 / 50 / 2
Регистрация: 31.12.2019
Сообщений: 418
06.07.2020, 17:36  [ТС]
shvyrevvg, в этом- то и состоит мой вопрос, что в стилях нигде не указано что margin для body равен 8px, а в результате в инструментах он появляется:
Миниатюры
Рисунок сдвигается на неравные расстояния при relative  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
06.07.2020, 18:37
Лучший ответ Сообщение было отмечено Schulzkafer как решение

Решение

Schulzkafer, эти стили добавляет браузер(справа сверху надпись "user agent stylesheet")
1
 Аватар для Schulzkafer
82 / 50 / 2
Регистрация: 31.12.2019
Сообщений: 418
06.07.2020, 20:08  [ТС]
shvyrevvg, Спасибо большое!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2020, 20:08
Помогаю со студенческими работами здесь

С какого расстояния глаз перестанет различать отдельные точки и рисунок начнет выглядеть как непрерывный переход
В растровом рисунке изображение образовано точками различной насыщенности (т.е. разной “жирности”). С какого расстояния l глаз перестанет...

На странице есть рисунок. При наведении мыши на этот рисунок он должен измениться
На странице есть рисунок. При наведении мыши на этот рисунок он должен измениться. Когда Вы отведете мышку в сторону, рисунок должен...

Установите в документе рисунок с кнопкой При нажатии кнопки рисунок должен смениться
Ув. пользователи! Прошу помочь мне с некоторыми задачами по Java Script: 1) Установите в документе рисунок с кнопкой. При нажатии...

Блоки relative и position внутри блока с position: relative
Всем привет! Я новичок, верстаю свой первый сайт (http://cosmetolog.cu.cc/). У меня возник вопрос касательно слайдера. Есть...

Не убирается margin при position:relative
Проблема такая, ставлю блоки классов &quot;_0&quot; и &quot;_1&quot;. Дело в том, что у блоков не убирается правый маргин. Смотрю в Chrome через F12. Рамка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru