Как разделить список ul, если он не пуст

Я создал список дел, который используется путем ввода в поле ввода и нажатия кнопки «плюс». Когда вы нажимаете галочку рядом с элементом списка, он переходит из списка ul с идентификатором to-do в другой список ul с идентификатором выполненного, который вы увидите в html-файле. Я хочу, чтобы над списком #completed отображалась строка только тогда, когда элемент списка был перенесен туда, чтобы показать разделение между первым списком дел и вторым списком выполненных элементов. Я пытался использовать:

ul.to-do#completed:not(:empty):before{
content: '';
width: 150px;
height: 0.7px;
background: black;
position: absolute;
}

чтобы строка отображалась, когда список ul не пуст, то есть только тогда, когда вы нажимаете кнопку галочки хотя бы на одном элементе списка, но строка отображается даже до того, как будут созданы какие-либо элементы списка. Есть ли кто-нибудь достаточно умный, чтобы решить это? Не могу найти в Интернете.

var completeSVG =
  '<svg version = "1.1" id = "Capa_1" xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" x = "0px" y = "0px" viewBox = "0 0 52 52" style = "enable-background:new 0 0 52 52;" xml:space = "preserve"> <g> <path d = "M38.252,15.336l-15.369,17.29l-9.259-7.407c-0.43-0.345-1.061-0.274-1.405,0.156c-0.345,0.432-0.275,1.061,0.156,1.406 l10,8C22.559,34.928,22.78,35,23,35c0.276,0,0.551-0.114,0.748-0.336l16-18c0.367-0.412,0.33-1.045-0.083-1.411 C39.251,14.885,38.62,14.922,38.252,15.336z"/> </svg>';
var removeSVG =
  '<svg version = "1.1" id = "Capa_1" id = "removeB" class = "removeB" xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" x = "0px" y = "0px" viewBox = "0 0 328.51 328.51" style = "enable-background:new 0 0 328.51 328.51;" xml:space = "preserve"> <polygon points = "229.044,88.858 164.255,153.647 99.466,88.858 88.858,99.466 153.647,164.255 88.858,229.044 99.466,239.651 164.255,174.862 229.044,239.651 239.651,229.044 174.862,164.255 239.651,99.466 		"/> </svg>';

 /*var button = document.querySelector(".complete");
button.addEventListener("click", function(){
        this.classList.toggle("clicked");
    });*/

function removeItem() {
  var item = this.parentNode.parentNode.parentNode;
  item.removeChild(this.parentNode.parentNode);
}

function completeItem() {
  var completeitem = this.parentNode.parentNode;
  var completeparent = completeitem.parentNode;

  var id = completeparent.id;

  var target = (id === "to-do")
    ? document.getElementById("completed")
    : document.getElementById("to-do");

  completeparent.removeChild(completeitem);
  target.prepend(completeitem);
}

document.getElementById("button-plus").addEventListener("click", function() {
  var value = document.getElementById("input").value;
  if (value) {
    addItem(value);
    document.getElementById("input").value = "";
  }
});
function addItem(text) {
  var list = document.getElementById("to-do");

  item = document.createElement("li");
  item.innerText = text;
  var buttons = document.createElement("div");
  buttons.classList.add("buttons");

  var remove = document.createElement("button");
  remove.classList.add("remove");
  remove.innerHTML = removeSVG;
  remove.addEventListener("click", removeItem);

  var complete = document.createElement("button");
  complete.classList.add("complete");
  complete.innerHTML = completeSVG;
  complete.addEventListener("click", completeItem);
  complete.addEventListener('click', function(){
    this.classList.toggle('clicked');
  });

  buttons.appendChild(remove);
  buttons.appendChild(complete);
  item.appendChild(buttons);

 
  
  list.prepend(item);
  
}
body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
}

header {
  width: 100%;
  height: 70px;
  background: rgb(162, 193, 60);
  border-bottom-right-radius: 12px;
  border-bottom-left-radius: 12px;
  box-shadow: 0 0 5px rgb(159, 160, 155);
  padding: 0 10px 0 10px;
  box-sizing: border-box;
  display: flex;
  align-items: center;
}

header input {
 appearance: none;
 text-indent: 10px;
 border-bottom-right-radius: 25px;
 border-top-right-radius: 25px;
 border-top-left-radius: 12px;
 border-bottom-left-radius: 12px;
 width: 100%;
 background: rgb(233, 255, 170);
 height: 45px;
 font-family: Century Gothic;
 border: none;
 box-sizing: border-box;
 padding-right: 60px;
}

