2011-04-29 28 views
28

Tôi đang chiến đấu chống lại sự kỳ quặc (tôi nghĩ) của thuộc tính offsetWidth.
đây là kịch bản:Lấy chiều rộng/chiều cao của phần tử có tỷ lệ css3

Tôi đã có, chúng ta hãy nói, một thẻ khoảng, trong js của tôi, tại một thời điểm nào đó tôi thực hiện một css3 chuyển đến yếu tố này, như:

 el.set('styles', { 
      'transform':'scale('+scale+', '+scale+')',  /* As things would be in a normal world */ 
      '-ms-transform':'scale('+scale+', '+scale+')',  /* IE 9 */ 
      '-moz-transform':'scale('+scale+', '+scale+')',   /* Moz */ 
      '-webkit-transform':'scale('+scale+', '+scale+')', /* Safari/Chrome */ 
      '-o-transform':'scale('+scale+')'  /* Oprah Winfrey */ 
     }); 
     w = el.getWidth(); 
     console.log('after scaling: ' + w); 

tại thời điểm này nhật ký trả lại cho tôi các giá trị mờ, như nó không biết phải nói gì.
bất kỳ đề xuất nào?

+0

giá trị mờ? Bạn có thể giải thích thêm một chút nữa không? –

+0

@Blowski, chắc chắn m8, miễn là tôi đặt mã ở trên trong vòng lặp lặp lại 100 lần, mỗi khi mã truy cập console.log tôi nhận được cùng một giá trị (tức là tập hợp 'lorem ipsum sit dolor' được chia tỷ lệ 10 , luôn trả về giá trị ban đầu: 272px, do đó, theo nhật ký, quy mô không ảnh hưởng đến kích thước, ngay cả khi cụm từ trên màn hình được * lớn *) – holographix

+0

@holographix Bạn có thể đăng 'getWidth() không 'chức năng bạn đang sử dụng là tốt. Và bạn đang kiểm tra (những) trình duyệt nào? –

Trả lời

33

getBoundingClientRect() trả lại giá trị chính xác cho tôi.

jsFiddle.

+0

Điều này thật tuyệt vời !!! đây là câu trả lời đúng. bạn là vua. – vsync

+0

Tính năng này hoạt động với tôi trong Chrome, nhưng từ [spec] (http://www.w3.org/TR/css3-transforms/#transform-rendering) nó có vẻ không giống như: "Lưu ý: Chuyển đổi Điều này cũng có nghĩa là các biến đổi không ảnh hưởng đến kết quả của phần mở rộng giao diện phần tử getClientRects() và getBoundingClientRect(), được chỉ định trong [CSSOM-VIEW]. " –

+0

@JakeCobb Đó là khá kỳ quặc, có vẻ như không có nhà cung cấp nào lắng nghe thông số đó :) – alex

4

Biến đổi không ảnh hưởng đến các thuộc tính CSS nội tại, vì vậy bạn đang thấy hành vi đúng. Bạn cần phải nhìn vào ma trận chuyển đổi hiện tại - như được trả về từ getComputedStyle(). WebkitTransform để tìm hiểu xem một cái gì đó lớn đã được thu nhỏ như thế nào.

Cập nhật: Trong Firefox 12 và sau đó và Chrome/Safari - như Alex nói dưới đây, bạn có thể sử dụng getBoundingClientRect() để đưa vào tài khoản bất kỳ biến đổi áp dụng cho một yếu tố

Việc chuyển đổi quy mô bắt đầu từ 50%/50 % vì đó là hành vi chính xác mặc định của &. Nếu bạn muốn nó bắt đầu từ nguồn gốc, thì bạn cần phải thiết lập biến đổi nguồn gốc: 0% 0%;

+0

Tôi đã thử với window.getComputedStyle (el) .getWidth() nhưng nó vẫn cho tôi kết quả tương tự, bạn nghĩ rằng tôi nên lấy một tham số khác? – holographix

+0

ok, tôi đã trích xuất ma trận chuyển đổi, nhưng điều duy nhất cho tôi biết, đó là điều tôi đã biết: 'ma trận (1.18577, 0, 0, 1.18577, 0px, 0px)' dữ liệu này vô dụng đối với tôi, bởi vì tôi đã biết tỷ lệ tỷ lệ tôi đã áp dụng cho phần tử; Tôi muốn có kích thước mới của đối tượng được chia tỷ lệ của tôi – holographix

+0

Nếu bạn chỉ cần biết tọa độ ('offsetLeft',' offsetTop'), việc thiết lập nguồn gốc biến đổi sang góc trên bên trái ('0% 0%') sẽ hoạt động hoàn hảo – aross

0

Tôi lấy thẻ span có display:block? biến đổi chỉ được sử dụng cho các phần tử khối. Khi tôi goto console và jquery tải (chỉ để dễ) và làm như sau:

$('span#foo').css({"-webkit-transform": "scale(2.0, 2.0)"})

có gì xảy ra. Nhưng nếu tôi làm điều này:

$('span#foo').css('display','block').css({"-webkit-transform": "scale(2.0, 2.0)"})

đột nhiên nó thay đổi, và offsetHeight tăng. Thật không may, các hight bù đi từ 16-19, và không đến 32 (mặc dù hình ảnh trực quan là gấp đôi kích thước và có thể nó là chính xác) - nhưng ít nhất nó xuất hiện để làm việc như quảng cáo.

+0

Có, các biến đổi không được hỗ trợ trên các phần tử được hiển thị nội tuyến trong webkit - mặc dù thông số kỹ thuật rõ ràng cho biết rằng chúng phải là. –

+0

điều đó thật tuyệt, 'mặc dù tôi chỉ đọc ngày khác cách biến đổi được cho là chỉ ảnh hưởng đến các yếu tố khối: P dường như là một thay đổi gần đây ít nhất. một trong hai cách, điểm vẫn là: biến đổi có hiệu lực thuộc tính HTMLElement, rõ ràng là offsetHeight và offsetWidth –

-1

getBoundingClientRect() không hoạt động đối với tôi (trong Chrome 49).

Câu trả lời này dẫn tôi đến một giải pháp cho vấn đề của tôi: https://stackoverflow.com/a/7894886/1699320

function getStyleProp(elem, prop){ 
    if(window.getComputedStyle) 
     return window.getComputedStyle(elem, null).getPropertyValue(prop); 
    else if(elem.currentStyle) return elem.currentStyle[prop]; //IE 
} 
getStyleProp(element, 'zoom') //gives zoom factor to use in calculations 
Các vấn đề liên quan