Подсказка по правому краю

Я пытаюсь выровнять часть метки для поля ввода текста по правому краю.

Здесь - пример скрипки.

<div class = "row">
  <div class = "input-field col s6">
    <input placeholder = "Placeholder" id = "first_name" type = "text" class = "validate">
    <label for = "first_name">First Name <span class = "right-align">Top Right</span></label>
  </div>
</div>

Моя цель - сделать так, чтобы текст «Верхний правый» находился в правом верхнем углу поля ввода. Я попытался добавить помощника CSS right-align, но он ничего не сделал.

Я попытался добавить style = "float: right;", который вид работ, но текст не идеально выровнен по правому краю

Подсказка по правому краю

Есть ли способ идеально выровнять это по правому краю поля ввода?

Вам необходимо отрегулировать ширину вашего label, чтобы она соответствовала его родительскому заполнению .75em с каждой стороны, например width: calc(100% - 1.5rem). С этим изменением будет работать поплавок.

Asons 04.01.2019 21:09

Вот рабочий пример этого: jsfiddle.net/mL19ybnt/23 ... просто убедитесь, что специфика правила CSS соответствует встроенному правилу (или вам нужно добавить !important, что я, кстати, не рекомендую)

Asons 04.01.2019 21:17
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
2
1 283
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

https://jsfiddle.net/mL19ybnt/15/

