创建一个圆形鼠标悬停饱和效应(Creating a circular mouseover satur

2019-08-19 02:21发布

我有一个形象的两个版本:一个版本降低饱和度和全彩色版本。 我想做到的是一个悬停效果,其中鼠标放在去饱和图像显示的图像的颜色版本的一个圆。 这将是有点像去饱和图像上极高的关注,以显示其颜色。 然后当你移动鼠标了,它会褪色回其非饱和的状态。

我知道我大概可以使用闪光灯,但我想用JavaScript和CSS来做到这一点。 理想情况下,这将降低到只是一个形象,如果禁用JavaScript,并可能在宽度(响应)流体。

Answer 1:

边界半径

CSS3 border-radius可以用来创建与用作图像聚光灯背景图像的圆形刻度。 聚光灯可以在主图像的顶部重叠,且位于基于鼠标坐标。 的jsfiddle演示

虽然没有软化的CSS3聚光灯的边缘自然的方式 - 这将需要添加的不透明度梯度任意内容支持 - 它可以使用交错组随半径和降低不透明度的元素进行模拟。 更新演示与软化边缘

在更新的演示 ,大小和聚光灯的柔软性可以使用下列变量进行调整:

var spotlightDiameter = 150;      // Base size (not including the soft edge)
var numSpotlightLayers = 6;       // More layers = softer edges
var spotlightLayerThickness = 2;  // Thinner = the softening is more subtle

这里有一个修改演示在聚光灯具有明显的涟漪。 该层的厚度增加至更清楚它是如何工作表现。

下面是代码对具有锐利边缘的初始版本的简化版本。

HTML

<div class="content">
    <div class="spotlight"></div>
</div>

CSS

.content {
    position: relative;
    width: 640px;
    height: 480px;
    background: url(desaturated.jpg) no-repeat 0 0;
    overflow: hidden;
}
.spotlight {
    display: none;
    position: absolute;
    background: url(overly_saturated.jpg) no-repeat 0 0;
}

jQuery的

var spotlightDiameter = 150;

// Update the spotlight position on mousemove
$('.content').on('mousemove', function(e){
    var center = {x: e.pageX - this.offsetLeft,
                  y: e.pageY - this.offsetTop};
    var x = center.x - (spotlightDiameter >> 1);
    var y = center.y - (spotlightDiameter >> 1);

    $('.spotlight').css({left: x + 'px', top: y + 'px',
                         backgroundPosition: -x + 'px ' + -y + 'px'}).show();
});

// Hide the spotlight on mouseout
$('.content').on('mouseout', function(e){
    $('.spotlight').hide();
});

// Initialize the spotlight
$(document).ready(function(){
    $('.spotlight').width(spotlightDiameter + 'px')
                   .height(spotlightDiameter + 'px')
                   .css({borderRadius: (spotlightDiameter >> 1) + 'px'});
});

替代实现

这也可以使用HTML5画布或SVG实现。 下面是对不同的方法浏览器支持的比较:

  • border-radius :由不支持IE8或更早 。
  • HTML5画布:由不支持IE8或更早 。
  • SVG:不支持通过IE8或更早版本 ,或者是Android 2.3或更早版本 (这仍然是大多数的Android的市场份额 )。

总之,IE8和更早版本不是任何这些方法中的一个选项,如果需要支持Android,这限制了选择, border-radius和HTML5画布。 当然,由于这是基于鼠标的,机器人支撑可能不是一个因素无论如何。



Answer 2:

使用两个SVG <image>覆盖正好在彼此的顶部元件。 底部是灰度图像。 顶部是彩色图像。 套用clipPath的彩色图像,然后调整剪辑路径上的转变,揭示上图像的不同区域。

简单的演示: http://jsfiddle.net/hZgkz/

SVG:

<svg xmlns="http://www.w3.org/2000/svg" width="200px" height="250px">
  <defs>
    <image id="im" width="500" height="500"
     xlink:href="http://www.nyweamet.org/wp-content/uploads/2011/09/0942a__grandCentralStationExterior.jpg"/>
    <clipPath id="clip">
      <path id="path" transform="translate(40,60)"
            d="M60,0 A30,30 1,0,0 60,120 30,30 1,0,0, 60,0"/>
    </clipPath>
  </defs>
  <use id="clippedImage" xlink:href="#im" clip-path="url(#clip)"/>
</svg>

并围绕移动一圈的JavaScript:

var tx = document.querySelector('#path').transform.baseVal.getItem(0);
setInterval(function(){
  var ms = (new Date)*1;
  tx.matrix.e = Math.sin(ms/812)*150 + 160;
  tx.matrix.f = Math.cos(ms/437)*60 + 70;
},50); 

所有你需要做的就是跟踪鼠标移动和平移设置为正确的位置。



Answer 3:

你可以使用一些CSS来实现的结果,如果我理解正确你的要求。 我已经在这里准备了小提琴演示: http://jsfiddle.net/sandro_paganotti/k3AmZ/

下面是所涉及的代码:

HTML

<figure data-desaturated></figure>
<figure data-original></figure>

CSS

figure{ width: 550px; height: 360px;
        position: absolute; top: 0; left: 0;
        margin: 0; padding: 0; 
        background-position: 50% 50%;
        background-repeat: no-repeat;
        background-image: url('yourimage.png');

}

figure[data-desaturated]{
    /* I've used CSS filters tu simulate desaturation, you can use your already desaturated image */
    -webkit-filter: grayscale(0.9);
}

figure[data-original]{
    width: 360px;
    left: 95px;
    border-radius: 180px;
    opacity: 0;
    transition: opacity 0.4s;
}

figure[data-desaturated]:hover + figure[data-original],
figure[data-original]:hover{
    opacity: 1;
}

我还添加了一个transition ,以提高经验。

更新

跟随鼠标移动版本: http://jsfiddle.net/sandro_paganotti/k3AmZ/3/



文章来源: Creating a circular mouseover saturation effect