На HTML div, что делать, чтобы сохранить вертикальное выравнивание пролетов после нескольких операций перетаскивания? - PullRequest
0 голосов
/ 29 апреля 2020

Я разработал программу Javascript (код ниже) для перетаскивания некоторых элементов <span>, содержащих (греческие) символы и содержащихся в простом элементе <div>.

В первый раз страница отображается правильно; все символы выровнены по вертикали .

Я могу увеличивать или уменьшать высоту или ширину окна, и все символы продолжают выравниваться по вертикали.

enter image description here

Я могу перемещать символы в <div>, используя стандартный drag and drop новый JavaScript API.

Но что-то go неправильно. Вертикальное выравнивание начинает теряться!

После 10 или более ходов я вижу следующий результат

enter image description here

Обычно blue-vertical бар не виден, но в некоторых ситуациях он появляется неожиданно. Это не ошибка, только характеристика c, которую я сейчас использую, чтобы объяснить, что происходит.

У меня такой же результат на последней версии (2020): Opera, Chrome, Edge Chromium и Firefox.

На Firefox, когда я проверяю элемент, зона space-text отображается между всеми <span> в <div>. После каждого хода зона space-text между <span> выпадающим и <span> целью (<span>, на которую был сброшен перетаскиваемый <span>) удаляется!

Эта space-text зона, видимая на Firefox, кажется, соответствует blue-vertical полосе, отображаемой на Chrome.

Если это не ошибка браузера, что я должен сделать, чтобы сохранить исходное вертикальное выравнивание <span> после перемещения некоторых <span> элементов (1 или более)?

Используемый код JavaScript следующий

$(document).ready(function()
    {
    $('.unicode').attr('draggable', 'True');

    $('.unicode').bind(
        { 
        dragstart: function(ev)
            {
            eDraggable = ev.target;
            }
        ,    
        dragenter: function(ev)
            {
            ev.preventDefault(); // needed for IE
            ev.target.style.color = 'red';
            }
        , 
        dragover: function(ev)
            {
            ev.preventDefault(); // needed for IE
            }
        , 
        dragleave: function(ev)
            {
            ev.target.style.color = 'black';
            }
        ,    
        drop: function(ev)
            {
            ev.target.style.color = 'orange';
            ev.target.parentNode.insertBefore(eDraggable, ev.target.nextSibling);
            }
        });
    });
.unicode
    {
    font-size: 32px;
    cursor: pointer;
    min-width: 60px;
    padding: 2px;
    display: inline-block;
    text-align: center;
    }
