Использование атрибута данных HTML для установки URL-адреса фонового изображения CSS

Я планирую создать собственную фотогалерею для друга, и я точно знаю, как буду создавать HTML, однако у меня возникла небольшая проблема с CSS.
(Я бы предпочел не использовать стили страницы если возможно, полагайтесь на jQuery)


У меня вопрос:
Data-Attribute в HTML
Background-image в CSS
Я использую этот формат для своих миниатюр html:
<div class="thumb" data-image-src="images/img.jpg"></div>

и я предполагаю, что CSS должен выглядеть примерно так:

.thumb {
    width:150px;
    height:150px;
    background-position:center center;
    overflow:hidden;
    border:1px solid black;

    background-image: attr(data-image-src);/*This is the question piece*/
}


Моя цель - взять data-image-src из div.thumb в моем HTML-файле и использовать его для каждого div.thumb (s) background-image источника в моем CSS-файле.

Вот перо Codepen, чтобы получить динамический пример того, что я ищу:
http://codepen.io/thestevekelzer/pen/rEDJv


person StephenKelzer    schedule 31.03.2013    source источник


Ответы (9)


Со временем вы сможете использовать

background-image: attr(data-image-src url);

но, насколько мне известно, это еще нигде не реализовано. В приведенном выше примере url - это необязательный параметр типа или единицы для attr(). См. https://drafts.csswg.org/css-values/#attr-notation < / а>.

person Community    schedule 25.08.2013
comment
Когда вы говорите в конце концов, есть ли способ узнать, КОГДА это будет примерно с сайта W3? - person StephenKelzer; 30.09.2014
comment
Случайное предположение без каких-либо сведений о конкретном статусе реализации происходит за 1-2 года до того, как оно станет доступным во всех версиях браузера. - person ; 30.09.2014
comment
@torazaburo год закончился, но все еще полон надежд. - person Clemens Himmer; 11.01.2016
comment
@ Фелипе. Да мы знаем. Этот вопрос о другом. - person ; 25.05.2016
comment
caniuse.com/#feat=css3-attr На сегодняшний день ни один браузер не реализовал эту функцию пока что. - person saawsann; 12.03.2018
comment
По-прежнему ничего: | - person Mosh Feu; 14.06.2018
comment
@BartBurg говорит только о content собственности. Согласно caniuse.com/#feat=css3-attr attr() ни в одном свойстве CSS не пока поддерживается. - person Unicornist; 22.12.2018
comment
2021 год ... все еще нет поддержки браузеров, похоже, этого не произойдет :( - person Anentropic; 01.01.2021
comment
Это вообще не работает. Это не решит никаких проблем. - person andfra; 14.03.2021

Если вы хотите сохранить его с помощью только HTML и CSS, вы можете использовать переменные CSS. Помните, что переменные css не поддерживаются в IE.

<div class="thumb" style="--background: url('images/img.jpg')"></div> 
.thumb {
    background-image: var(--background);
}

Codepen: https://codepen.io/bruce13/pen/bJdoZW

person Bruce Brotherton    schedule 02.04.2019
comment
Это, наверное, лучший ответ на данный момент. Нет javascript - это всегда хорошо. - person Abdalla Arbab; 12.10.2019
comment
+1. Это более гибкое решение, чем просто добавление изображения непосредственно в строку, как в другом ответе ниже, потому что вы можете объявить несколько путей к изображениям, скажем, для нескольких разрешений, а затем решить в своем коде CSS, какое изображение загружать для какого разрешения. - person Sumit; 06.11.2020
comment
в этот момент почему бы просто не установить background-image в атрибуте стиля, зачем вообще возиться с переменной ?? - person Muhammad Umer; 11.02.2021
comment
@MuhammadUmer Я тоже часто использую фоновое изображение, просто пытаясь как можно лучше соответствовать задающему вопросу. Я могу придумать два преимущества использования переменной: 1) Вы можете легко перезаписать ее с помощью CSS, не требуя! Important. 2) Вы можете установить изображения по умолчанию, если переменная не установлена ​​в: root {}. Я обновил свой CodePen, чтобы проиллюстрировать эти изменения. - person Bruce Brotherton; 12.02.2021

Смешивать контент со стилем - не лучшая практика, но решение может быть

<div class="thumb" style="background-image: url('images/img.jpg')"></div>
person Kevin Johne    schedule 28.05.2015

Для этого вам понадобится немного JavaScript:

var list = document.getElementsByClassName('thumb');

