Как расположить строку текста на основе конкретной буквы? - PullRequest
0 голосов
/ 11 марта 2012

У меня есть следующая строка текста:

->A B C D E F G H I J                   <-

Я хочу расположить строку текста, используя CSS так, чтобы буква D находилась в центре страницы, как показано ниже:

->             A B C D E F G H I J      <-

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 11 марта 2012

Если вы используете моноширинный шрифт , тогда вы можете использовать position:relative; и перемещать строку текста, поскольку каждая буква и пробел имеют одинаковый размер ( demo ) , Вы можете получить аналогичный результат для шрифтов без фиксированной ширины, но смещение (left:;) вычислить немного сложнее, так как почти каждая буква занимает другой объем горизонтального пространства.

<nav class="letter monospace">
    <div>A B C D E F G H I J</div> <!-- monospaced font demo -->
</nav>
<nav class="letter">
    <div>A B C D E F G H I J</div> <!-- standard browser font demo -->
</nav>
<div id="leftmiddle"> </div>
<div id="rightmiddle"> </div>
nav.letter{
    font-size:2em;
    text-align:center;
}
nav.letter > div{ /* standard browser font */
    position:relative;
    left:1.05em; /* you have to calculate the horizontal shift yourself based on the font you're using */
}
nav.letter.monospace{
    font-family:monospace;
}
nav.letter.monospace > div{ /* monospaced font */
    position:relative;
    left:1.75em; /* to center the row around 'E' change to 0.75em, for C to 2.75em... */
}

nav ~ div{
    width:49%;
    min-height:200px;
    height: 80%;    
}
#leftmiddle{ float:left;    border-right:1px solid;}
#rightmiddle{    float:right;    border-left:1px solid;}

Демонстрация HTML4, работа в IE7-9, FF10, Opera, Chrome .

ОБНОВЛЕНИЕ : см. Эту альтернативу demo (работает в IE7-9, FF10, Opera, Chrome):

<div class="letter">
    <div class="wrapper">
        <div class="before">
            A B C
        </div>
        D       
        <div class="after">
            E F G H I J
        </div>
    </div>
</div>
.letter{
    text-align:center;
    overflow:hidden;
}
.letter > .wrapper{
    width:1em;
    margin:auto;
    position:relative;
}
.letter > .wrapper > .before{
    position:absolute;
    right:125%;
    text-align:right;
    width:10em;
}
.letter > .wrapper > .after{
    position:absolute;
    text-align:left;
    top:0;
    left:125%;
    width:20em;
}
1 голос
/ 11 марта 2012

Это опубликовано по двум простым причинам:

  1. Я прокомментировал и сказал, что вам нужно использовать JavaScript, и
  2. Иногда я просто не могупомогите себе ...

Тем не менее, вот простое решение JavaScript, которое не требует какой-либо библиотеки.Это несколько громоздко, и я чувствую, что должны быть способы, которыми это можно упростить, однако:

// helper function, to save typing later on.
function gEBTN(tag, parent, index) {
    if (!parent && !index) {
        return document.getElementsByTagName(tag);
    }
    else if (parent && !index) {
        return parent.getElementsByTagName(tag);
    }
    else if (index) {
        return parent.getElementsByTagName(tag)[index];
    }
}

// helper function, to save typing later on.
function gCS(elem, parent, prop) {
    if (!prop && parent) {
        return window.getComputedStyle(elem.parentNode, null).getPropertyValue('width');
    }
    else if (prop && parent == true) {
        return window.getComputedStyle(elem.parentNode, null).getPropertyValue(prop);
    }
    else if (!parent && !prop) {
        return window.getComputedStyle(elem, null).getPropertyValue('width');
    }
    else {
        return window.getComputedStyle(elem, null).getPropertyValue(prop);
    }
}

