Предотвратить всплывающие подсказки - PullRequest
0 голосов
/ 09 апреля 2020

Так что в настоящее время у меня есть страница с подсказками. Большинство из них небольшие фрагменты, но некоторые из них значительно длиннее. Есть также случаи, когда у меня есть всплывающая подсказка над span, содержащая несколько слов или слово, которое может быть пропущено. Моя проблема с моей текущей реализацией состоит в том, что всплывающая подсказка переполняется. То есть, когда выделенное слово находится очень близко к краю экрана, подсказка исчезает с экрана.

В приведенном ниже коде global_margin представляет поле слева и справа от всей страницы. Я хочу, чтобы выделенный текст (см. Структуру всплывающей подсказки ниже) был близок к краю экрана, убедитесь, что стрелка всегда отцентрирована на выделенном тексте, но переместите подсказку Content span так, чтобы его левый край находится в пределах поля страницы (в приведенной ниже настройке левый край всплывающей подсказки всегда будет по крайней мере на 50 пикселей слева, а правый край текстового поля подсказки всегда будет на расстоянии не менее 50 пикселей справа). Моя попытка использования фиксированной позиции, приведенная ниже, не работает.

Есть идеи о том, как я могу подойти к этому?

JavaScript:

var global_margin = 50;

$(document).ready(function() {
    $("#ContentWrapper").css("margin-left", global_margin + "px").css("margin-right", global_margin + "px");

    $(".tooltip").on("mouseover", function() {
        var l = $("> span", this).width / 2 + global_margin;
        var r = $(window).width() - l;

        if ($("> span", this).offset().left < $("> span", this).width + l)
        {
            $("> span", this).css({
                "position": "fixed",
                "top": $("> span", this).offset().top.toString() + "px",
                "left": l.toString() + "px"
            });
        }
        else if ($("> span", this).offset().left > r)
        {
            $("> span", this).css({
                "position": "fixed",
                "top": $("> span", this).offset().top.toString() + "px",
                "right": l.toString() + "px"
            });
        }
        else
        {
            $("> span", this).css("position", "absolute");
        }

        $("> span", this).css({
            "visibility": "visible", 
            "opacity": "0.875"
        });
    }).on("mouseout", function() {
        $("> span", this).css({
            "position": "absolute",
            "visibility": "hidden",
            "opacity": "0"
        }).removeAttr("left").removeAttr("top").removeAttr("right");
    });

    $("sup > span.tooltip > a").each(function(i, elem) {
        $(this).html("[" + (1 + i).toString() + "]");
    });

    $("i").each(function(i, elem) {
        $(this).addClass("yui_" + Math.floor(Math.random() * 10) + "_" + Math.floor(Math.random() * 100) + "_" + Math.floor(Math.random() * 10) + "_" + Math.floor(Math.random() * 10) + "_" + Math.floor(Math.random() * 1e16) + "_" + Math.floor(Math.random() * 1000));
    });

    $("p").each(function(i, elem) {
        $(this).addClass(randString_lower(20));
    });
});

CSS:

.tooltip
{
    box-sizing: border-box;
    border-collapse: separate;
    letter-spacing: normal;
    line-break: auto;
    position: relative;
    -webkit-text-size-adjust: none;
    -moz-text-size-adjust: none;
    -ms-text-size-adjust: none;
    -o-text-size-adjust: none;
    text-size-adjust: none;
    word-break: normal;
    word-spacing: normal;
    word-wrap: normal;
}

.tooltip > a
{
    font-size: 66.666666666667%;
    text-decoration: none;
}

.tooltip > span
{
    display: run-in;
    bottom: 120%;
    left: calc(50% + 7.5px);
    min-width: 50px;
    opacity: 0;
    position: absolute;
    -webkit-transform: translateX(-50%);
    -moz-transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    -o-transform: translateX(-50%);
    transform: translateX(-50%);
    -webkit-transition: visibility 0.25s linear, opacity 0.25s linear;
    -moz-transition: visibility 0.25s linear, opacity 0.25s linear;
    -ms-transition: visibility 0.25s linear, opacity 0.25s linear;
    -o-transition: visibility 0.25s linear, opacity 0.25s linear;
    transition: visibility 0.25s linear, opacity 0.25s linear;
    visibility: hidden;
}

.tooltipContent
{
    background-color: #000000;
    border: 1px solid #000000;
    border-radius: 5px;
    color: #FFFFFF;
    display: inline-block;
    font-size: 16px;
    opacity: 1;
    padding: 5px;
    text-align: center;
    text-indent: 0px;
    white-space: nowrap;
}

.tooltip-par
{
    text-align: justify;
    text-indent: 25px;
    white-space: normal;
}

.tooltipContent::before
{
    left: 50%;
    transform: translateX(50%);
}

.tooltipContent::after
{
    content: "";
    position: absolute;
    width: 0;
    height: 0;
    border-width: 10px;
    border-style: solid;
    border-color: #000000 transparent transparent transparent;
    top: 100%;
    left: 50%;
    -webkit-transform: translateX(calc(-50% - 7.5px));
    -moz-transform: translateX(calc(-50% - 7.5px));
    -ms-transform: translateX(calc(-50% - 7.5px));
    -o-transform: translateX(calc(-50% - 7.5px));
    transform: translateX(calc(-50% - 7.5px));
}

Каждая подсказка выглядит следующим образом:

<span class="tooltip">Highlighted text<span class="tooltipContent">Tooltip Text</span></span>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...