У меня есть ряд цифр в виде иконок <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 ничего не меняет.
Да, один элемент над другим, эмодзи над цифрой. Должны быть видны только края номера. Спасибо, это может сработать



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Самый простой способ отобразить смайлик — просто скопировать и вставить. Вам просто нужно приложение или веб-сайт, который позволяет копировать смайлики в их родной символьной форме. Отличное место для этого — Emojipedia. Вы можете использовать Emojipedia для поиска или просмотра любых смайликов, которые вы ищете. После того, как вы нашли свой смайлик, появится раздел, в котором вы можете легко увидеть и скопировать смайлик.
Моя проблема заключается не в отображении смайликов, а в отображении их НАД элементами
Ответ не решает проблему ОП.
Существует множество факторов, влияющих на то, почему контент отображается со смещением относительно контейнера. Самый простой способ решить эту проблему — использовать смещение свойства 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>
у вас могут быть элементы dom, пересекающиеся друг с другом при рендеринге в окне просмотра. Вы имеете в виду просто добавить элемент поверх другого? Я спрашиваю, потому что неясно, как вы хотели поступить с прозрачностью и как должно выглядеть число ниже. Также неясно, что вы имели в виду под сквозным стилем, в любом случае, пока мы все еще говорим о позиционировании, вы могли бы использовать правило CSS, используя
::before, чтобы установить содержимое как предполагаемый смайлик, егоposition absoluteиz-index: 1и вызвать класс через js