// page: number.
// navElemId: a quoted string, the Id of the element containing
//            the navigation elements, defaults to 'navigation'
// container: a quoted string, the type of element ('div','span','li'...)
//            that forms the navigation 'buttons.' Defaults to 'li.'
function centreNavigationOn(page, navElemId, container) {
    if (!page) { // at minimum you have to supply the page you want to centre on
        return false;
    }
    else {
        var navElemId = navElemId || 'navigation';
        var navElem = document.getElementById(navElemId);
        var containers = gEBTN(container) || gEBTN('li', navElem);
        for (var i = 0, len = containers.length; i < len; i++) {
            if (containers[i].innerHTML == page) {
                var centreOn = containers[i];
            }
            else {
                // just for an easy visual difference between the centred/current
                // page and the others. Adjust/remove according to taste
                containers[i].style.opacity = '0.3';
            }
        }
        if (!centreOn){
            // if no page is found to be centred on, quits
            console.log('No element found to centre on. Quitting now.');
            return false;
        }

        // again, just for simple visual difference between current and others...
        centreOn.style.backgroundColor = '#f90';
        centreOn.style.opacity = '1';

        // finds the width of the centreOn element
        var cOnWidth = parseInt(gCS(centreOn),10);
        var cOnLeftOffset = centreOn.offsetLeft;

        // the centreOn element's parent's parent's width
        // this made sense when I wrote it, now...I'm not so sure... =/
        cPPWidth = parseInt(gCS(centreOn.parentNode.parentNode),10);

        // works out by what distance the centreOn element's parent
        // must be moved in order to centre the centreOn element within the page.
        var moveBy = Math.round((cPPWidth/2) - (cOnLeftOffset + (cOnWidth/2)));
        centreOn.parentNode.style.marginLeft = moveBy + 'px';
    }
};

centreNavigationOn(4, 'navigation', 'li');​

Демонстрация JS Fiddle .

Примечания: эта функция не будет работать в тех браузерах, таких как IE, которые не имеют реализации window.getComputedStyle().Это, вероятно, гарантирует, что, как бы ни было интересно, этот скрипт вряд ли будет использоваться.За исключением, возможно, в измененной форме (я, конечно, свободно даю этот сценарий любому, кто захочет его использовать, выпуская его даже за пределами CC-By-SA лицензии Stack Overflow, так как я думаю я могу ...).Хотя, если кто-то и изменит его, я буду искренне признателен за ссылку на измененную версию, либо в комментариях, либо путем редактирования этого ответа для добавления ссылок ...

Ссылки:

1 голос
/ 11 марта 2012

Как отметил @DavidThomas, JavaScript необходим. Я просто хотел немного рассказать об этом.

CSS не может достичь этого по нескольким основным причинам:

  1. Нет способа узнать, как изменить строку текста, о которой идет речь, чтобы D центрировался до тех пор, пока не будет установлен поток документов . Но применение CSS занимает центральное место в документообороте, поэтому во время применения CSS он не может знать, каким будет окончательный, итоговый документ. Другими словами, у нас был бы улов 22, если бы CSS мог использоваться для этого. Чтобы «знать», как расположить эту строку текста, CSS страницы уже должен знать, как будет выглядеть окончательный документ. Но чтобы получить окончательный документ, сначала нужно применить CSS.
  2. Даже если 1 и 2 не соответствуют действительности, CSS все равно не может проанализировать страницу, определить положение элементов и т. Д. Это просто не является его целью.

Напротив, JavaScript может использоваться для решения этой проблемы, потому что:

  1. В отличие от CSS, JavaScript может выполнять свою работу после установления потока документов.
  2. JavaScript имеет необходимые инструменты для анализа страницы, чтобы он мог внести необходимые изменения.

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

1 голос
/ 11 марта 2012

Может быть, использовать что-то вроде

<div id="container" style="position: absolute; width:1000px; height:10px">
    <div id="innerContainer" style="position: absolute">
        <span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span>
    </div>
</div>

, а затем что-то вроде следующего в JQuery в $ (document) .ready () {}

var left_pad = 20; // set this to container width / 2
                   // calculate it or hard code it
$("#innerContainer").css("left"),$((left_pad - span:contains('D').position().left) + 'px')

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

...