2015-08-07 2 views
4

Я пытаюсь написать тест на работу, есть ли текст оказывается внутри <input> тот же базовый уровень в качестве метки:Как вычислить базовый уровень текста

label adjacent to input with baselines highlighted

Для того, чтобы сделать это, Я хотел бы вычислить базовый текст, который был отображен в каждом элементе, и сравнить два значения. Возможно ли это, и если да, то как это делается? Если нет, есть ли лучший способ установить, что базовый уровень двух элементов одинаковый?

Я нашел способ определения базовой линии метки, которые, кажется, надежно работают:

function getBaseline(element) { 
    var span = document.createElement("span"); 
    span.setAttribute("style", "font-size:0"); 
    span.innerText = "A"; 
    jQuery(element).prepend(span); 
    return span.getBoundingClientRect().bottom; 
} 

Однако этот метод не работает для <input>, так как я не могу вставить промежуток в этом случае ,

+0

Как большая проблема это? Так как эти вещи по умолчанию равны «vertical-align: baseline», они _do_ имеют одинаковую базовую линию, если вы не пишете какой-либо CSS, который испортится. –

+2

@MrLister проблема заключается в том, что люди _до_ писать CSS, который испортил эти вещи, поэтому я пытаюсь написать модульные тесты, которые потерпят неудачу, когда они это сделают! –

+1

[Это беспорядочно, но объясняет мое мышление] (http://jsfiddle.net/getuxnkc/). Он заменяет входной элемент диапазоном, который имеет каждое свойство CSS, скопированное из ввода. Не могли бы вы сделать что-то подобное, чтобы запустить чек? Сценарий копирования CSS [здесь] (http://stackoverflow.com/a/18108773/2930477) – misterManSam

ответ

1

Я нашел способ получить вычисленную базовую линию на основе вашей функции. Хитрость заключается в создании оболочки и применении всех стилей от элемента к ней. Я могу подтвердить, что он работает в Firefox (v38) и Chrome (v44) на OSX. К сожалению, в Safari это не работает.

DEMO

function getBaseline(element) { 
    element = jQuery(element); 
    var span = document.createElement("span"); 
    span.setAttribute("style", "font-size:0"); 
    span.innerText = "A"; 

    var wrapper = document.createElement("span"); 
    applyCSSProperties.call(wrapper, element); 
    element.wrap(wrapper); 
    element.before(span); 

    var computed = span.getBoundingClientRect().bottom; 

    span.remove(); 
    element.unwrap(wrapper); 

    return computed; 
} 

function applyCSSProperties(element) { 
    var styles = {}; 
    var comp = getComputedStyle(element[0]); 

    for(var i = 0; i < comp.length; i++){ 
     styles[comp[i]] = comp.getPropertyValue(comp[i]); 
    } 

    jQuery(this).css(styles); 
} 
+1

В итоге я пошел с подобной техникой, которая заключалась в создании отдельного диапазона и применении к нему вычисленных стилей, вместо того, чтобы обертывать ввод в промежутке. Однако общий подход тот же, поэтому спасибо. –

Смежные вопросы