Бутстрап "всплывающая подсказка" и "popover" добавляют дополнительный размер в таблицу
Примечание:
В зависимости от версии Bootstrap (до 3.3 или нет) вам может потребоваться другой ответ.
Обратите внимание на примечания.
Когда я активирую подсказки (наведите указатель мыши на ячейку) или всплывает в этом коде, размер таблицы увеличивается. Как я могу избежать этого?
Здесь emptyRow - функция для генерации tr с 100
<html>
<head>
<title></title>
<script type="text/javascript" language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<link type="text/css" rel="stylesheet" href="#" onclick="location.href='http://twitter.github.com/bootstrap/assets/css/bootstrap.css'; return false;">
<script type="text/javascript" language="javascript" src="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.1/bootstrap.min.js"></script>
<style>
#matrix td {
width: 10px;
height: 10px;
border: 1px solid gray;
padding: 0px;
}
</style>
<script>
function emptyRow() {
str = '<tr>'
for (j = 0; j < 100; j++) {
str += '<td rel="tooltip" data-original-title="text"></td>'
}
str += '</tr>'
return str
}
$(document).ready(function () {
$("#matrix tr:last").after(emptyRow())
$("[rel=tooltip]").tooltip();
});
</script>
</head>
<body style="margin-top: 40px;">
<table id="matrix">
<tr>
</tr>
</table>
</body>
</html>
Спасибо за консультацию!
Ответы
Ответ 1
Примечание: Решение для Bootstrap 3.0 ~ 3.2
Вам нужно создать элемент внутри td
и применить к нему всплывающую подсказку, например , потому что всплывающая подсказка сама является div, а когда она размещенный после элемента td
, он блокирует расположение таблицы.
Эта проблема была введена с последней версией Bootstrap. Здесь обсуждаются исправления на GitHub здесь. Надеемся, что следующая версия содержит фиксированные файлы.
Ответ 2
Примечание: Решение для Bootstrap 3.3 +
Простое решение
В вызове .tooltip()
установите для параметра container
значение body
:
$(function () {
$('[data-toggle="tooltip"]').tooltip({
container : 'body'
});
});
В качестве альтернативы вы можете сделать то же самое, используя атрибут data-container
:
<p data-toggle="tooltip" data-placement="left" data-container="body" title="hi">some text</p>
Почему это работает?
Это решает проблему, потому что по умолчанию всплывающая подсказка имеет display: block
, и элемент вставлен в том месте, откуда он был вызван. Из-за display: block
он влияет на поток страницы в некоторых случаях, то есть нажатие других элементов вниз.
Установив контейнер в элемент body, всплывающая подсказка добавляется к телу вместо того, откуда он был вызван, поэтому он не влияет на другие элементы, потому что ничего не нужно "нажимать".
Ответ 3
Примечание: Решение для Bootstrap 3.3 +
Если вы хотите избежать разбиения таблицы при применении всплывающей подсказки к элементу <td>
, вы можете использовать следующий код:
$(function () {
$("body").tooltip({
selector: '[data-toggle="tooltip"]',
container: 'body'
});
})
Вы можете выглядеть так:
<td data-toggle="tooltip" title="Your tooltip data">
Table Cell Content
</td>
Это даже работает с динамически загруженным контентом. Например, при использовании datatables
Ответ 4
Я хотел бы добавить некоторую точность к принятому ответу, я решил использовать формат ответа для чтения.
Примечание: Решение для Bootstrap 3.0 ~ 3.2
Прямо сейчас обертывание вашей всплывающей подсказки в div является решением, но для этого вам понадобятся некоторые изменения, если вы хотите, чтобы весь ваш <td>
показать всплывающую подсказку (из-за Bootstrap CSS). Простым способом сделать это является перенос <td>
дополнения в обертку:
HTML
<table class="table table-hover table-bordered table-striped">
<tr>
<td>
<div class="show-tooltip" title="Tooltip content">Cell content</div>
</td>
</tr>
</table>
JS (jQuery)
$('.show-tooltip').each(function(e) {
var p = $(this).parent();
if(p.is('td')) {
/* if your tooltip is on a <td>, transfer <td> padding to wrapper */
$(this).css('padding', p.css('padding'));
p.css('padding', '0 0');
}
$(this).tooltip({
toggle: 'toolip',
placement: 'bottom'
});
});
Ответ 5
Если вы используете datatable для таблицы, то она будет использовать полный
$('#TableId').DataTable({
"drawCallback": function (settings) {
debugger;
$('[data-toggle="tooltip"]').tooltip({
container: 'body'
});
}
});
Ответ 6
Вы должны инициализировать Tooltip внутри функции datatable fnDrawCallback
"fnDrawCallback": function (data, type, full, meta) {
$('[data-toggle="tooltip"]').tooltip({ placement: 'right', title: 'heyo', container: 'body', html: true });
},
И определите свой столбец ниже
{
targets: 2,
'render': function (data, type, full, meta) {
var htmlBuilder = "<b>" + data + "</b><hr/><p>Description: <br/>" + full["longDescrioption"] + "</p>";
return "<a href='#' class='Name'>" + (data.length > 50 ? data.substr(0, 50) + '…' : data) + "</a>" +
"<sup data-toggle='tooltip' data-original-title=" + htmlBuilder + ">"+
"<i class='ic-open-in-new ic' style='font-size:12px;margintop:-3px;'></i></sup>";
}
},
Ответ 7
Если вы используете директивы начальной загрузки для AngularJS, используйте атрибут tooltip-append-to-body.
<td ng-repeat="column in row.columns" uib-tooltip="{{ ctrl.viewModel.leanings.tooltip }}" tooltip-append-to-body="true"></td>