Javsacript:根据图像数据创建背景渐变

问题描述 投票:0回答:2

我用引导卡制作了一个优雅的图像加载器,它在加载图像时在背景中显示渐变填充。图像加载后就会淡入。 渐变颜色是根据图像中的一些关键颜色手动创建的。

我的问题是 - 有人知道 JS 模块或类似的东西可以在图像加载到 HTML 之前读取图像的颜色数据吗?因为我想根据正在加载的图像动态创建渐变颜色。 我很确定 PHP 可以以某种方式做到这一点,但如果 JS 可以做到,那就更容易处理。我知道这是一个很遥远的事情。

您可以在下面的 codepen 链接中看到它的工作原理(手动输入渐变):

https://codepen.io/jtibbles/pen/LYydBOx

HTML:

  <div class="card" style="width: 18rem;display:inline-block;margin-right:10px;vertical-align:top;">
  <div class="card-img-container cardgradient1">
  <div class="card-img-top cardimage" data-src="https://static.wixstatic.com/media/5cd6ef_0b75bcb5a2cbf17a53e97f76659cf189.jpg/v1/fill/w_503,h_335,al_c,q_80,usm_0.66_1.00_0.01/5cd6ef_0b75bcb5a2cbf17a53e97f76659cf189.webp">    </div>
  </div>
  <div class="card-body">
  <h5 class="card-title">Card title</h5>
  <p class="card-text">This card displays a nice gradient in the image location until the image is loaded in to place. The image then fades in gracefully.</p>
  <a href="#" class="btn btn-primary" id="examplebtn">reload...</a>
  </div>
  </div>

  <div class="card" style="width: 18rem;display:inline-block;margin-right:10px;vertical-align:top;">
  <div class="card-img-container cardgradient2">
  <div class="card-img-top cardimage " data-src="https://d3iso9mq9tb10q.cloudfront.net/wysiwyg/sanfrancisco/01-city-landing/San-Francisco-Skyline-Golden-Gate-Bridge-Big-Bus-Tours-Jan-2016.jpg"></div>
  </div>
  <div class="card-body">
  <h5 class="card-title">Card title</h5>
  <p class="card-text">This card displays a nice gradient in the image location until the image is loaded in to place. The image then fades in gracefully.</p>
  </div>
</div>

CSS:

.card-img-container{
border-top-left-radius: calc(.25rem - 1px);
border-top-right-radius: calc(.25rem - 1px);
width:100%;
display:block;
height:190px;
position:relative;
}
.card-img-container .cardimage{ 
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  right:0;
  background-size:cover;
  background-position:center;
  opacity:0;
  transition:opacity 2s ease-in-out;
}
.card-img-container .cardimage.show{
  opacity:1;
}
.card-img-container .cardimage.notransition{
  transition:none;
}

.card-img-container.cardgradient1{
    background: rgb(222,200,200);
    background: linear-gradient(180deg, rgba(222,200,200,0.6) 0%, 
    rgba(162,140,120,0.6) 31%, rgba(153,201,189,0.6) 65%, rgba(153,122,72,0.6) 85%);
}

.card-img-container.cardgradient2{
  background: rgb(227,255,253);
  background: linear-gradient(175deg, rgba(227,255,253,0.6) 1%, rgba(255,234,227,0.6) 15%, rgba(199,61,27,0.6) 44%, rgba(76,106,180,0.6) 92%);
}
  

JS:

document.addEventListener("DOMContentLoaded", function(event) { 

gracefulImageLoader();

//Just for purposes of this demo
document.getElementById("examplebtn").addEventListener("click",function(){
    resetDemo();  //Just for purposes of this demo
    window.setTimeout(gracefulImageLoader,2000);
});

function gracefulImageLoader(){
  var cardimages = document.getElementsByClassName("cardimage");
  for (let i = 0; i < cardimages.length; i++) {
    let currentcardimage = cardimages[i];      
    if(currentcardimage.dataset !=""){
      let img = new Image();
      img.src = currentcardimage.dataset.src;
      img.onload = function () {
        currentcardimage.style.backgroundImage = "url('"+img.src+"')";
        currentcardimage.classList.add("show");
      }
    }  
  }  
}   

function resetDemo(){
   let cardimages = document.getElementsByClassName("cardimage");
   for (let i = 0; i < cardimages.length; i++) {
     let currentcardimage = cardimages[i];
     currentcardimage.classList.add("notransition");
     currentcardimage.classList.remove("show");
     currentcardimage.style.backgroundImage = "none";
     window.setTimeout(function()    {currentcardimage.classList.remove("notransition");},250);
    }
  }
});
twitter-bootstrap lazy-loading linear-gradients
2个回答
1
投票

嗯...有趣...有一些 js 库,例如 vibrant.jscolor-thief,但它们正在处理加载的图像(这很有意义,因为它位于前端)...

一种解决方法可能是创建一个非常低分辨率的图像,该图像将用 html 加载,然后你的 JS 将创建渐变,然后延迟加载真实图像...?

另一种解决方案可能是使用服务器端解决方案,例如 color-extractor 这是一个 php 解决方案,然后直接在 dom 元素上使用 inline-css 创建渐变


0
投票

Grade.js 将完全按照您的描述进行操作。

https://benhowdle89.github.io/grade/

© www.soinside.com 2019 - 2024. All rights reserved.