2012-04-20 39 views
6

Tôi hy vọng có thể tìm thấy chiều cao của baseline của một đoạn văn bản trong div bằng javascript.Làm thế nào tôi có thể nhận được chiều cao của đường cơ sở của một phông chữ nhất định?

Tôi không thể sử dụng phông chữ được xác định trước vì nhiều người dùng của tôi sẽ sử dụng cài đặt phông chữ lớn hơn trong trình duyệt của họ.

Tôi có thể làm điều này bằng javascript như thế nào?

Trả lời

11

Tôi đã tạo một plugin jQuery nhỏ cho điều đó. Nguyên tắc rất đơn giản:

Trong vùng chứa, chèn 2 phần tử nội tuyến có cùng nội dung nhưng một phần rất nhỏ theo kiểu . và khác rất lớn A. Sau đó, kể từ khi có vertical-align:baseline theo mặc định, các cơ sở được đưa ra như sau:

 ^+----+^
     | | +-+| | top 
height | |.|A|| v 
     | | +-+| 
     v +----+ 

======================= 
baseline = top/height 
======================= 

Đây là plugin trong coffeescript (JS here):

$ = @jQuery ? require 'jQuery' 

detectBaseline = (el = 'body') -> 
    $container = $('<div style="visibility:hidden;"/>') 
    $smallA = $('<span style="font-size:0;">A</span>') 
    $bigA  = $('<span style="font-size:999px;">A</span>') 

    $container 
    .append($smallA).append($bigA) 
    .appendTo(el); 
    setTimeout (-> $container.remove()), 10 

    $smallA.position().top/$bigA.height() 

$.fn.baseline = -> 
    detectBaseline(@get(0)) 

sau đó, hút thuốc nó với:

$('body').baseline() 
// or whatever selector: 
$('#foo').baseline() 

-

Hãy dùng thử t: http://bl.ocks.org/3157389

+0

Điều này thật tuyệt! Cảm ơn nhiều! – EPLKleijntjens

+0

Một giải pháp thay thế hoàn chỉnh hơn có thể sử dụng http://pomax.nihongoresources.com/pages/Font.js/ - chưa thử nhưng có vẻ tuyệt vời. – abernier

+1

Xin chào @abernier. Tôi đã thử mã của bạn và khi tôi chạy nó tôi nhận được số 1.1108247422680413 cho đường cơ sở trên những gì tôi giả định là phông chữ mặc định cho trang web của tôi. Bạn có thể cho tôi biết con số đó có nghĩa là gì không? Tôi đã làm việc ra khỏi đường cơ sở bằng mắt và tôi không thể thấy số lượng tôi nhận được từ phương pháp của bạn liên quan đến nó như thế nào. Cảm ơn trước. –

4

Sau khi phát hiện bởi Alan Stearns (http://blogs.adobe.com/webplatform/2014/08/13/one-weird-trick-to-baseline-align-text/) mà inline-block yếu tố thay đổi căn chỉnh ban đầu của các yếu tố nội tuyến khác, tôi đặt lại với nhau một bản demo mà tôi tìm thấy chính xác hơn https://stackoverflow.com/a/11615439/67190, và thực sự đơn giản hơn để lấy được một giá trị trong JavaScript: http://codepen.io/georgecrawford/pen/gbaJWJ. Hy vọng nó hữu ích.

<div> 
    <span class="letter">T</span> 
    <span class="strut"></span> 
<div> 
div { 
    width: 100px; 
    height: 100px; 
    border: thin black solid; 
} 
.letter { 
    font-size: 100px; 
    line-height: 0px; 
    background-color: #9BBCE3; 
} 
.strut { 
    display: inline-block; 
    height: 100px; 
} 
+0

than ôi, giải pháp của bạn dường như không làm việc trên firefox 37 – jedierikb

+0

Điều này có thể hữu ích: https://github.com/georgecrawford/font-baseline –

+0

Hi @George Crawford. Cảm ơn bạn đã viết mã và demo. Có tài liệu/bản vẽ nào giải thích những giá trị khác nhau mà phương thức của bạn có liên quan đến không? Các phông chữ và các lineheight là hiển nhiên. Từ nghiên cứu bản demo của bạn tôi * nghĩ * đường cơ sở là kích thước decender và nội dung là tổng kích thước của các font chữ, ví dụ: decender + chiều cao nắp + Ascender, nhưng tôi có thể là sai. Một bảng hay hình ảnh đẹp sẽ hữu ích. –

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