Отображение имен при просмотре

#javascript #css #onmouseover

Вопрос:

У меня есть фотография с несколькими людьми на веб-сайте (сделанная с помощью php), и я хотел бы получить следующее: когда курсор перемещается по лицу человека, имя этого человека отображается внизу фотографии. После долгих поисков я нашел на другом веб-сайте код, который был близок к тому, что я хотел, и после того, как я изменил несколько вещей, я заставил его делать (в основном) то, что я хочу, но я действительно многого не понимаю, и я убежден, что должен быть более простой способ сделать это. Код скопирован ниже. Текст «Name1» появляется внизу фотографии, когда курсор находится в положении, указанном первым классом «точка доступа», а текст «Name2» появляется, когда курсор находится в положении, указанном во втором классе «точка доступа».

Это мои вопросы:

  1. Может ли кто-нибудь объяснить, как это работает, и можно ли это упростить
  2. Почему, если я заменю Name1 на имя и фамилию, вывод будет в двух разных строках. Кажется, ничто не исправит это, кроме размещения имени, фамилии в таблице с одной строкой, и даже в этом случае интервал между словами неправильный и не поддается контролю
  3. Почему этот код работает только с Google Chrome или Firefox, но не с Safari или браузером Windows.

Спасибо за любые подсказки, даже если частичные.

Первая партия кода-это файл css, другая-файл php

 .hotspot {
position: absolute; 
}
.hotspot   * {
pointer-events: none;
opacity: 0;
}
.hotspot:hover   * {
opacity: 1;
}
.wash {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-color: rgba(255, 255, 255, 0.6);
}


<div style="position: relative; height: 1px; width: 1px;">
<img src="photo.jpg" width=900px>
   <div class="hotspot" style="top: 195px; left: 277px; height: 50px; width: 50px;"> 
   </div>
<div>
    <div class="wash"></div>
   <div style="position: absolute; top: 900; left: 300px;font-size:35px;">
   Name1
   </div>
</div>

<div class="hotspot" style="top: 202px; left: 337px; height: 50px; width: 50px;">. 
</div>
<div>
    <div class="wash"></div>
   <div style="position: absolute; top: 900; left: 300px;font-size:35px;">
Name2 </div>
</div>
 

Комментарии:

1. Это проблема CSS/браузера. PHP не связан с этим. Скорее всего, вы сможете добиться того, чего хотите, с помощью JS проще.

2. @user3783243 не могли бы вы показать мне, как это сделать с помощью JS?

3. Извините, я со стороны PHP. Я не очень много занимаюсь JS. Хотя я бы начал с изучения этого маршрута. Звучит похоже на пометки в facebook, так что, может быть 1stwebdesigner.com/image-tagging-tutorial не могли бы вы помочь?

Ответ №1:

Вот хороший стартер для вас, чтобы поиграть.

 console.clear();

data = {
  Isabelle: {
    left: 100,
    top: 23,
    width: 172,
    height: 142
  },
  Clara: {
    left: 284,
    top: 38,
    width: 121,
    height: 191
  },
  Sylvie: {
    left: 412,
    top: 9,
    width: 121,
    height: 191
  },
  Steeve: {
    left: 498,
    top: 79,
    width: 208,
    height: 191
  },
  Jacques: {
    left: 56,
    top: 179,
    width: 157,
    height: 191
  },
  Julie: {
    left: 213,
    top: 178,
    width: 106,
    height: 178
  },
  Amélie: {
    left: 300,
    top: 319,
    width: 139,
    height: 211
  },
  Robert: {
    left: 456,
    top: 282,
    width: 182,
    height: 229
  }
};

// Positions the zones with their event handler setted
let names = Object.keys(data);
names.forEach((n) => {
  let zone = $("<div>");
  zone
    .addClass("imageMapZone")
    .css(data[n])
    .hover(
      function () {
        $(".namezone").text(n);
      },
      function () {
        $(".namezone").text("");
      }
    );
  $(".imageMapContainer").append(zone);
}); 
 .imageMapContainer{
  position: relative;
}
.imageMapZone{
  position: absolute;
}
.namezone{
  Font-size: 1.4em;
  min-height: 1.6em;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="imageMapContainer">
  <img src="https://www.quickanddirtytips.com/sites/default/files/styles/convert_webp_article_main_image/public/images/2332/people-persons-peoples.jpg?itok=wE8o-yua">
</div>
<div class="namezone"></div> 

Комментарии:

1. Спасибо, код отлично работает, но теперь у меня есть еще две проблемы: предположим, я хочу отобразить как имя, так и фамилию, разделенные пробелом. Пространство создает проблемы. Вторая проблема заключается в том, что положение зон, по-видимому, зависит от браузера. Если я настрою позицию для Google Chrome, то она будет работать и с Firefox, но в Safari все они сдвинуты.

2. Не обращайте внимания на первый вопрос в моем комментарии, я понял это: если я использую «Изабель» вместо «Изабель», то я также могу включить такое пространство, как «Изабель Лекар». Но у меня все еще есть проблемы с положением зон, зависящих от браузера .

3. Как указано в ответе, это стартер. Размеры работают, если изображение имеет размер 100%… Но если он будет изменен, потребуется еще несколько вычислений. Я не буду разрабатывать здесь 100% — ное решение с полным доказательством.

4. Хорошо, спасибо, ваш код был очень полезен. Я еще немного поэкспериментирую с размерами.

5. Вам нужно будет указать 100% ширину и высоту изображения в данных. Затем примените правило 3 с размером отрисованного изображения.