Расположите текст по центру под изображением и используйте Jquery append

#html #jquery #css

#HTML #jquery #css

Вопрос:

Я хотел бы создать серию изображений фруктов и овощей, чтобы название этого фрукта или овоща отображалось по центру под изображением. Затем я хотел бы использовать Jquery append, чтобы имена отображались при нажатии кнопки

 ($(document).ready(function() {
  $("#btn1").click(function() {
    $("p").append(" <b>Appended text</b>.");
  });
 

В настоящее время я использую ul li, чтобы изображения отображались одно за другим в стиле галереи. Я также хотел бы, чтобы изображения были центрированы на странице.

Большое спасибо за любую помощь!

 $(document).ready(function() {
  $(".applecontainer").click(function() {
    $(".applebag,.apple").fadeToggle();
  });
  $(".lemoncontainer").click(function() {
    $(".lemonbag,.lemon").fadeToggle();
  });
  $(".limecon").click(function() {
    $(".limebag,.lime").fadeToggle();
  });
}); 
 img {
  width: 200px;
  height: auto;
}

ul {
  list-style-type: none;
  text-align: center;
}

li {
  display: inline;
}

.applebag {
  display: none;
}

.applecontainer {
  width: 100%;
  height: auto;
}

.lemonbag {
  display: none;
}

.lemoncontainer {
  width: 100%;
  height: auto;
}

.limebag {
  display: none;
}

.limecon {
  width: 100%;
  height: auto;
} 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<ul>
  <li class="applecontainer">
    <img class=apple src="apple.png" ;/>
    <img class=applebag src="applebag.png" ;/> apple
  </li>
  <li class="lemoncontainer">
    <img class=lemon src="lemon.png" ;/>
    <img class=lemonbag src="lemonbag.png" ;/>
  </li>
  <li class="limecon">
    <img class=lime src="lime.png" ;/>
    <img class=limebag src="limebag.png" ;/>
  </li>
</ul> 

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

1. Ваша идея понятна… но как вы собираетесь размещать интерактивные элементы? Я имею в виду, что если вы собираетесь разместить интерактивную кнопку для каждого фрукта, это событие будет мешать интерактивному контейнеру! Итак, мы помещаем кнопки за пределы каждого контейнера, и при нажатии на них отображается легенда изображения этого контейнера?

2. Так что это только одна кнопка, которая отображает все названия фруктов… или кнопку для каждого контейнера с фруктами?

3. Вам лучше объяснить нам больше об ожидаемом дизайне «нетехническими словами»… Например, что будет загружено первым (изображения фруктов ..), Сколько кнопок мы видим в первую очередь? Сначала контейнер с фруктами выглядит пустым, затем мы нажимаем, чтобы показать его содержимое… это обязательно? Потому что, как я вижу, ваш скрипт будет немного странным после переключения 🙂

4. Привет, @Bilel! Я намерен разместить кнопку под названием «Имена» в верхней части страницы под заголовком. Когда кто-то нажимает «имена», все названия фруктов и овощей появятся под соответствующими изображениями. На данный момент появляются фрукты и овощи, и когда вы нажимаете на каждый фрукт, он превращается в изображение способа хранения этого фрукта или овоща. Я тоже хочу добавить возможность просмотра названий фруктов и овощей на случай, если кто-то не узнает более неясный.

5. @Bilel, это выглядит великолепно, спасибо. Я попробую это быстро. Есть ли способ, чтобы изображения отображались горизонтально одно за другим?

Ответ №1:

Я многое изменил в вашем коде… Может быть, слишком много вещей, лол!В любом случае, возьмите то, что вам полезно во всем этом.

Основные изменения:

  • Я использовал несколько классов для «типа» элемента вместо определенного класса для каждого «фрукта», что значительно сократило CSS и обработчики событий.
  • Я использовал CSS flexbox для центрирования элементов.
  • Я использовал обратный вызов fadeToggle для анимации изображений одно за другим.
  • Я использовал селектор:visible для определения видимого элемента.

Дайте мне знать, если у вас возникнут какие-либо вопросы.

 $(document).ready(function () {
  $(".fruitcontainer").click(function () {
    let fruit = $(this).find(".fruit");
    let fruitbag = $(this).find(".fruitbag");

    if (fruit.is(":visible")) {
      fruit.fadeToggle(800, function () {
        fruitbag.each(function () {
          $(this).fadeToggle(800);
        });
      });
    } else {
      fruitbag.fadeToggle(800, function () {
        fruit.fadeToggle(800);
      });
    }
  });

  $("#showNames").click(function () {
    $(".fruitname").fadeToggle();
  });
}); 
 img {
  width: 200px;
  height: auto;
}

ul {
  list-style-type: none;
  text-align: center;
  display: flex;
  flex-direction: row;
}
li {
  display: inline;
}

.fruitbag,
.fruitname {
  display: none;
}
.fruitname {
  margin-bottom: -2em;
}
.fruitcontainer {
  width: 100%;
  height: 400px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="showNames">Names</button>
<ul>
  <li class="fruitcontainer">
    <img class="fruit" src="https://via.placeholder.com/200x200.png?text=apple.png" />
    <img class="fruitbag" src="https://via.placeholder.com/200x200.png?text=applebag.png" />
    <p class="fruitname">apple</p>
  </li>

  <li class="fruitcontainer">
    <img class="fruit" src="https://via.placeholder.com/200x200.png?text=lemon.png" />
    <img class="fruitbag" src="https://via.placeholder.com/200x200.png?text=lemonbag.png" />
    <p class="fruitname">lemon</p>
  </li>

  <li class="fruitcontainer">
    <img class="fruit" src="https://via.placeholder.com/200x200.png?text=lime.png" />
    <img class="fruitbag" src="https://via.placeholder.com/200x200.png?text=limebag.png" />
    <p class="fruitname">lime</p>
  </li>
</ul> 

CodePen

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

1. Привет, @Louys, это потрясающе и красиво. Спасибо! Это намного чище. Я бы хотел, чтобы изображения были перенесены, и я попытался добавить «flex-flow: перенос строк;» в CSS ul, но тогда он показывает только одно изображение в строке. Знаете ли вы, какие изменения нужно внести, чтобы изображения отображались в соответствии с шириной окна браузера? Спасибо вам от всего сердца!

2. Попробуйте flex-direction: column; ul , 😉

3. Я чувствую, что что-то упускаю, @Louys. Я написал ul { list-style-type: none; text-align: center; display: flex; flex-direction: column; } но я все еще получаю только одно изображение на строку