2013-02-28 53 views
52

Tôi có HTML sau: trung tâm theo chiều dọc xoay văn bản với CSS

<div class="outer"> 
    <div class="inner rotate">Centered?</div> 
</div> 

div.outer là một dải dọc hẹp. div.inner được xoay 90 độ. Tôi muốn văn bản "Căn giữa?" xuất hiện tập trung vào div vùng chứa của nó. Tôi không biết kích thước của cả hai div trước.

Điều này đến gần: http://jsfiddle.net/CCMyf/2/. Bạn có thể thấy từ jsfiddle rằng văn bản được căn giữa theo chiều dọc trước khi áp dụng kiểu transform: rotate(-90deg), nhưng phần nào được bù đắp sau. Điều này đặc biệt đáng chú ý khi div.outer ngắn.

Có thể căn giữa văn bản này theo chiều dọc mà không biết bất kỳ kích thước nào trước không? Tôi chưa tìm thấy bất kỳ giá trị nào của transform-origin giải quyết vấn đề này.

+0

Bạn có phản đối thiết lập 'display: table' trên các yếu tố? Bởi vì cách 'chuẩn' để sắp xếp dọc các div động nên làm việc với biến đổi mà không có vấn đề: http://stackoverflow.com/a/6182661/188221 – DigTheDoug

+0

Tôi không phản đối '' 'display: table'''. Fiddle này cho thấy rằng giải pháp bảng có cùng các vấn đề như ở trên: http://jsfiddle.net/4d384/ – danvk

+0

Thử đặt lớp 'rotate' vào phần tử ở giữa. Điều đó nên làm điều đó, nhưng có vẻ như nó làm hỏng chiều rộng của vật phẩm. Có thể phải chơi xung quanh với phần đệm hoặc chiều rộng hoặc chiều cao đạo cụ, nhưng nó phải là do-thể: http://jsfiddle.net/digthedoug/jWYuq/ – DigTheDoug

Trả lời

89

Điều quan trọng là để thiết lập vị trí hàng đầu và rời khỏi đến 50% và sau đó transformX và transformY đến -50%.

.inner { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
} 

.rotate { 
    transform: translateX(-50%) translateY(-50%) rotate(-90deg); 
} 

see: http://jsfiddle.net/CCMyf/79/

+4

Đây là một trong những giải pháp tốt nhất mà tôi đã thấy. Thx – grayson

+2

Đêm khuya, tôi không biết tại sao nó lại hoạt động, nhưng thời điểm tôi nhấn ctrl-R ... hiếm khi tôi nhận được những khoảnh khắc "nó chỉ hoạt động". Hàm của tôi giảm xuống không có nghĩa bóng! – TotoTitus

+1

Làm việc với các phần tử văn bản thay vì div tôi đã phải thêm 'margin: 0' vào phần tử bên trong để làm cho trung tâm văn bản hoàn hảo. – kapser

2

Bạn có thể thêm margin: 0 auto; vào lớp "xoay" để căn giữa văn bản hay không.

.rotate { 
    -webkit-transform: rotate(-90deg); 
    -ff-transform: rotate(-90deg); 
    transform: rotate(-90deg); 
    width: 16px; /* transform: rotate() does not rotate the bounding box. */ 
    margin: 0 auto; 
} 
+0

Điều này không hoạt động. Đây là fiddle được cập nhật với "margin: 0 auto": http://jsfiddle.net/CCMyf/3/. Bạn có thể thấy rằng "?" trong "Định tâm?" là gần gũi hơn với đầu hơn "C" là dưới cùng. – danvk

0

Xóa: margin-top: -7px; từ .inner làm văn bản xoay theo chiều dọc làm trung tâm cho tôi. Nó cũng làm cho văn bản nằm ngang không được căn giữa.

Chỉ cần xóa mã ở trên?

+0

Điều này có thể làm cho nó gần gũi hơn để được tập trung, nhưng nó vẫn không đúng trung tâm. Bạn có thể thấy điều này rõ ràng trong phiên bản này của fiddle: http://jsfiddle.net/CCMyf/4/ – danvk

0

Bạn có thể thêm này:

$('.inner').css('margin-top', $(this).parent().height() - 2*$(this).height()); 

Để chức năng .on('change') của bạn, như bạn thấy ở đây: http://jsfiddle.net/darkajax/hVhbp/

+0

Tác phẩm này, mặc dù tôi rất thích một giải pháp CSS nếu có thể. – danvk

+0

bạn có tìm thấy giải pháp CSS không? – Crashalot

5

Nó có thể là hơi muộn để trả lời câu hỏi đó, nhưng tôi vấp vào cùng một vấn đề và tìm thấy một số cách để đạt được nó, bằng cách thêm một div khác trong cách.

<div class="outer"> 
    <div class='middle'><span class="inner rotate">Centered?</span></div> 
</div> 

và áp dụng một text-align: center vào đó yếu tố trung, cùng với một số công cụ định vị:

.middle { 
    margin-left: -200px; 
    width: 400px; 
    text-align: center; 
    position: relative; 
    left: 7px; 
    top: 50%; 
    line-height: 37px; 
} 

Các .inner cũng được một display: inline-block; để cho phép cả hai rotatetext-align tài sản.

Đây là fiddle tương ứng: http://jsfiddle.net/CCMyf/47/

2

Câu trả lời từ 'bjnsn' là tốt nhưng không hoàn hảo như nó không thành công khi văn bản chứa không gian trong đó. Ví dụ: anh ấy đã sử dụng 'Căn giữa?' dưới dạng văn bản nhưng nếu chúng tôi thay đổi văn bản để giả sử 'Căn giữa? hoặc không 'sau đó nó sẽ không hoạt động tốt và sẽ có dòng tiếp theo sau không gian. Ther không phải là chiều rộng hoặc chiều cao được xác định cho khối div bên trong.

.inner { 
    font-size: 13px; 
    font-color: #878787; 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    background: #DDD; 
} 

https://jsfiddle.net/touqeer_shakeel/f1gfy1yy/ Nhưng chúng ta có thể làm cho toàn bộ văn bản class trung đúng cách, bằng cách thiết lập chiều rộng div bên trong bằng chiều cao của div bên ngoài, line-height của nội div tương đương với chiều rộng của bên ngoài thiết lập div và thuộc tính flex hiển thị cho div bên trong với các mục thẳng hàng: center và justify-content: các thuộc tính trung tâm.

.inner { 
    font-size: 13px; 
    font-color: #878787; 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    display: flex; 
    justify-content:center; 
    align-items:center; 
    line-height:40px; 
} 
$('#height').on('change', function(e) { 
    $('.outer').css('height', $('#height').val() + 'px'); 
    $('.inner').css('width', $('#height').val() + 'px'); 
}); 

cập nhật fiddle https://jsfiddle.net/touqeer_shakeel/cjL21of5/

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