Получение ширины html-контента внутри LI, ширина которого 100%
В моем фрагменте мой OL имеет ширину CSS 100%. В моем jQuery я хочу получить ширину (например, offsetWidth в vanilla JS) содержимого внутри тега LI, но jQuery width()
возвращает ширину LI, которая в итоге становится полной шириной браузера (вместо 140 пикселей).
$(document).ready(function(){
alert($("#theOl li:eq(0)").width());
});
#theOl {
border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ol id="theOl">
<li>This is some text
</ol>
Обратите внимание, что мне нужно, чтобы сама LI оставалась на 100% ширины.
4 ответа
Почему бы не обернуть <li>
содержание в промежутке, и просто получить ширину этого?
$(document).ready(function(){
alert($("#theOl li:eq(0) span").width());
});
#theOl {
border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ol id="theOl">
<li><span>This is some text</span>
</ol>
Вам, вероятно, придется обернуть содержимое li элементом inline-block и получить ширину этого элемента, в противном случае вы получите ширину элемента li, которая является элементом списка и занимает 100% ширины его родительского элемента.
Вам нужно добавить: display: inline-block
или же inline
к li
в вашем CSS. Я просто добавил прямо в HTML.
$(document).ready(function(){
alert($("#theOl li:eq(0)").width());
});
#theOl {
border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ol id="theOl">
<li style="display: inline-block">This is some text</li>
</ol>
Это происходит потому, что по умолчанию элемент имеет block
дисплей, и это заставляет использовать все пространство контейнера.
Если это только HTML5, то можно использовать что-то вроде этого:
function getTextWidth(text) {
var canvas = getTextWidth.canvas ||
(getTextWidth.canvas = document.createElement("canvas"));
var context = canvas.getContext("2d");
return (context.measureText(text).width);
};
$(document).ready(function(){
var content = $("#theOl li:eq(0)").html();
alert(getTextWidth(content));
})
Смотрите скрипку здесь: https://jsfiddle.net/7Lxuf285/1/
Одно улучшение можно сделать, передав размер шрифта в методе и установив его в контексте.
context.font = font;
Смотрите скрипку со шрифтом: https://jsfiddle.net/7Lxuf285/2/