Застревание плейсхолдера jQuery-ui sortable вверху

Вопрос или проблема

У меня проблема с плейсхолдером в sortable jQuery UI.

Я пытаюсь отсортировать коллекцию div и добавить плейсхолдер, показывающий, где он будет сброшен.

В данный момент кажется, что плейсхолдер “прилип” к верхней части. Возможно, это из-за моего CSS, но я не могу понять, в чем проблема.

Я пытаюсь сделать так, как в примере с jQuery UI.

Демо

$(function() {
  $('#sortable').sortable({
    placeholder: 'ui-state-highlight',
  }).disableSelection();
});
.form_elements {
  width: 100%;
}

.form_elements ._element {
  width: 100%;
  display: block;
}

.form_elements ._element ._tu {
  float: left;
  width: 80px;
}

.form_elements ._element ._tu input[type=checkbox] {
  scale: 0.8;
  border-color: var(--bs-gray-500);
  float: left;
}

.form_elements ._element ._tu .number {
  float: right;
  padding-right: 15px;
  color: #6e6e6e;
}

.form_elements ._element ._elementContent {
  width: calc(100% - 80px);
  min-height: 10px;
  background-color: #fff;
  border: 1px solid #eaedf0;
  margin-bottom: 15px;
  float: left;
  padding: 10px;
}

.form_elements ._element ._elementContent .line {
  width: 100%;
}

.form_elements ._element ._elementContent .line.lh16 {
  line-height: 18px;
}

.form_elements ._element ._elementContent .line .icon {
  float: left;
  color: #6e6e6e;
  padding-right: 5px;
}

.form_elements ._element ._elementContent .line .icon i {
  font-size: 18px;
}

.form_elements ._element ._elementContent .line .title {
  float: left;
  color: #6e6e6e;
  font-size: 16px;
}

.form_elements ._element ._elementContent .line .rs {
  float: right;
  display: none;
}

.form_elements ._element ._elementContent .line .rs .settings {
  float: left;
  margin-right: 10px;
  font-size: 18px;
  cursor: pointer;
}

.form_elements ._element ._elementContent .line .rs .clone {
  float: left;
  margin-right: 10px;
  font-size: 18px;
  cursor: pointer;
}

.form_elements ._element ._elementContent .line .rs .move {
  float: left;
  font-size: 18px;
  cursor: pointer;
}

.form_elements ._element ._elementContent:hover .rs {
  display: block !important;
}

