#css #css-grid
#css #css-grid
Вопрос:
Как мне сделать так, чтобы ячейка в сетке была такой же широкой, как и ее max-content
, но никогда не переполняла родительский контейнер сетки?
Проверьте этот пример:
.grid {
border: 1px dotted blue;
display: grid;
gap: 5px;
grid-template-columns: min-content max-content;
width: 120px;
}
label {
background-color: yellow;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
<div class="grid">
<input type="checkbox" id="foo" /><label for="foo">foo label, must not overflow parent grid!</label>
</div>
<div class="grid">
<input type="checkbox" id="bar" /><label for="bar">bar label</label>
</div>
Пример кода также показывает мой реальный вариант использования. Мне это нужно, чтобы метка была ограничена родительским элементом, а также не была шире, чем необходимо, потому что я не хочу, чтобы пробелы в правой части метки были частью интерактивной области.
Если я установлю для нее значение 1fr
вместо max-content
, метка будет охватывать всю остальную часть контейнера, что нежелательно, потому что теперь вы можете переключить флажок, щелкнув пробел справа от метки.
.grid {
border: 1px dotted blue;
display: grid;
gap: 5px;
grid-template-columns: min-content 1fr;
width: 120px;
}
label {
background-color: yellow;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
<div class="grid">
<input type="checkbox" id="foo" /><label for="foo">foo label, must not overflow parent grid!</label>
</div>
<div class="grid">
<input type="checkbox" id="bar" /><label for="bar">bar label</label>
</div>
CSS предложит решение здесь
min(max-content, 1fr)
но, к сожалению max-content
, не может быть использован в min()
-функции.
Комментарии:
1. Я не уверен, что вы подразумеваете под » Если я установлю значение 1fr вместо max-content, […] теперь вы можете переключить флажок, щелкнув пробел справа от метки». ? В вашем втором фрагменте единственный способ, которым я могу переключить флажок, — это щелкнуть по желтой части (или, очевидно, самому флажку!)
2. Желтая часть, в которой нет букв, по-прежнему остается пробелом, независимо от цвета. Термин пробел ничего не говорит о цвете.
3. Ах, теперь я понимаю — я понимаю, что «пробел» не обязательно означает белый (я сам много раз комментировал этот эффект здесь)… Я думал, вы имели в виду первую метку, в которой не было пробелов, поэтому я был в замешательстве 🙂
Ответ №1:
Вы можете использовать fit-content(100%)
ссылку
.grid {
border: 1px dotted blue;
display: grid;
gap: 5px;
grid-template-columns: min-content fit-content(100%);
width: 120px;
}
label {
background-color: yellow;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
<div class="grid">
<input type="checkbox" id="foo" /><label for="foo">foo label, must not overflow parent grid!</label>
</div>
<div class="grid">
<input type="checkbox" id="bar" /><label for="bar">bar label</label>
</div>
С flexbox это тривиальная задача, потому что все, что вам нужно, это сделать элемент контейнером flexbox:
.grid {
border: 1px dotted blue;
display: flex;
gap: 5px;
width: 120px;
}
label {
background-color: yellow;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
<div class="grid">
<input type="checkbox" id="foo" /><label for="foo">foo label, must not overflow parent grid!</label>
</div>
<div class="grid">
<input type="checkbox" id="bar" /><label for="bar">bar label</label>
</div>
Комментарии:
1. Это даже лучше, чем решение, которое я нашел, потому что это также работает по назначению, если я поменяю флажок и метку. Еще раз большое спасибо!
Ответ №2:
Поиграв с фрагментом, я нашел рабочее решение, используя
justify-self: start;
max-width: 100%;
наряду с 1fr
для столбца label:
.grid {
border: 1px dotted blue;
display: grid;
gap: 5px;
grid-template-columns: min-content 1fr;
width: 120px;
}
label {
background-color: yellow;
justify-self: start;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
<div class="grid">
<input type="checkbox" id="foo" /><label for="foo">foo label, must not overflow parent grid!</label>
</div>
<div class="grid">
<input type="checkbox" id="bar" /><label for="bar">bar label</label>
</div>