.right-align {
  position: absolute;
  right: 25px;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/js/materialize.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/css/materialize.min.css" rel = "stylesheet"/>


<div class = "row">
  <div class = "input-field col s6">
    <input placeholder = "Placeholder" id = "first_name" type = "text" class = "validate">
    <label for = "first_name">First Name <span class = "right-align">Top Right</span></label>
  </div>
  
  <div class = "input-field col s3">
    <input placeholder = "Placeholder" id = "first_name" type = "text" class = "validate">
    <label for = "first_name">First Name <span class = "right-align">Top Right</span></label>
  </div>
</div>

вы можете использовать position: absolute;, а затем добавить поля, чтобы правильно выровнять его например

.right-align {
  position: absolute;
  right: 25px;
}

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

Bijan 04.01.2019 20:51

25 пикселей справа, поэтому ширина метки не имеет значения /

Sam Battat 04.01.2019 20:54

Я добавил пример

Sam Battat 04.01.2019 20:55

@SamBattat, когда я запускаю ваш фрагмент кода, выдает ошибку. Возможно, теги скрипта и ссылки не нужны. хотя я не уверен.

user1579234 04.01.2019 20:55

Я также включил ссылку jsfiddle

Sam Battat 04.01.2019 23:12

Вы можете уменьшить ширину метки до 91%, так как вы используете абсолютное положение (вверху, слева), чтобы отрегулировать его местоположение и добавить поплавок прямо к диапазону

input[type=text].validate+label {
  width: 91%;
}

.right-align {
  float: right;
}

Вы можете просто добавить абсолютную позицию к классу и назначить этот класс элементу, который вы хотите выровнять по правому краю ввода. Больше ничего настраивать не нужно. .right-align { position: absolute; }

Когда я проверяю его с помощью Chrome, происходит много сумасшедшего CSS. Откуда у вас этот CSS? По какой-то причине ваш ярлык расположен на 10,5 пикселей вправо, что сбивает его с толку. Попробуйте этот CSS ...

.right-align {
  float: right;
}
label {
  left: 0 !important;
  right: 0 !important;
}
.input-field{
  padding: 0 !important;
}

Обновлено: теперь я вижу, что вы получили это от Materialize. Я не очень знаком с этим, но метка, расположенная на 10,5 пикселей вправо, а .input-field и padding-leftpadding-right заставляют диапазон смотреть слишком далеко вправо по сравнению с вводом. Вам нужно удалить эту прокладку и убедиться, что этикетка расположена с left: 0. Возможно, было бы лучше создать собственные классы для вашей метки и для диапазона в метке, но концепции, которые я здесь показал, будут работать.

Ответ принят как подходящий

Я действительно не сторонник чрезмерного использования position: absolute для решения проблем. Использование этого может вызвать проблемы с производительностью, потому что браузер должен создать новый элемент стека и отрендерить наизнанку. Тем более, что он уже в абсолютном выражении, так что теперь у вас будет 3 элемента стека, когда это действительно нужно, никто не нужен.

Меньше грязи (нет позиции, худший вариант) Исправить:

.abcd {
  float: right;
}
label {
  padding-right: 1.50rem;
}

https://jsfiddle.net/f4036zmg/

Почему это работает: метка позиционируется абсолютно, поэтому не учитывается заполнение ее контейнерного элемента (.75rem). Чтобы правильно выровнять левую сторону, у нее есть left: .75rem, что означает, что правая теперь 1.5rem справа, потому что это width: 100%. Простое заполнение метки заставит поплавок перемещаться в области, заполненной метками.

Дайте мне знать, если вы хотите, чтобы все работало без позиций, это довольно просто. (Однако похоже, что materialize.min.css делает работу за вас очень уродливым образом).


Полуочистка (без позиции, вариант ОК) Исправить:

.abcd {
  float: right;
}
input[type=text].validate+label {
  width: auto;
  right: .75rem;
}

Здесь мы переопределяем materialize.min.css (возможно, это не лучший вариант, я не знаю). Мы перезагружаем width: auto, чтобы right работал, и, как и раньше, мы должны подкладывать этот .75rem.

https://jsfiddle.net/gL7fhx2q/


Чистое исправление:

Требуются изменения HTML:

<label for = "first_name">
  <span class = "">First Name</span>
  <span class = "tar">Top Right</span>
</label>

CSS:

.input-field.col label {
  left: 0;
  padding: 0 .75rem;
  display: flex;
}
.input-field.col label > span {
  flex: 1 0 auto;
}
.tar {
  text-align: right;
}

https://jsfiddle.net/7bw2zghr/

Повторное переопределение файла materialize.min.css, однако, не должно вызывать проблем для других проектов. Верните левую часть обратно в правильное положение left:0 и добавьте отступ, как входной padding: 0 .75rem. Теперь метка правильно соответствует его братьям и сестрам. Измените отображение метки на гибкий контейнер и оберните оба текста, чтобы они были гибкими элементами. Настройте элементы на пропорциональный рост, а затем правильно установите текст гибкого элемента вправо.

Не рекомендую делать padding-right: 1.50rem;, поскольку он выталкивает метку за пределы своего родителя и может вызвать другие проблемы с рендерингом, ваш второй вариант намного лучше. Не стесняйтесь использовать мое предложение, которое я опубликовал в своих комментариях к вопросу.

Asons 04.01.2019 21:40

@LGSon calc на мой взгляд - последнее средство (как и !important). Поскольку метка абсолютно позиционирована, она не может вызывать проблем с рендерингом других элементов (если внутри родительского div нет других элементов с абсолютной позицией, о которых OP не сообщил нам).

Erik Philips 04.01.2019 21:59

Ты смеешься? .. вы серьезно имеете в виду, что вы равняете вычисление с !важный

Asons 04.01.2019 22:03

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

Asons 04.01.2019 22:04

Более того, если использовать Flexbox, все, что нужно, - это сделать label гибким контейнером и оставить автоматическое левое поле на его span. И обратите внимание, ваш образец Flexbox недействителен, label не может иметь div в качестве дочернего элемента.

Asons 04.01.2019 22:20

@LGSon calc может быть хуже, чем! Important, потому что его нужно вычислять каждый раз, и в зависимости от того, что он вычисляет (особенно EM), вызывает (незначительные) проблемы с производительностью. Таким образом, наличие 10 или 100 таких причин на самом деле вызывает реальные проблемы при рендеринге и рисовании ... !important не может этого вызвать.

Erik Philips 04.01.2019 23:55

Другие вопросы по теме