.ui-state-highlight {
  height: 50px;
  /* Подстройте под высоту ваших элементов */
  margin: 5px 0;
  /* Обязательно оставьте пространство, чтобы видеть, где будет сброшено */
  border: 2px dashed #ccc;
  /* Чтобы визуально отличить плейсхолдер */
  background-color: rgba(240, 240, 240, 0.5);
  box-sizing: border-box;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
  src="https://code.jquery.com/ui/1.13.3/jquery-ui.js"
  integrity="sha256-J8ay84czFazJ9wcTuSDLpPmwpMXOm573OUtZHPQqpEU="
  crossorigin="anonymous"></script>
<div class="form_elements ui-sortable" id="sortable">
  <div class="_element" data-index="1">
    <div class="_tu">
      <input type="checkbox" class="form-check-input" />
      <div class="number">2.</div>
    </div>
    <div class="_elementContent">
      <div class="line lh16">
        <div class="icon">
          <i class="fa fa-hashtag"></i>
        </div>
        <div class="title">Число</div>
        <div class="rs">
          <div class="settings">
            <i class="flaticon-clipboard"></i>
          </div>
          <div class="clone">
            <i class="flaticon-background"></i>
          </div>
          <div class="move">
            <i class="flaticon2-resize"></i>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="_element" data-index="2">
    <div class="_tu">
      <input type="checkbox" class="form-check-input" />
      <div class="number">3.</div>
    </div>
    <div class="_elementContent">
      <div class="line lh16">
        <div class="icon">
          <i class="fa fa-hashtag"></i>
        </div>
        <div class="title">Число</div>
        <div class="rs">
          <div class="settings">
            <i class="flaticon-clipboard"></i>
          </div>
          <div class="clone">
            <i class="flaticon-background"></i>
          </div>
          <div class="move">
            <i class="flaticon2-resize"></i>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="_element" data-index="3">
    <div class="_tu">
      <input type="checkbox" class="form-check-input" />
      <div class="number">4.</div>
    </div>
    <div class="_elementContent">
      <div class="line lh16">
        <div class="icon">
          <i class="flaticon2-sort-alphabetically"></i>
        </div>
        <div class="title">Текст</div>
        <div class="rs">
          <div class="settings">
            <i class="flaticon-clipboard"></i>
          </div>
          <div class="clone">
            <i class="flaticon-background"></i>
          </div>
          <div class="move">
            <i class="flaticon2-resize"></i>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="_element" data-index="0" style="">
    <div class="_tu">
      <input type="checkbox" class="form-check-input" />
      <div class="number">1.</div>
    </div>
    <div class="_elementContent">
      <div class="line lh16">
        <div class="icon">
          <i class="flaticon2-sort-alphabetically"></i>
        </div>
        <div class="title">Текст</div>
        <div class="rs">
          <div class="settings">
            <i class="flaticon-clipboard"></i>
          </div>
          <div class="clone">
            <i class="flaticon-background"></i>
          <div class="move">
            <i class="flaticon2-resize"></i>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Ответ или решение

Проблема с тем, что плейсхолдер jQuery UI Sortable «прилипает» к верхней части контейнера, может возникнуть из-за различных аспектов, включая стили CSS или настройки самого компонента Sortable. Вот несколько шагов, которые могут помочь устранить эту проблему.

1. Изменение CSS для плейсхолдера

Убедитесь, что у вас есть правильные стили для класса плейсхолдера (ui-state-highlight). Как вы уже указали в вашем примере CSS, у вас правильный стиль для высоты и отступов. Однако важно также учитывать отступы и границы у элементов контейнера, где располагаются сортируемые элементы.

Вы можете попробовать изменить стиль плейсхолдера следующим образом:

.ui-state-highlight {
  height: 50px;  /* Высота плейсхолдера */
  margin: 5px 0; /* Отступ для визуального разделения */
  border: 2px dashed #ccc; /* Стиль рамки */
  background-color: rgba(240, 240, 240, 0.5); /* Фон плейсхолдера */
  box-sizing: border-box; /* Учитывается отступ и граница */
}

2. Проверьте настройки Sortable

Если у вас проблемы с отображением плейсхолдера, убедитесь, что настройка placeholder используется корректно. В вашем коде это выглядит правильно:

$(function() {
  $('#sortable').sortable({
    placeholder: 'ui-state-highlight',
  }).disableSelection();
});

3. Структура HTML

Проверьте, что структура вашего HTML-кода корректна и элементы внутри контейнера сортируются должным образом. Каждый элемент должен быть корректно вложен в контейнер с id="sortable".

4. Убедитесь в отсутствии конфликтов CSS

Иногда стили других CSS-классов могут конфликтовать с вашим плейсхолдером. Проверьте, нет ли других стилей, которые могут влиять на отображение элементов.

5. Пример

Вот полный пример кода с использованием предложенных выше настроек и стилей для решения проблемы:

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>Sortable Placeholder Example</title>
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.13.3/themes/smoothness/jquery-ui.css">
  <style>
    .form_elements {
      width: 100%;
    }

    ._element {
      width: 100%;
      margin-bottom: 15px;
      background-color: #fff;
      border: 1px solid #eaedf0;
      padding: 10px;
      box-sizing: border-box;
    }

    .ui-state-highlight {
      height: 50px;
      margin: 5px 0;
      border: 2px dashed #ccc;
      background-color: rgba(240, 240, 240, 0.5);
      box-sizing: border-box;
    }
  </style>
</head>
<body>

<div class="form_elements" id="sortable">
  <div class="_element">Элемент 1</div>
  <div class="_element">Элемент 2</div>
  <div class="_element">Элемент 3</div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.3/jquery-ui.js"></script>
<script>
  $(function() {
    $('#sortable').sortable({
      placeholder: 'ui-state-highlight',
    }).disableSelection();
  });
</script>

</body>
</html>

Заключение

Следуя этим шагам, вы должны устранить проблему с «прилипанием» плейсхолдера в jQuery UI Sortable. Проверьте, чтобы все стили и скрипты загружались корректно, и рассмотрите возможность конфликтов стилей, которые могут мешать правильному отображению. Если проблема не решится, попробуйте также протестировать на чистом проекте, чтобы исключить влияние других библиотек или скриптов.

Оцените материал
Добавить комментарий

Капча загружается...