Как я могу скопировать идентификатор из div в идентификатор CSS?

В моем Sightly для компонента AEM есть следующее. Как с помощью jQuery скопировать идентификатор, созданный для элемента div, в три стиля CSS? На странице будет несколько таких карточек, поэтому придется перебрать каждую карточку.

<div id = "${card.id}" class = "card flex-card radius-lg rel bgcolor ${card.cardTheme}"
                  role = "region" tabindex = "-1">
                  <sly data-sly-test.isImageTheme = "${card.cardTheme == 'theme-light-bg-img' || card.cardTheme == 'theme-dark-bg-img'}">
                      <style data-sly-test = "${isImageTheme}">
                          @media (min-width:1025px) {
                            #id-placeholder {
                              background-image: url(${card.imageLifestyle @ context='attribute'});
                              background-size: cover;
                              background-position: bottom right;
                            }
                          }
                          @media (min-width:768px) and (max-width:1024px) {
                            #id-placeholder {
                              background-image: url(${card.imageLifestyleTablet @ context='attribute'});
                              background-size: cover;
                              background-position: bottom right;
                            }
                          }
                          @media (max-width:767px) {
                            #id-placeholder {
                              background-image: url(${card.imageLifestyleMobile @ context='attribute'});
                              background-size: cover;
                              background-position: bottom right;
                            }
                          }
                      </style>
                  </sly>

Вот последняя версия jQuery, которую я пробовал, но, похоже, ничто не может установить идентификатор в CSS.

    $(".card").each(function() {
        var id = $(this).attr('id'); 
        var style = $(this).find('style').html(); 
        style = style.replace(/#id-placeholder/g, '#' + id); 
        $(this).find('style').html(style); 
    });
    ````

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

DarkBee 12.08.2024 14:58

Какая в этом случае польза от нацеливания на идентификатор вместо использования класса? Обычно мы используем классы для нацеливания на несколько элементов или элементов с идентификаторами, которые могут меняться динамически. Возможно, вы могли бы добавить класс к элементу и напрямую нацелиться на этот класс?

Nicolas 12.08.2024 15:02

Каждая карточка будет иметь свой уникальный набор изображений для настольных компьютеров, планшетов и мобильных устройств.

linnse 12.08.2024 15:04

Согласен с @Nicolas здесь.

Death-is-the-real-truth 12.08.2024 15:04

В этом случае, возможно, уникальный стиль можно применить непосредственно к элементу, используя атрибут style. Он используется для применения стиля непосредственно к элементу вместо использования отдельной таблицы стилей. Похоже, это может быть решением вашей проблемы.

Nicolas 12.08.2024 15:08

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

Peter Pointer 12.08.2024 15:08

Если я использую классы, каждый компонент будет иметь одинаковый набор изображений.

linnse 12.08.2024 15:11

Я удалил «.test» из jQuery в исходном сообщении. Забыл удалить перед публикацией, но всё равно не работает.

linnse 12.08.2024 15:13
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1
8
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш код будет работать, как только вы удалите .test из кода jQuery, поскольку в вашем div нет этого класса.

Также в CSS вы должны указать правильный путь к фоновому изображению, чтобы оно работало.

Пример рабочего кода: (с жестким идентификатором кода и использованием цвета фона, чтобы показать вам, что он работает.)

$(document).ready(function() {
  $(".card").each(function() {
    var id = $(this).attr('id');
    var style = $(this).find('style').html();
    style = style.replace(/#id-placeholder/g, '#' + id);
    $(this).find('style').html(style);
  });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<div id = "card-1" class = "card flex-card radius-lg rel bgcolor ${card.cardTheme}" role = "region" tabindex = "-1" style = "height:100px;width:100px;">
  <sly data-sly-test.isImageTheme = "${card.cardTheme == 'theme-light-bg-img' || card.cardTheme == 'theme-dark-bg-img'}">
    <style data-sly-test = "${isImageTheme}">
      @media (min-width:1025px) {
        #id-placeholder {
          background-image: url(${card.imageLifestyle @ context='attribute'});
          background: green;
          background-size: cover;
          background-position: bottom right;
        }
      }
      
      @media (min-width:768px) and (max-width:1024px) {
        #id-placeholder {
          background: green;
          background-size: cover;
          background-position: bottom right;
        }
      }
      
      @media (max-width:767px) {
        #id-placeholder {
          background-image: url(${card.imageLifestyleMobile @ context='attribute'});
          background-size: cover;
          background-position: bottom right;
        }
      }
    </style>
  </sly>
Ответ принят как подходящий

Изменение CSS для указания идентификатора непосредственно в HTML — не лучшая идея.

Вместо этого вы можете объединить возможности переменных CSS и атрибута style, чтобы определить изображение для каждого размера.

Затем вы можете получить доступ к этим переменным в своем CSS и применить стили, общие для всех ваших карточек.

Переменная css может использоваться для изменения стиля во время выполнения и может быть установлена ​​непосредственно в элементе. Вы можете идентифицировать переменную CSS, поскольку она начинается с --.

Обратите внимание, что я не знаком с AEM или Sightly, поэтому следующий пример используется только в качестве демонстрации.

Сначала мы добавим класс, который будет использоваться для применения стиля ко всем карточкам. Здесь я буду использовать my-responsive-card.

<div id = "${card.id}" 
     class = "card flex-card radius-lg rel bgcolor ${card.cardTheme} my-responsive-card" 
     role = "region" 
     tabindex = "-1">
  <!-- ... --> 
</div>

<style>
.my-responsive-card {
  background-size: cover;
  background-position: bottom right;
}
</style>

Затем мы можем использовать атрибут style для определения трех переменных CSS, по одной для каждого размера изображения. Давайте использовать --image-desktop, --image-tablet и --image-mobile.

Эту переменную можно определить как любое другое свойство CSS:

<div id = "${card.id}" 
  class = "card flex-card radius-lg rel bgcolor ${card.cardTheme} my-responsive-card" 
  role = "region" 
  tabindex = "-1" 
  style = "--image-desktop: ${card.imageLifestyle @ context='attribute'}; --image-tablet: ${card.imageLifestyleTablet @ context='attribute'}; --image-mobile: ${card.imageLifestyleMobile @ context='attribute'}">
  <!-- ... --> 
</div>

<style>
.my-responsive-card {
  background-size: cover;
  background-position: bottom right;
}
</style>

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

Чтобы получить доступ к переменной css, вам нужно использовать функцию var() css.

<div id = "${card.id}" 
  class = "card flex-card radius-lg rel bgcolor ${card.cardTheme} my-responsive-card" 
  role = "region" 
  tabindex = "-1" 
  style = "--image-desktop: ${card.imageLifestyle @ context='attribute'}; --image-tablet: ${card.imageLifestyleTablet @ context='attribute'}; --image-mobile: ${card.imageLifestyleMobile @ context='attribute'}">
  <!-- ... --> 
</div>

<style>
.my-responsive-card {
  background-image: var(--image-desktop); 
  background-size: cover;
  background-position: bottom right;
} 

@media (min-width:768px) and (max-width:1024px) {
  .my-responsive-card {
    background-image: var(--image-tablet); 
  }
}
                         
@media (max-width:767px) {
  .my-responsive-card {
    background-image: var(--image-mobile); 
  }
}

</style>

Обратите внимание, что ваше первое условие медиазапроса не является обязательным, поскольку оно является значением по умолчанию.

Это очень ценный и точный ответ. +1. удаление моего-единственного

Death-is-the-real-truth 12.08.2024 15:25

@Смерть-это-настоящая правда. Я ценю комментарий. Я должен сказать, что ваш ответ был намного ближе к исходному коду, чем мой, что может быть более доступно для тех, у кого меньше опыта работы с JavaScript. Вы могли бы сохранить это для будущих пользователей с той же проблемой. На мой взгляд, оба варианта являются хорошими способами решения проблемы.

Nicolas 12.08.2024 15:48

Я попробовал это, но атрибут стиля в теге div карты остался неизменным. Например, при рендеринге страницы в браузере отображается --imagedesktop, а не фактический путь к изображению.

linnse 12.08.2024 16:38

Великолепно. Спасибо.

linnse 12.08.2024 17:32

@ Николас, я снова открыл свой ответ. (поскольку я согласен с вашим комментарием)

Death-is-the-real-truth 12.08.2024 18:49

Вы также можете использовать переменные Sightly/HTL для визуализации идентификаторов:

<div id = "${card.id}" class = "card flex-card radius-lg rel bgcolor ${card.cardTheme}"
                  role = "region" tabindex = "-1">
                  <sly data-sly-test.isImageTheme = "${card.cardTheme == 'theme-light-bg-img' || card.cardTheme == 'theme-dark-bg-img'}">
                      <style data-sly-test = "${isImageTheme}">
                          @media (min-width:1025px) {
                            #${card.id} {
                              background-image: url(${card.imageLifestyle @ context='attribute'});
                              background-size: cover;
                              background-position: bottom right;
                            }
                          }
                          @media (min-width:768px) and (max-width:1024px) {
                            #${card.id} {
                              background-image: url(${card.imageLifestyleTablet @ context='attribute'});
                              background-size: cover;
                              background-position: bottom right;
                            }
                          }
                          @media (max-width:767px) {
                            #${card.id} {
                              background-image: url(${card.imageLifestyleMobile @ context='attribute'});
                              background-size: cover;
                              background-position: bottom right;
                            }
                          }
                      </style>
                  </sly>

