Как поместить эмодзи поверх текста в HTML/JavaScript?

У меня есть ряд цифр в виде иконок <i>1</i><i>2</i><i>3</i><i>4</i>, и я пытаюсь сделать программу, которая бы динамически помещала определенные смайлики поверх каждой из них. Так что номер находится за его эмодзи.

Пока мне удалось вычеркнуть цифры только по требованию. Я подумал, может быть, есть возможность использовать смайлики в качестве стиля сквозной строки в CSS?

UPD: Итак, у меня есть <i id = "six">6</i> в HTML и #six::before {content: '🔥'; position: absolute;} в CSS, и это работает, хотя отображается косо, а атрибут z-index ничего не меняет.

у вас могут быть элементы dom, пересекающиеся друг с другом при рендеринге в окне просмотра. Вы имеете в виду просто добавить элемент поверх другого? Я спрашиваю, потому что неясно, как вы хотели поступить с прозрачностью и как должно выглядеть число ниже. Также неясно, что вы имели в виду под сквозным стилем, в любом случае, пока мы все еще говорим о позиционировании, вы могли бы использовать правило CSS, используя ::before, чтобы установить содержимое как предполагаемый смайлик, его position absolute и z-index: 1 и вызвать класс через js

Diego D 27.12.2022 11:20

Да, один элемент над другим, эмодзи над цифрой. Должны быть видны только края номера. Спасибо, это может сработать

B D 27.12.2022 11:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Самый простой способ отобразить смайлик — просто скопировать и вставить. Вам просто нужно приложение или веб-сайт, который позволяет копировать смайлики в их родной символьной форме. Отличное место для этого — Emojipedia. Вы можете использовать Emojipedia для поиска или просмотра любых смайликов, которые вы ищете. После того, как вы нашли свой смайлик, появится раздел, в котором вы можете легко увидеть и скопировать смайлик.

Моя проблема заключается не в отображении смайликов, а в отображении их НАД элементами

B D 27.12.2022 11:38

Ответ не решает проблему ОП.

timlg07 27.12.2022 18:25
Ответ принят как подходящий

Существует множество факторов, влияющих на то, почему контент отображается со смещением относительно контейнера. Самый простой способ решить эту проблему — использовать смещение свойства left, чтобы оно было правильно выровнено.

Я попытался сделать демонстрацию, экстраполирующую ваши начальные условия.

Я использовал псевдоэлемент ::before для рендеринга содержимого эмодзи, когда к элементу применяется данный класс. В любом случае, чтобы убедиться, что родительский элемент <i> выровнен с псевдоэлементом, я присвоил ему фиксированную высоту и ширину и установил размер шрифта в корневом элементе, чтобы все правильно стилизовалось при использовании rem.

Итак, это стиль для элемента .box:

.box{
  position: relative;
  width: 1rem;
  height: 1rem;
  line-height: 1rem;
  display: inline-block;
  text-align: center;
}

position:relative нужен для того, чтобы псевдоэлемент был позиционирован абсолютно относительно своего родителя; размер фиксирован, и display: inline-block гарантирует, что родительский элемент по-прежнему будет встроенным с точки зрения макета, но также примет во внимание его ширину.

Демо имеет 3 кнопки:

  • Один для переключения видимости смайликов
  • Один для переключения контура элементов <i> (красный) и элементов ::before (синий)
  • Один для переключения смещения, необходимого для лучшего выравнивания содержимого смайликов.

Я использовал top: 20% и должен признать, что это было произвольно. В любом случае, я совершенно уверен, что он должен хорошо масштабироваться в зависимости от размера шрифта.

Одно замечание: поскольку элемент <i> задает форматирование курсивом, я изменил его внутри псевдоэлемента (font-style: normal;), чтобы смайлик не растягивался (как пламя, которое вы показали в своем примере).

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

changeFontSize();

function toggleClassToBoxes(classname){
  document.querySelectorAll('.container > .box')
    .forEach(box => { box.classList.toggle(classname); });
}

function toggleClassToBoxesByNumber(classnamePrefix){
  document.querySelectorAll('.container > .box')
    .forEach(box => {
      const i = parseInt(box.textContent);
      const classname = `${classnamePrefix}-${i}`;
      box.classList.toggle(classname);
    });
}

function changeFontSize(range){
  if (!range)
    range = document.querySelector('.fontsize input');
  const value = `${range.value}px`;
  document.querySelector(':root').style.fontSize = value;
  document.querySelector('.fontsize label').textContent = `font-size: ${value};`;
}
:root{
  font-size: 80px;
}

.box{
  position: relative;
  width: 1rem;
  height: 1rem;
  line-height: 1rem;
  display: inline-block;
  text-align: center;
}

.box.outline{
  outline: solid red 6px;
}

.emoji::before {
  position: absolute;
  font-style: normal;
  left: 0;
  right: 0;
}

.emoji.outline::before {
  outline: solid blue 3px;
}

.emoji.offset::before {
  left: -20%;
  /*
  This was overstating for the sake of evaluating any option
  padding: 0;
  margin: 0;
  width: 1rem;
  height: 1rem;
  line-height: 1rem;
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  */
}

.emoji-1::before{
  content: "😆";
}

.emoji-2::before{
  content: "😁";
}

.emoji-3::before{
  content: "🤣";
}
.emoji-4::before{
  content: "😂";
}

.fontsize{
  display: flex;
  gap: 20px;
}

.fontsize input{
  width: 50%;
}
button, input{
  cursor: pointer;
  padding: .5em 1em;
}

label{
  font-size: 24px;
}
<div class = "container">
  <i class = "box">1</i>
  <i class = "box">2</i>
  <i class = "box">3</i>
  <i class = "box">4</i>
</div>

<div>
  <div class = "buttonstripe">
    <button
      onclick = "toggleClassToBoxes('emoji');toggleClassToBoxesByNumber('emoji');"
      >Toggle Emojis</button>
    <button onclick = "toggleClassToBoxes('outline');">Toggle Outlines</button>
    <button onclick = "toggleClassToBoxes('offset');">Toggle Offset</button>
  </div>
  <div class = "fontsize">
    <input type = "range" oninput = "changeFontSize(this)" min = "0" max = "100" value = "80">
    <label>font-size</label>
  <div>
</div>

Другие вопросы по теме