有没有办法在悬停时只为部分图像着色?

时间:2015-01-09 16:01:37

标签: javascript html css css3 css-shapes

我很乐意在HTML,CSS和jQuery中编写简单的图像绘画。

让我说我有一张原始图片,我想让它变成彩色但只是部分悬停(或10x10像素的方形或光标所在的图像圈)。

我应用了一些过滤器使其使用CSS进行灰度化,但我不知道如何着色只悬停部分(不是整个图片)。

最佳结果的示例图像(保持彩色建议会很好,但不一定)。

enter image description here

4 个答案:

答案 0 :(得分:6)

您可以使用svg的{​​{1}}和mask来执行此操作。

CodePen

filter
var img = document.getElementById('img');
img.addEventListener('mousemove', function(e) {
  document.getElementById('c').setAttribute('cx', e.clientX - img.getBoundingClientRect().left);
  document.getElementById('c').setAttribute('cy', e.clientY - img.getBoundingClientRect().top);
})


您还可以使用<svg id="img" width="600" height="300" viewBox="0 0 600 300"> <defs> <filter id="f" filterUnits="userSpaceOnUse"> <feColorMatrix type="saturate" values="0" /> </filter> <mask id="m" maskUnits="userSpaceOnUse" x="0" y="0" width="600" height="300"> <circle id="c" cx="-40" cy="-40" r="40" fill="white" /> </mask> </defs> <image filter="url(#f)" width="600" height="300" xlink:href="http://www.lorempixel.com/600/300" /> <image mask="url(#m)" width="600" height="300" xlink:href="http://www.lorempixel.com/600/300" /> </svg>在圆圈边缘进行平滑过渡。

CodePen

enter image description here

radialGradient
var img = document.getElementById('img');
img.addEventListener('mousemove', function(e) {
  var x = e.clientX - img.getBoundingClientRect().left;
  var y = e.clientY - img.getBoundingClientRect().top;
  document.getElementById('r').setAttribute('fx', x);
  document.getElementById('r').setAttribute('fy', y);
  document.getElementById('r').setAttribute('cx', x);
  document.getElementById('r').setAttribute('cy', y);
});

答案 1 :(得分:2)

您可以将图像包装在HTML Element中,并使用box-shadow

添加div元素元素

$("figure").on('mousemove', function(e){
    $('.shadow').css({
       left: e.pageX - $(this).offset().left - 40,
       top: e.pageY - $(this).offset().top -40
    });
});
figure{
    position: relative;
    margin: 20px auto;
    width: 480px;
    height: 480px;
    overflow: hidden
}
figure:hover .shadow{
    opacity: 1
}
img{
    width: 100%
}

.shadow{
    position: absolute;
    left: 80px;
    top: 60px;
    z-index: 1;
    background: transparent;
    width: 100px;
    height: 100px;
    opacity: 0;
    transition: opacity .3s ease;
    border-radius: 50%;
    box-shadow: 0 0 0 60em rgba(0,0,0,.5)
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<figure>
    <img src=http://i.imgur.com/orn8Dgf.jpg />
    <div  class=shadow></div>
</figure>

答案 2 :(得分:1)

我建议避免使用CSS过滤器,因为IE根本不支持它,并且它看起来也不在管道中。

我也更喜欢在photoshop中对我的图像进行灰度图像处理,以便更好地控制色彩平衡和对比度。 (但我也是设计师)。

相反,我要在灰度图像上叠加一个全彩色图像,修复彩色背景图像的位置,并用jQuery移动顶部div的位置:

HTML

<div class="greykitty">
  <div class="colorfulkitty" style="top: 150px; left: 280px;">
  </div>
</div>

SCSS with normalize.css

body{
  background-color:whitesmoke;
}

div{
  height: 400px;
  width: 600px;
  background-repeat: no-repeat;
}


.greykitty{
  background-image: url("http://lorempixel.com/g/600/400/cats/10/");
}

.colorfulkitty{
    background-image: url("http://lorempixel.com/600/400/cats/10/");
  $circlesize: 150px;
  height:  $circlesize;
  width:  $circlesize;
  border-radius:   $circlesize;
  background-attachment: fixed;
  position: absolute;

}

JS with jQuery

$('.greykitty').mousemove(function (colorize) {
    var X = colorize.clientX;
    var Y = colorize.clientY;
    $('.colorfulkitty').css("top", (Y - 75) + 'px');
    $('.colorfulkitty').css("left", (X - 75) + 'px');
});

我的代码:http://codepen.io/fontophilic/pen/XJpVje/

答案 3 :(得分:0)

基于this,我有解决问题的方法:

  • 使用标记叠加图像

    <div class="container">`
        <div class="bg-image"></div>
        <div class="highlight-region"></div>
    </div>
    
  • 标记上的灰度而不是图像的容器

     .container .bg-image { 
           opacity:0.3;
        -moz-filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
             -o-filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
             -webkit-filter: grayscale(100%);
             filter: gray;
             filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
        height:455px;
        width:606px;
    }
    
  • 在高亮区域

    上设置opacity = 0
    .container div.highlight-region {
        height:150px; 
        width:150px;
        border-radius: 50%;
        opacity:0;
    }
    

演示可以在这里看到:http://jsfiddle.net/MT4T7/438/