2012-04-30 33 views
31

Tôi có id accorion jquery #accordion và một số nội dung bên trong tên lớp tiêu đề .simpleColor. Bây giờ tôi muốn đưa ra một biên độ tính toán cho .simpleColor. Trong giả ... trông giống như thế này,Có thể thực hiện toán học bên trong CSS không?

.simpleClass { 
    margin-left: ((#accordion.width/2) - (.simpleColor.width/2)); 
} 

Tôi mở để sử dụng bất kỳ công nghệ nào khác như javascript để đạt được điều này nếu có thể.

+1

Có vẻ như bạn muốn căn giữa cái gì đó theo chiều ngang. Bạn đã thử 'margin: 0 auto;'? – Ryan

+5

Bạn đã nghe nói về [calc()] (http://www.w3.org/TR/css3-values/#calc0) – Musa

+0

Không bao giờ ... âm thanh có vẻ hữu ích – doNotCheckMyBlog

Trả lời

64

Có một chức năng CSS gọi calc rằng đang bắt đầu nhận được hỗ trợ khá tốt. Cú pháp làm việc như sau:

width: calc(50% - 100px); 

(Lưu ý rằng khoảng trắng xung quanh các nhà khai thác có ý nghĩa)

này cho phép hỗ trợ tính toán động đúng trong CSS. Với bộ tiền xử lý, bạn chỉ có thể kết hợp các độ dài tĩnh với độ dài tĩnh và độ dài tương đối với các độ dài tương đối.

Calc được hỗ trợ từ Chrome 19, Firefox 4 và IE9. Tính năng này không được hỗ trợ khá rộng rãi, đủ để sử dụng nó rộng rãi, nhưng nó sẽ không quá xa trong tương lai và đó là điều cần nhớ và mong đợi.

+0

Hoạt động hoàn hảo trên Chrome, Firefox và IE như bạn đã đề cập trên Win7 và 8. Cảm ơn! Bắt padding và div chiều rộng 100% là một nỗi đau và việc sử dụng javascript cho một thứ đơn giản như vậy dường như là một sự lãng phí. Thế này tốt hơn! –

+3

Bạn cũng có thể muốn xem xét ['hộp kích thước: hộp biên giới;'] (http://www.paulirish.com/2012/box-sizing-border-box-ftw/). Điều đó làm cho padding trừ đi chiều rộng thay vì thêm nó, và nó có hỗ trợ tốt hơn calc, trở lại IE8, và có một [polyfill có sẵn cho IE6/7] (https://github.com/Schepp/box-sizing- polyfill) nếu cần hỗ trợ. IE8 vẫn có một thị phần khá lớn, vì vậy tôi khuyên bạn nên sử dụng 'box-sizing' cho nhu cầu của bạn. – TimE

+0

Bạn đã đánh dấu :) nhờ –

3
jQuery('.simpleClass').css('margin-left', (jQuery('#accordian').width()/2) - (jQuery('.simpleColor').width()/2) + 'px'); 

nên làm những gì bạn đang muốn. Nhưng bạn cần phải làm một cái gì đó như thế này trong javascript, bạn không thể làm điều đó trong CSS tinh khiết trừ khi độ rộng cho #accordian và .simpleColor được biết trước (và do đó tính toán trước).

8

Không thể thực hiện các phép toán trong CSS một cách tự nhiên. Bạn có thể sử dụng JavaScript để thay đổi thuộc tính CSS khi tải trang, nhưng đây là một nỗi đau và phải được thực hiện mỗi lần tải trang làm cho trang của bạn chậm.

Bạn sẽ cần sử dụng bộ tiền xử lý CSS như LESS, Stylus hoặc SASS.

Tiền thưởng khi sử dụng một trong các ngôn ngữ này là bạn có thể tạo các bảng định kiểu CSS thực tế từ chúng. Bạn cũng nhận được lợi ích như chức năng, mixin, biến, và nhiều hơn nữa.

+1

Phát hiện, tôi đã nhận được những gì tôi cần nhưng tôi muốn chấp nhận câu trả lời của Michael như ông đã chỉ ra đầu tiên :) cảm ơn btw – doNotCheckMyBlog

1

Tôi tin rằng CSS phải là định nghĩa kiểu thuần túy. Tôi không thích kết hợp một số tính toán với điều đó. Tôi sẽ làm điều đó trong javascript tôi

var accWidth=parseInt($("#accordion").css("width").replace("px","")); 
var simpWidth=parseInt($(".simpleColor").css("width").replace("px","")); 
var marginLeft=((accWidth/2)-(simpWidth/2));  
$(".simpleClass").css("margin-left",marginLeft); 

mẫu Làm việc http://jsfiddle.net/mzTRw/19/

+1

Thay vì parseInt ($ ("# accordion"). css ("width"). "px", "")) bạn chỉ có thể sử dụng $ ("# accordion"). width() để lấy giá trị số nguyên. –

1

Xem ví dụ này .. Anh ấy đã sử dụng nhiều phép tính trong css.

http://codepen.io/schoenwaldnils/pen/DLiyr

+0

Lưu ý rằng [câu trả lời chỉ có liên kết] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích, các câu trả lời SO phải là điểm cuối của một tìm kiếm cho một giải pháp (so với một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

+0

Hey! Đó là SCSS! không phải CSS. Trình biên dịch sẽ tính toán bạn đời –

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