I have this div
which acts a lens in zooming of the image. But the problem is that I want it circular. I am using this for that:
-webkit-border-radius:999px;-moz-border-radius:999px;border-radius:999px;
The problem is that it makes the div
circular but does not hide the image corners which are not part of the circle and hence shows a rectangle.
The URL is: http://chokate.maninactionscript.com/chokates/
Click on the desert picture and then see the bigger image on the right for zoom effect. If you give the lens div
border 1px
solid red
then you can see that the div
is actually circular but it doesn't hide the useless part of images.
Any ideas?
If you have an image inside an element that has border-radius
set, and you want to hide the "corners" of the image, you need to set border-radius
on the image to match.
But in your case that won't work because your image is much larger than your containing element. Better is to use a <div>
as the lens and set background-image
to match your image.
Demo: http://jsfiddle.net/ThinkingStiff/wQyLJ/
HTML:
<div id="image-frame">
<img id="image" src="http://thinkingstiff.com/images/matt.jpg" />
<div id="lens" ></div>
<div>
CSS:
#image-frame {
position: relative;
}
#lens {
background-repeat: no-repeat;
border-radius: 150px;
height: 150px;
position: absolute;
width: 150px;
}
Script:
document.getElementById( 'image-frame' ).addEventListener( 'mousemove', function ( event ) {
var lens = document.getElementById( 'lens' ),
image = document.getElementById( 'image' ),
radius = lens.clientWidth / 2,
imageTop = this.documentOffsetTop,
imageLeft = this.documentOffsetLeft,
zoom = 4,
lensX = ( event.pageX - radius - imageLeft ) + 'px',
lensY = ( event.pageY - radius - imageTop ) + 'px',
zoomWidth = ( image.clientWidth * zoom ) + 'px',
zoomHeight = ( image.clientHeight * zoom ) + 'px',
zoomX = -( ( ( event.pageX - imageLeft ) * zoom ) - radius ) + 'px',
zoomY = -( ( ( event.pageY - imageTop ) * zoom ) - radius ) + 'px';
if( event.pageX > imageLeft + image.clientWidth
|| event.pageX < imageLeft
|| event.pageY > imageTop + image.clientHeight
|| event.pageY < imageTop ) {
lens.style.display = 'none';
} else {
lens.style.left = lensX;
lens.style.top = lensY;
lens.style.backgroundImage = 'url(' + image.src + ')';
lens.style.backgroundSize = zoomWidth + ' ' + zoomHeight;
lens.style.backgroundPosition = zoomX + ' ' + zoomY;
lens.style.display = 'block';
};
}, false );
window.Object.defineProperty( Element.prototype, 'documentOffsetTop', {
get: function () {
return this.offsetTop + ( this.offsetParent ? this.offsetParent.documentOffsetTop : 0 );
}
} );
window.Object.defineProperty( Element.prototype, 'documentOffsetLeft', {
get: function () {
return this.offsetLeft + ( this.offsetParent ? this.offsetParent.documentOffsetLeft : 0 );
}
} );
Output:
Instead of having an image in that lens div, try applying it as a background-image on the container. Background images seem to be friendlier with Chrome border-radii than img tags.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With