Я пытаюсь выровнять часть метки для поля ввода текста по правому краю.
Здесь - пример скрипки.
<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;", который вид работ, но текст не идеально выровнен по правому краю
Есть ли способ идеально выровнять это по правому краю поля ввода?
Вот рабочий пример этого: jsfiddle.net/mL19ybnt/23 ... просто убедитесь, что специфика правила CSS соответствует встроенному правилу (или вам нужно добавить !important, что я, кстати, не рекомендую)

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 пикселей может быть достаточно для некоторых, но может быть слишком много для других. Я искал решение, которое всегда будет выравнивать его по правому краю
25 пикселей справа, поэтому ширина метки не имеет значения /
Я добавил пример
@SamBattat, когда я запускаю ваш фрагмент кода, выдает ошибку. Возможно, теги скрипта и ссылки не нужны. хотя я не уверен.
Я также включил ссылку jsfiddle
Вы можете уменьшить ширину метки до 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;, поскольку он выталкивает метку за пределы своего родителя и может вызвать другие проблемы с рендерингом, ваш второй вариант намного лучше. Не стесняйтесь использовать мое предложение, которое я опубликовал в своих комментариях к вопросу.
@LGSon calc на мой взгляд - последнее средство (как и !important). Поскольку метка абсолютно позиционирована, она не может вызывать проблем с рендерингом других элементов (если внутри родительского div нет других элементов с абсолютной позицией, о которых OP не сообщил нам).
Ты смеешься? .. вы серьезно имеете в виду, что вы равняете вычисление с !важный
И да, именно поэтому, когда "ОП не сказал нам" ... и абсолютный элемент при переполнении своего родителя также могут влиять, например, интерактивная область за пределами родителя
Более того, если использовать Flexbox, все, что нужно, - это сделать label гибким контейнером и оставить автоматическое левое поле на его span. И обратите внимание, ваш образец Flexbox недействителен, label не может иметь div в качестве дочернего элемента.
@LGSon calc может быть хуже, чем! Important, потому что его нужно вычислять каждый раз, и в зависимости от того, что он вычисляет (особенно EM), вызывает (незначительные) проблемы с производительностью. Таким образом, наличие 10 или 100 таких причин на самом деле вызывает реальные проблемы при рендеринге и рисовании ... !important не может этого вызвать.
Вам необходимо отрегулировать ширину вашего
label, чтобы она соответствовала его родительскому заполнению.75emс каждой стороны, напримерwidth: calc(100% - 1.5rem). С этим изменением будет работать поплавок.