HTML 데이터 속성을 사용하여 CSS 배경 이미지 URL 설정


83

저는 친구를위한 사용자 지정 사진 갤러리를 만들 계획이며 HTML을 어떻게 제작할지 정확히 알고 있지만 CSS에 작은 문제가 있습니다.
(가능한 경우 페이지 스타일링이 jQuery에 의존하지 않는 것을 선호합니다)


내 질문은 : CSS의
Data-AttributeHTML
Background-image
내 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(들) background-image내 CSS 파일의 소스.

다음은 내가 찾고있는 동적 예제를 얻기위한 Codepen Pen입니다.
http://codepen.io/thestevekelzer/pen/rEDJv

답변:


66

결국 사용할 수 있습니다

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

그러나 그것은 아직 내가 아는 한 어디에도 구현되지 않았습니다. 위의 url는에 대한 선택적 "유형 또는 단위"매개 변수 attr()입니다. https://drafts.csswg.org/css-values/#attr-notation을 참조 하십시오 .


4
결국 이라고 말할 때 W3 사이트에서 대략적으로 언제 올 것인지 알 수있는 방법이 있습니까?
StephenKelzer 2014 년

5
특정 구현 상태에 대해 알지 못하는 무작위 추측은 모든 브라우저 트랙에서 사용할 수 있기까지 1-2 년입니다.

5
@torazaburo 1 년 차는 끝났지 만 여전히 희망이 가득합니다.
Clemens Himmer

3
2016 년 크롬 로드맵에 없음 :( # 246571
Felipe

3
caniuse.com/#feat=css3-attr 현재까지이 기능을 구현 한 브라우저는 없습니다.
saawsann

18

HTML과 CSS로만 유지하고 싶다면 CSS 변수를 사용할 수 있습니다. IE 에서는 CSS 변수가 지원되지 않습니다 .

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

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


3
이것은 아마도 현재 가장 좋은 대답 일 것입니다. 항상 좋은 자바 스크립트는 없습니다.
Abdalla Arbab 19 년

+1. 여러 해상도에 대해 여러 이미지 경로를 선언 한 다음 CSS 코드에서 어떤 해상도에 대해로드 할 이미지를 결정할 수 있기 때문에 아래의 다른 답변 에서처럼 이미지를 직접 인라인으로 추가하는 것보다 더 유연한 솔루션입니다.
Sumit

16

콘텐츠와 스타일을 혼합하는 것은 모범 사례가 아니지만 해결책은 다음과 같습니다.

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

6

이를 위해서는 약간의 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>페이지가로드되면 당신이 전화하는 기능에 태그 또는 포장.


2

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의 모든 데이터 속성을 반복하고 선택합니다. 그런 다음 반복기 변수를 가져 와서 파일 이름과 일치하도록합니다.

어쨌든, 내가 말했듯이 모든 값을 나열한 다음 파일 이름이 목록의 값을 포함하는지 확인해야합니다.


1
이를 위해서는 스타일 선언에 알려진 값 목록이 있어야합니다. 내가이 질문을했을 때, 나는 다른 방식 대신에 스타일이 표시되는 것을 마크 업으로 유도하려고했습니다.
StephenKelzer

1
예, 응회암입니다. 죄송합니다!
CodeFinity 2010

이것은 비슷한 문제를 해결하는 데 도움이되었으며 존재하는지 몰랐던 Sass 기능도 보여주었습니다. 환호합니다!
MadSkunk 19

1

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로도이 작업을 수행 할 수 있습니다.


2
시겠습니까 if (attr) {당신은 곤경에 얻을? false와 undefined는 모두 허위 값이기 때문에 엄격한 typeof 및 false 검사에서 요점을 보지 못했습니다.
Thijs Koerselman 2017

1

나처럼 멍청한 대답을 원하는 사람들을 위해

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>

0

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";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.