header button {
position: absolute;
right: 10px;
top: 13.5px;
height: 43px;
width: 50px;
border-bottom-right-radius: 25px;
border-top-right-radius: 25px;
appearance: none;
border: none;
background: rgb(238, 255, 173);
border-left: 2px solid rgb(162, 193, 60);
cursor: pointer;
}

button svg {
z-index: 6;
position: absolute;
border-bottom-right-radius: 25px;
border-top-right-radius: 25px;
right: 0;
top: -1px;
}/*
.container{
  width: 100%;
  margin: auto;
  border: 1px solid black;
}*/
 .to-do {
  width: 100%;
  float: left;
  list-style-type: none;
   box-sizing: border-box;
   padding: 0;
  /*border: 1px lid black;*/
}
.to-do li{
  width: 85%;
  background: rgb(233, 255, 170);
  min-height: 50px;
  margin: auto;
  border-radius: 5px;
  box-sizing: border-box;
  font-family: Century Gothic;
  padding: 0 105px 0 25px;
  position: relative;
  margin-top: 25px;
  display: flex;
  align-items: center;
  
}
.to-do li .buttons{
  position: absolute;
  top: 0;
  right: 0;
  height: 50px;
  width: 100px;
  background: white;
}
.to-do li .buttons button{
  appearance: none;
  width: 47.5px;
  height: 50px;
  box-sizing: border-box;
  position: relative;
  background: rgb(233, 255, 170);
  border: none;
  cursor: pointer;
}
.to-do li .buttons button:last-of-type:before{
  content: '';
  width: 0.8px;
  height: 29px;
  background: gray;
  opacity: 0.4;
  float: left;
  margin-left: -6px;
}/*
.to-do li button:nth-child(1):hover .x-fill{
  fill: red;
  transition-duration: 0.3s;
}
.to-do li button:nth-child(2):hover .tick-fill{
  fill: orange;
  transition-duration: 0.3s;
}*/
.complete svg{
  fill: gray;
}
.complete svg:hover{
  fill: green;
  opacity: 0.5;
}
.complete.clicked svg{
  fill: green;
  transition-duration: 0.3s;
}
.remove svg{
  fill: gray;
  opacity: 0.8;
}
.remove svg:hover{
  fill: red;
  opacity: 0.7;
  transition-duration: 0.3s;
}
ul.to-do#completed:not(:empty){
  position: relative;
}

ul.to-do#completed:not(:empty):before{
  content: '';
  width: 150px;
  height: 0.7px;
    background: black;
  position: absolute;
}
<head>

<title>To do List App</title>

</head>
<body>
<header>
  <input type = "text" placeholder = "Next on my to do list is....." id = "input">
  <button id = "button-plus">
 <svg width = "48" height = "43" xmlns = "http://www.w3.org/2000/svg" xmlns:svg = "http://www.w3.org/2000/svg">
  <rect fill = "#0186b2" height = "28" id = "svg_1" stroke = "#000000" stroke-opacity = "0" stroke-width = "5" width = "4" x = "19.5" y = "8.5"/>
  <rect fill = "#47bcbc" height = "3" id = "svg_2" stroke = "#000000" stroke-dasharray = "null" stroke-linecap = "null" stroke-linejoin = "null" stroke-opacity = "0" stroke-width = "5" width = "28" x = "7.5" y = "20.5"/>
</svg>
   
    </svg>
  </button>
</header>
  <div class = "container">
<ul id = "to-do" class = "to-do">
  </ul>
    <ul id = "completed" class = "to-do">
 </ul>
  </div>
  
</body>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

#completed не пусто; он содержит текстовый узел с разрывом строки, за которым следует пробел. В будущем это не будет иметь значения:

The :empty pseudo-class represents an element that has no children except, optionally, document white space characters.
[...]
Note: In Level 2 and Level 3 of Selectors, :empty did not match elements that contained only white space. This was changed so that that—given white space is largely collapsible in HTML and is therefore used for source code formatting, and especially because elements with omitted end tags are likely to absorb such white space into their DOM text contents—elements which authors perceive of as empty can be selected by this selector, as they expect.

CSS Selectors Level 4

А пока уберите пробел из #completed:

<ul id = "completed" class = "to-do"></ul>

Почему бы не добавить оператор в функцию completeItem(), которая динамически добавляет класс?

Например, внизу completeItem() вы можете включить строку:

target.classList.add('is-populated');

И тогда ваш соответствующий селектор CSS (вместо ul.to-do#completed:not(:empty)::before) будет:

ul.to-do#completed.is-populated::before

Другие вопросы по теме