Но для меня это действительно некрасиво. Вместо этого я бы сохранил фоновые изображения как атрибуты данных на карте и использовал attr в CSS для установки фоновых изображений, тогда CSS можно сохранить общим и определить один раз для всех карточек:

<style data-sly-test = "${isImageTheme}">
.card .theme-light-bg-img, .card .theme-dark-bg-img {
    background-size: cover;
    background-position: bottom right;
}
@media (min-width:1025px) {
    .card .theme-light-bg-img, .card .theme-dark-bg-img {
        background-image: url(attr('data-backgroundImage'));

    }
}
@media (min-width:768px) and (max-width:1024px) {
    .card .theme-light-bg-img, .card .theme-dark-bg-img {
        background-image: url(attr('data-backgroundImageTablet'));

    }
}
@media (max-width:767px) {
    .card .theme-light-bg-img, .card .theme-dark-bg-img {
        background-image: url(attr('data-backgroundImageMobile'));

    }
}
</style>

и HTML будет выглядеть так:

<div id = "${card.id}" class = "card flex-card radius-lg rel bgcolor ${card.cardTheme}" role = "region" tabindex = "-1"
     data-backgroundImage = "${card.imageLifestyle @ context='attribute'}"
     data-backgroundImageTablet = "${card.imageLifestyleTablet @ context='attribute'}"
     data-backgroundImageMobile = "${card.imageLifestyleMobile @ context='attribute'}">
...
</div>

Одна из проблем, с которой я столкнулся, заключается в том, что все в тегах стиля кажется неприкосновенным для jQuery.

linnse 12.08.2024 16:36

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