Изменение положения Popstop popovers на основе положени X позиции относительно края окна?
Я пробрал Интернет по-далеко, и пока я нашел этот postoverflow postfulful Возможно ли изменить положение Popstash popovers на основе ширины экрана?, it все еще не ответил на мой вопрос, вероятно, из-за моей проблемы с пониманием позиции/смещения.
Вот что я пытаюсь сделать. Я хочу, чтобы позиция Bootstap Popover Twitter была ПРАВИЛЬНОЙ, если всплывающее окно hotspot не будет расположено за пределами области просмотра, тогда я хочу, чтобы он был позиционирован LEFT. Я делаю iPad-приложение с горячими точками, когда вы нажимаете точку доступа, появляется информация, но я не хочу, чтобы она появлялась за пределами области просмотра, когда горизонтальная прокрутка заблокирована.
Я думаю, что все будет так:
$('.infopoint').popover({
trigger:'hover',
animation: false,
placement: wheretoplace
});
function wheretoplace(){
var myLeft = $(this).offset.left;
if (myLeft<500) return 'left';
return 'right';
}
Мысли? Спасибо!
Ответы
Ответ 1
Я только заметил, что параметр размещение может быть либо строкой, либо функцией , возвращающей строку, которая делает вычисления каждый раз, когда вы нажимаете на доступной по ссылке ссылке.
Это позволяет легко реплицировать то, что вы сделали без первоначальной функции $. each:
var options = {
placement: function (context, source) {
var position = $(source).position();
if (position.left > 515) {
return "left";
}
if (position.left < 515) {
return "right";
}
if (position.top < 110){
return "bottom";
}
return "top";
}
, trigger: "click"
};
$(".infopoint").popover(options);
Ответ 2
На основе документации вы сможете использовать auto
в сочетании с предпочтительным местом размещения, например. auto left
http://getbootstrap.com/javascript/#popovers: "Когда указано" auto ", оно будет динамически переориентировать popover. Например, если место размещения" auto left "", подсказка будет отображаться слева, когда это возможно, в противном случае она будет отображаться вправо."
Я пытался сделать то же самое, а потом понял, что эта функциональность уже существует.
Ответ 3
Для Bootstrap 3 существует
placement: 'auto right'
что проще. По умолчанию это будет правильно, но если элемент находится в правой части экрана, то popover будет оставлен. Поэтому это должно быть:
$('.infopoint').popover({
trigger:'hover',
animation: false,
placement: 'auto right'
});
Ответ 4
Итак, я понял способ сделать это эффективно. Для моего конкретного проекта я создаю IPad-сайт, поэтому я точно знал, какое значение пикселя X/Y должно было достигнуть края экрана. Значения этогоX и этого значения будут различаться.
Так как popovers по-прежнему размещаются встроенным стилем, я просто хватаю левые и верхние значения для каждой ссылки, чтобы решить, в каком направлении должен быть popover. Это делается путем добавления значений html5 данных, которые .popover() использует при выполнении.
if ($('.infopoint').length>0){
$('.infopoint').each(function(){
var thisX = $(this).css('left').replace('px','');
var thisY = $(this).css('top').replace('px','');
if (thisX > 515)
$(this).attr('data-placement','left');
if (thisX < 515)
$(this).attr('data-placement','right');
if (thisY > 480)
$(this).attr('data-placement','top');
if (thisY < 110)
$(this).attr('data-placement','bottom');
});
$('.infopoint').popover({
trigger:'hover',
animation: false,
html: true
});
}
Любые комментарии/улучшения приветствуются, но это выполняет свою работу, если вы хотите поместить эти значения вручную.
Ответ 5
Ответ bchhun заставил меня на правильном пути, но я хотел проверить фактическое пространство между источником и краем области просмотра. Я также хотел уважать атрибут размещения данных в качестве предпочтения с соответствующими резервными ошибками, если не хватило места. Таким образом, "право" всегда было бы правильным, если бы не было достаточно места, чтобы попсор мог показать на правой стороне, например. Так я справлялся с этим. Это работает для меня, но это кажется немного громоздким. Если у кого-нибудь есть идеи для более чистого, более сжатого решения, мне было бы интересно увидеть его.
var options = {
placement: function (context, source) {
var $win, $source, winWidth, popoverWidth, popoverHeight, offset, toRight, toLeft, placement, scrollTop;
$win = $(window);
$source = $(source);
placement = $source.attr('data-placement');
popoverWidth = 400;
popoverHeight = 110;
offset = $source.offset();
// Check for horizontal positioning and try to use it.
if (placement.match(/^right|left$/)) {
winWidth = $win.width();
toRight = winWidth - offset.left - source.offsetWidth;
toLeft = offset.left;
if (placement === 'left') {
if (toLeft > popoverWidth) {
return 'left';
}
else if (toRight > popoverWidth) {
return 'right';
}
}
else {
if (toRight > popoverWidth) {
return 'right';
}
else if (toLeft > popoverWidth) {
return 'left';
}
}
}
// Handle vertical positioning.
scrollTop = $win.scrollTop();
if (placement === 'bottom') {
if (($win.height() + scrollTop) - (offset.top + source.offsetHeight) > popoverHeight) {
return 'bottom';
}
return 'top';
}
else {
if (offset.top - scrollTop > popoverHeight) {
return 'top';
}
return 'bottom';
}
},
trigger: 'click'
};
$('.infopoint').popover(options);
Ответ 6
Вы также можете попробовать это,
== > Получить позицию цели/источника в видовом экране
== > Проверьте, меньше ли пространство снизу, чем высота всплывающей подсказки
== > Если пространство снизу меньше, чем высота всплывающей подсказки, просто прокрутите страницу вверх
placement: function(context, source){
//get target/source position in viewport
var bounds = $(source)[0].getBoundingClientRect();
winHeight = $(window).height();
//check wheather space from bottom is less that your tooltip height
var rBottom = winHeight - bounds.bottom;
//Consider 180 == your Tooltip height
//if space from bottom is less that your tooltip height, this will scrolls page up
//We are keeping tooltip position is fixed(at bottom)
if (rBottom < 180){
$('html, body').animate({ scrollTop: $(document).scrollTop()+180 }, 'slow');
}
return "bottom";
}
Ответ 7
Вы можете использовать автоматическое размещение данных, например, размещение данных = "авто слева". Он будет автоматически настраиваться в соответствии с вашим размером экрана, и размещение по умолчанию останется.
Ответ 8
В дополнение к большому ответу bchhun, если вы хотите позиционирование абсента, вы можете это сделать
var options = {
placement: function (context, source) {
setTimeout(function () {
$(context).css('top',(source.getBoundingClientRect().top+ 500) + 'px')
},0)
return "top";
},
trigger: "click"
};
$(".infopoint").popover(options);
Ответ 9
Я решил свою проблему в AngularJS следующим образом:
var configPopOver = {
animation: 500,
container: 'body',
placement: function (context, source) {
var elBounding = source.getBoundingClientRect();
var pageWidth = angular.element('body')[0].clientWidth
var pageHeith = angular.element('body')[0].clientHeith
if (elBounding.left > (pageWidth*0.34) && elBounding.width < (pageWidth*0.67)) {
return "left";
}
if (elBounding.left < (pageWidth*0.34) && elBounding.width < (pageWidth*0.67)) {
return "right";
}
if (elBounding.top < 110){
return "bottom";
}
return "top";
},
html: true
};
Эта функция выполняет положение всплывающего поплавка Bootstrap в наилучшее положение на основе позиции элемента.
Ответ 10
Вы также можете попробовать это, если вам это нужно почти во всех местах на странице.
U может настроить его в общем виде, а затем просто использовать.
Таким образом, вы также можете использовать элемент HTML и все, что хотите:)
$(document).ready(function()
{
var options =
{
placement: function (context, source)
{
var position = $(source).position();
var content_width = 515; //Can be found from a JS function for more dynamic output
var content_height = 110; //Can be found from a JS function for more dynamic output
if (position.left > content_width)
{
return "left";
}
if (position.left < content_width)
{
return "right";
}
if (position.top < content_height)
{
return "bottom";
}
return "top";
}
, trigger: "hover"
, animation: "true"
, html:"true"
};
$('[data-toggle="popover"]').popover(options);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<link href="#" onclick="location.href='http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css'; return false;" rel="stylesheet"/>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<div class="container">
<h3>Popover Example</h3>
<a id="try_ppover" href="#" data-toggle="popover" title="Popover HTML Header" data-content="<div class='jumbotron'>Some HTML content inside the popover</div>">Toggle popover</a>
</div>