2012-01-06 41 views
10

Tôi có số này div hoạt động với ống kính để phóng to hình ảnh. Nhưng vấn đề là tôi muốn nó tròn. Tôi đang sử dụng này cho rằng:Cách tạo Div vòng tròn trong Chrome?

-webkit-border-radius:999px;-moz-border-radius:999px;border-radius:999px; 

Vấn đề là nó làm cho div tròn nhưng không che giấu các góc hình ảnh mà không phải là một phần của vòng tròn và do đó cho thấy một hình chữ nhật.

URL là: http://chokate.maninactionscript.com/chokates/

Bấm vào hình ảnh sa mạc và sau đó xem hình ảnh lớn hơn ở bên phải tác dụng zoom. Nếu bạn đặt ống kính divborder 1pxsolid red thì bạn có thể thấy rằng div thực sự là hình tròn nhưng không che giấu phần vô dụng của hình ảnh.

Bất kỳ ý tưởng nào?

+0

bạn có đặt thuộc tính 'tràn 'của div thành' hidden' không? –

+0

@BrianDriscoll, 'overflow: hidden' không hoạt động cho các góc được làm tròn trong các phần tử được định vị hoàn toàn trong chrome (hoặc các trình duyệt webkit khác). –

+1

@ techie_28, đây là một người có cùng vấn đề với bạn. Họ không trả lời, nhưng họ đã làm việc xung quanh nó: http://stackoverflow.com/questions/5736503/how-to-make-css3-rounded-corners-hide-overflow-in-chrome-opera –

Trả lời

6

Nếu bạn có một hình ảnh bên trong một phần tử có border-radius bộ, và bạn muốn ẩn "góc" của hình ảnh, bạn cần phải thiết lập border-radius vào hình ảnh để phù hợp.

Nhưng trong trường hợp của bạn sẽ không hoạt động vì hình ảnh của bạn lớn hơn nhiều so với phần tử chứa của bạn. Tốt hơn là sử dụng <div> làm ống kính và đặt background-image để phù hợp với hình ảnh của bạn.

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:

enter image description here

+0

Đây là một bản demo gọn gàng, nhưng nó chỉ hoạt động trong Chrome. Đó có phải là ý định? Nó không hoạt động đúng với tôi trong Firefox 9.0.1 ... –

+0

@JonahBishop Ooops: 'event.x'. Bây giờ nó đã được sửa. – ThinkingStiff

+0

Trình diễn tuyệt vời. Có một số tính năng nổi bật ở cạnh phải và dưới của hình ảnh, nhưng đây là một bản demo nhỏ gọn nhẹ. Công việc tốt! –

1

OK, để mua lại bản thân mình, tôi nghĩ rằng điều này có thể được khắc phục bằng chrome bằng cách lồng hình ảnh vào một div khác. Trong Chrome các góc tròn sẽ không ẩn tràn nếu div là vị trí hoàn toàn, nhưng nếu bạn đặt div không hoàn toàn vị trí và áp dụng góc tròn css cho điều đó và đặt tràn, nó sẽ hoạt động OK:

<div style='position:absolute'> 
    <div style='-webkit-border-radius:999px;-moz-border-radius:999px;border-radius:999px;overflow:hidden'> 
     <img src='' /> 
    </div> 
</div> 

Một cái gì đó tương tự ở đây: How to make CSS3 rounded corners hide overflow in Chrome/Opera

+0

bạn nên xóa các câu trả lời sai để ngăn ngừa tình trạng downvoting hơn trên chúng –

2

Thay vì có hình ảnh trong ống kính đó, hãy thử áp dụng nó làm hình nền trên vùng chứa. Hình nền có vẻ thân thiện hơn với bán kính biên giới Chrome hơn thẻ img.

1

IS biên giới được hiển thị chính xác (bạn có thể thấy điều đó bằng cách đặt nền thành màu đỏ và tắt hình ảnh) - vấn đề là hình ảnh bị xuyên thủng. Tôi nghĩ bạn cần đơn giản hóa việc triển khai của mình. Tại sao không chỉ có một div, với hình ảnh làm nền, và không có div bên trong cũng như hình ảnh. Từ mã phức tạp này, với tất cả CSS mà

<div style="position: absolute; 
    overflow-x: hidden; 
    overflow-y: hidden; 
    width: 200px; 
    height: 200px; 
    left: 971px; 
    top: 311px; 
    display: none; "> 
    <div style="position: relative; 
      border-top-left-radius: 200px 200px; 
      border-top-right-radius: 200px 200px; 
      border-bottom-right-radius: 200px 200px; 
      border-bottom-left-radius: 200px 200px; 
      left: -934px; top: 716px; "> 
      <img src="/img/rsz_desert_mid.jpg" style="width: 660px; height: 548px; "> 
    </div> 
</div> 

Để

<div id="lens" style="background-position: -513px -12px; top: 100px; left : 100px;"></div> 

với css

#lens { 
    background-image : url(....); 
    background-repeat: no-repat; 
    width : 200px; 
    height : 200px; 
    border-radius : 200px; 
    -mox-border-radius : 200px; 
    -webkit-border-radius : 200px; 
    position : absolute; 
} 

và có JS thay đổi background-position và trên/bên trái của #lens phần tử

Các vấn đề liên quan