.unicode:hover
    {
    background-color: yellow;
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <span class='unicode'>&#x03B1;</span>
  <span class='unicode'>&#x03B2;</span>
  <span class='unicode'>&#x03B3;</span>
  <span class='unicode'>&#x03B4;</span>
  <span class='unicode'>&#x03B5;</span>
  <span class='unicode'>&#x03B6;</span>
  <span class='unicode'>&#x03B7;</span>
  <span class='unicode'>&#x03B8;</span>
  <span class='unicode'>&#x03B9;</span>
  <span class='unicode'>&#x03BA;</span>
  <span class='unicode'>&#x03BB;</span>
  <span class='unicode'>&#x03BC;</span>
  <span class='unicode'>&#x03BD;</span>
  <span class='unicode'>&#x03BE;</span>
  <span class='unicode'>&#x03BF;</span>
  <span class='unicode'>&#x03C0;</span>
  <span class='unicode'>&#x03C1;</span>
  <span class='unicode'>&#x03C2;</span>
  <span class='unicode'>&#x03C3;</span>
  <span class='unicode'>&#x03C4;</span>
  <span class='unicode'>&#x03C5;</span>
  <span class='unicode'>&#x03C6;</span>
  <span class='unicode'>&#x03C7;</span>
  <span class='unicode'>&#x03C8;</span>
  <span class='unicode'>&#x03C9;</span>
  <span class='unicode'>&#x0391;</span>
  <span class='unicode'>&#x0392;</span>
  <span class='unicode'>&#x0393;</span>
  <span class='unicode'>&#x0394;</span>
  <span class='unicode'>&#x0395;</span>
  <span class='unicode'>&#x0396;</span>
  <span class='unicode'>&#x0397;</span>
  <span class='unicode'>&#x0398;</span>
  <span class='unicode'>&#x0399;</span>
  <span class='unicode'>&#x039A;</span>
  <span class='unicode'>&#x039B;</span>
  <span class='unicode'>&#x039C;</span>
  <span class='unicode'>&#x039D;</span>
  <span class='unicode'>&#x039E;</span>
  <span class='unicode'>&#x039F;</span>
  <span class='unicode'>&#x03A0;</span>
  <span class='unicode'>&#x03A1;</span>
  <span class='unicode'>&#x03A3;</span>
  <span class='unicode'>&#x03A4;</span>
  <span class='unicode'>&#x03A5;</span>
  <span class='unicode'>&#x03A6;</span>
  <span class='unicode'>&#x03A7;</span>
  <span class='unicode'>&#x03A8;</span>
  <span class='unicode'>&#x03A9;</span>
</div>

В последнюю минуту я изменил цвет шрифта упавшего <span>, чтобы облегчить анализ проблемы. Вы можете видеть, что только все символы всех строк без пропущенных символов <span> (все символы выделены черным цветом) продолжают выравниваться по вертикали.

enter image description here

I также заменил Unicode на простой символ 'X', чтобы быть уверенным, что эти проблемы не имеют ничего общего с Unicode.

1 Ответ

0 голосов
/ 30 апреля 2020

Прежде всего, это не ошибка ... но это очень сложно понять.

Каждый Unicode символ содержится в <span>. Для удобства чтения файла HTML в Notepad ++ я сгенерировал файл, в котором каждая <span> находится на 1 строке, как эта

<div>
    <span class='unicode' title='0x1F600: '>&#x1F600;</span>
    <span class='unicode' title='0x1F601: '>&#x1F601;</span>
    <span class='unicode' title='0x1F600: '>&#x1F600;</span>
    <span class='unicode' title='0x1F601: '>&#x1F601;</span>
</div>

ПРОСТРАНСТВА в начале каждой строки преобразуются в 1 пробел, который каждый отображение в браузере между <span>.

Все это объясняется на https://css-tricks.com/fighting-the-space-between-inline-block-elements/

Если я напишу все <span> только в 1 строке, проблема решена но сгенерированный файл HTML не будет более читабельным без заданного c форматирования.

Как объяснено на css-tricks.com, , простое решение состояло в том, чтобы уменьшить размер шрифта контейнера до нуля.

div {
    font-size: 0;
    }

Еще одно преимущество:

Раньше, когда я пытался сбросить <span> просто наведите пробел, действие сброса было отклонено!

Теперь, когда это пространство удалено, все места между 2 <span> могут быть отброшены.

Новый код HTML - CSS - Javascript следующий

$(document).ready(function()
    {
    $('.unicode').attr('draggable', 'True');

    $('.unicode').bind(
        { 
        dragstart: function(ev)
            {
            eDraggable = ev.target;
            }
        ,    
        dragenter: function(ev)
            {
            ev.preventDefault(); // needed for IE
            ev.target.style.color = 'red';
            }
        , 
        dragover: function(ev)
            {
            ev.preventDefault(); // needed for IE
            }
        , 
        dragleave: function(ev)
            {
            ev.target.style.color = 'black';
            }
        ,    
        drop: function(ev)
            {
            ev.target.style.color = 'orange';
            ev.target.parentNode.insertBefore(eDraggable, ev.target.nextSibling);
            }
        });
    });
.unicode
    {
    font-size: 32px;
    cursor: pointer;
    min-width: 60px;
    padding: 2px;
    display: inline-block;
    text-align: center;
    }
.unicode:hover
    {
    background-color: yellow;
    }
div {    
    font-size:0;
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <span class='unicode'>&#x03B1;</span>
  <span class='unicode'>&#x03B2;</span>
  <span class='unicode'>&#x03B3;</span>
  <span class='unicode'>&#x03B4;</span>
  <span class='unicode'>&#x03B5;</span>
  <span class='unicode'>&#x03B6;</span>
  <span class='unicode'>&#x03B7;</span>
  <span class='unicode'>&#x03B8;</span>
  <span class='unicode'>&#x03B9;</span>
  <span class='unicode'>&#x03BA;</span>
  <span class='unicode'>&#x03BB;</span>
  <span class='unicode'>&#x03BC;</span>
  <span class='unicode'>&#x03BD;</span>
  <span class='unicode'>&#x03BE;</span>
  <span class='unicode'>&#x03BF;</span>
  <span class='unicode'>&#x03C0;</span>
  <span class='unicode'>&#x03C1;</span>
  <span class='unicode'>&#x03C2;</span>
  <span class='unicode'>&#x03C3;</span>
  <span class='unicode'>&#x03C4;</span>
  <span class='unicode'>&#x03C5;</span>
  <span class='unicode'>&#x03C6;</span>
  <span class='unicode'>&#x03C7;</span>
  <span class='unicode'>&#x03C8;</span>
  <span class='unicode'>&#x03C9;</span>
  <span class='unicode'>&#x0391;</span>
  <span class='unicode'>&#x0392;</span>
  <span class='unicode'>&#x0393;</span>
  <span class='unicode'>&#x0394;</span>
  <span class='unicode'>&#x0395;</span>
  <span class='unicode'>&#x0396;</span>
  <span class='unicode'>&#x0397;</span>
  <span class='unicode'>&#x0398;</span>
  <span class='unicode'>&#x0399;</span>
  <span class='unicode'>&#x039A;</span>
  <span class='unicode'>&#x039B;</span>
  <span class='unicode'>&#x039C;</span>
  <span class='unicode'>&#x039D;</span>
  <span class='unicode'>&#x039E;</span>
  <span class='unicode'>&#x039F;</span>
  <span class='unicode'>&#x03A0;</span>
  <span class='unicode'>&#x03A1;</span>
  <span class='unicode'>&#x03A3;</span>
  <span class='unicode'>&#x03A4;</span>
  <span class='unicode'>&#x03A5;</span>
  <span class='unicode'>&#x03A6;</span>
  <span class='unicode'>&#x03A7;</span>
  <span class='unicode'>&#x03A8;</span>
  <span class='unicode'>&#x03A9;</span>
</div>
...