for (var i = 0; i < list.length; i++) {
  var src = list[i].getAttribute('data-image-src');
  list[i].style.backgroundImage="url('" + src + "')";
}

Оберните это тегами <script> внизу непосредственно перед тегом </body> или оберните функцией, которую вы вызываете после загрузки страницы.

person Jonathan    schedule 29.05.2013

Как насчет использования Sass? Вот что я сделал, чтобы добиться чего-то подобного (хотя обратите внимание, что вам нужно создать список Sass для каждого из атрибутов данных).

/*
  Iterate over list and use "data-social" to put in the appropriate background-image.
*/
$social: "fb", "twitter", "youtube";

@each $i in $social {
  [data-social="#{$i}"] {
    background: url('#{$image-path}/icons/#{$i}.svg') no-repeat 0 0;
    background-size: cover; // Only seems to work if placed below background property
  }
}

По сути, вы перечисляете все значения своих атрибутов данных. Затем используйте Sass @each для перебора и выбора всех атрибутов данных в HTML. Затем введите переменную итератора и сопоставьте ее с именем файла.

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

person CodeFinity    schedule 10.10.2017
comment
Это требует, чтобы у вас был известный список значений в вашем объявлении стилей. Когда я задал этот вопрос, я пытался сделать так, чтобы разметка определяла отображаемые стили, а не наоборот. - person StephenKelzer; 11.10.2017
comment
Да, это туф. Прости! - person CodeFinity; 11.10.2017
comment
Это помогло мне решить аналогичную проблему, а также показало мне функцию Sass, о существовании которой я не подозревал, ура! - person MadSkunk; 14.06.2019

HTML

<div class="thumb" data-image-src="img/image.png">

jQuery

$( ".thumb" ).each(function() {
  var attr = $(this).attr('data-image-src');

  if (typeof attr !== typeof undefined && attr !== false) {
      $(this).css('background', 'url('+attr+')');
  }

});

Демонстрация JSFiddle

Вы также можете сделать это с помощью JavaScript.

person Fritz    schedule 16.04.2015
comment
if (attr) { доставит ли вам неприятности? Я не вижу смысла в строгих проверках typeof и false, поскольку и false, и undefined являются ложными значениями. - person Thijs Koerselman; 08.02.2017

Для тех, кто хочет глупого ответа, как я

Что-то вроде того, как шаги как 1, 2, 3

Вот что я сделал

Сначала создайте разметку HTML

<div class="thumb" data-image-src="images/img.jpg"></div>

Затем перед конечным тегом тела добавьте этот скрипт

Я включил конечное тело в код ниже в качестве примера

Так что будьте осторожны, когда копируете

<script>
var list = document.getElementsByClassName('thumb');

for (var i = 0; i < list.length; i++) {
  var src = list[i].getAttribute('data-image-src');
  list[i].style.backgroundImage="url('" + src + "')";
}
</script>

</body>
person lupoll88    schedule 16.02.2019

КОД HTML

<div id="borderLoader"  data-height="230px" data-color="lightgrey" data- 
width="230px" data-image="https://fiverr- res.cloudinary.com/t_profile_thumb,q_auto,f_auto/attachments/profile/photo/a54f24b2ab6f377ea269863cbf556c12-619447411516923848661/913d6cc9-3d3c-4884-ac6e-4c2d58ee4d6a.jpg">

</div>

КОД JS

var dataValue, dataSet,key;
dataValue = document.getElementById('borderLoader');
//data set contains all the dataset that you are to style the shape;
dataSet ={ 
   "height":dataValue.dataset.height,
   "width":dataValue.dataset.width,
   "color":dataValue.dataset.color,
   "imageBg":dataValue.dataset.image
};

dataValue.style.height = dataSet.height;
dataValue.style.width = dataSet.width;
dataValue.style.background = "#f3f3f3 url("+dataSet.imageBg+") no-repeat 
center";
person Nevil Saul Blemuss    schedule 15.04.2018

Вот простой пример с использованием jQuery, мы можем поместить изображения в фоновый режим.

$('*[data-background-image]').each(function() {
    $(this).css({
        'background-image': 'url(' + $(this).data('background-image') + ')'
    });
});
div{
  height:200px;
  width:100% ;
  background-size: cover;
  background-position: center center;
  background-repeat: no-repeat;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div data-background-image="https://via.placeholder.com/500"> </div>

person whitehawk    schedule 03.05.2021
comment
Хотя этот код может ответить на вопрос, добавление некоторых объяснений того, как и почему он решает, улучшит качество вашего ответа. - person ᴄʀᴏᴢᴇᴛ; 03.05.2021