Получение элемента для вертикального выравнивания с остальной частью его линии - PullRequest
0 голосов
/ 26 марта 2020

В приведенном ниже примере я пытаюсь добавить некоторые линейные элементы входного диапазона, которые выровнены по линии, но также выровнены по правому краю внешнего элемента div. На реальном сайте html - это код, который был пропущен через prettify , поэтому это не что иное, как <span> элементы внутри элемента <pre>, поэтому пробельные символы и, в частности, перевод строки, актуальны.

В любом случае я вставляю эти <input type="range"> элементы, обернутые в 2 делителя, и пытаюсь выровнять их по содержимому в той же строке, но справа от внешнего контейнера.

На самом деле я не нашел решения. Первоначально у меня был нормальный размер шрифта, и если бы я добавил какое-то постороннее содержимое внутри .holder s, то казалось бы, что выровнялись, но в действительности, как только я увеличил размер шрифта, это показало, что они на самом деле не выравнивались.

Есть ли каким-то образом это исправить?

Я понимаю, что обычно вы можете сделать что-то подобное с таблицей (отдельный столбец для ползунков) или flexbox, но для этого потребуется синтаксический анализ всего кода, чтобы найти разрывы строк, а затем сгенерировать куча новых html.

.outer {
  position: relative;
  background: pink;
  padding: 1em;
  width: 200px;
}
.holder {
  display: inline-block;
}
.holder>div {
  position: absolute;
  display: inline-block;
  right: 0;
}
.holder input {
  position: absolute;
  display: inline-block;
  right: 1em;
}
<h1>test</h1>
<div class="outer">
  <div>
    <span>foo: </span>
    <div class="holder">&nbsp;
      <div>
        <input type="range">
      </div>
    </div>
  </div>
  <div>
    <span>bar: </span>
    <div class="holder">
      <div>
        <input type="range">
      </div>
    </div>
  </div>
</div>

Примечание. Приведенный выше код показывает проблему, но реальный код - это пробелы, чувствительные к пробелам и интервалам, которые трудно читать. Вот оно.

body {
  font-size: 35pt;
}
.outer {
  position: relative;
  background: pink;
  padding: 0.2em;
  width: 300px;
}
.holder {
  display: inline-block;
}
.holder>div {
  position: absolute;
  display: inline-block;
  right: 0;
}
.holder input {
  position: absolute;
  display: inline-block;
  right: 1em;
}
foo:  
bar: 

Как я уже говорил выше, генерируются <pre> и <span>, после чего я вставляю входы диапазона.

Еще один недостаток заключается в том, что на реальном сайте секция <pre> получает полосы прокрутки, если строка слишком длинная (как в области кода SO), но в этом случае мне все же нужны области ввода справа от видимой области ( если вы не прокручивали).

body {
  font-size: 35pt;
}
.outer {
  position: relative;
  background: pink;
  padding: 0.2em;
  width: 300px;
  overflow: auto;
}
.holder {
  display: inline-block;
}
.holder>div {
  position: absolute;
  display: inline-block;
  right: 0;
}
.holder input {
  position: absolute;
  display: inline-block;
  right: 1em;
}
longlongline:  
bar: 

Скриншот окончательного результата, вероятно, поможет.

enter image description here

Обычно ползунки встроены (не CSS, кроме display: inline-block), но если окно недостаточно широкое, ползунки будут сдвинуты выкл. Поэтому вместо этого я делаю их прозрачными и использую абсолютное позиционирование, чтобы они не отталкивались. Таким образом, вы все равно можете как читать код, так и взаимодействовать с ползунками.

Они выглядят для выравнивания банкомата, но если вы go до страницы и убедитесь, что ваше окно меньше 450px Широкий и установите размер шрифта prettyprint.pre, скажем, 15pt, тогда вы увидите, что выравнивание - это просто удача, и что они на самом деле не «выровнены», это просто определенные размеры различных вещей, которые делают их выровненными.

enter image description here

Я полностью понимаю, что они могут на самом деле не быть решением, за исключением разбора кода и разделения каждой строки в свой собственный контейнер, но если возможно, я бы нравится использовать правильный CSS (при условии, что он существует), чтобы выровнять их.

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Вы можете попробовать добавить «вертикальное выравнивание: середина»

    .outer {
        position: relative;
        background: pink;
        padding: 1em;
        width: 200px;
    }
    .outer>div{
        position: relative;
        display: inline-block;

    }
    span{
        vertical-align:middle;
    }
    .holder {
        vertical-align:middle;
        display: inline-block;
    }
    .holder>div {
        position: relative;
        display: inline-block;
        right: 0;
    }
    .holder input {
        position: relative;
        display: inline-block;

    }


<h1>test</h1>
<div class="outer">
<div>
    <span>
        foo: 
    </span>
    <div class="holder">
        <div>
            <input type="range" />
        </div>
    </div>
</div>
<div>
    <span>
        bar: 
    </span>
    <div class="holder">
    <div>
        <input type="range" />
    </div>
    </div>
</div>
</div>
0 голосов
/ 26 марта 2020
    .outer {
      background: pink;
      padding: 1em;
      width: 200px;
    }

    .holder {
      display: inline-block;
      vertical-align: middle;
    }

    .holder>div {
      display: inline-block;
    }

    .holder input {
      display: inline-block;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...