2017-01-19 5 views
0

Я пытаюсь сделать приложение todo. У меня есть вещи, называемые папками, которые можно добавить динамически, и мы можем добавлять предметы todo внутри каждой папки. Все элементы списка присваиваются атрибуту contenteditable. Когда я пытаюсь отредактировать один из элементов списка, позиция div ниже него изменяется. Я не знаю, что вызывает это. Я был у него часами и не нашел никаких подробностей.Нажав на div, измените положение соседнего div

Image showing the folders getting realigned

var createFolder = function() { 
 
    var folder = document.createElement("div"); 
 
    folder.classList.add("folder"); 
 
    folder.innerHTML = '<span id="deleteFolder" onclick="deleteFolder(this)"><i class="fa fa-trash-o"></i></span> ' + 
 
    '<span contenteditable="true" onfocusout="checkIfEmpty(this,\'New Folder\')">New Folder</span>' + 
 
    ' <span id="newItem" class="addItem" onclick="addItem(this)"><i class="fa fa-plus"></i></span>' + 
 
    '<ul class="list">' + 
 
    '<li contenteditable="true" onfocusout="checkIfEmpty(this)" class="bigandspacy">New Item</li>' + 
 
    '</ul>'; 
 
    document.getElementById("container").appendChild(folder); 
 
} 
 

 
var checkIfEmpty = function(e, originalContent) { 
 
    if (e.textContent === "") { 
 
    e.textContent = originalContent || "New Item"; 
 
    } 
 
} 
 

 
var deleteFolder = function(e) { 
 
    console.log(e.parentNode); 
 
    document.getElementById("container").removeChild(e.parentNode); 
 
} 
 

 
var addItem = function(e) { 
 
    var elem = document.createElement("li"); 
 
    elem.innerText = "New Item"; 
 
    elem.setAttribute("contenteditable", "true") 
 
    elem.classList.add("bigandspacy"); 
 
    e.parentNode.children[3].appendChild(elem); 
 
} 
 

 
document.getElementById("newFolder").addEventListener('click', createFolder, false);
body { 
 
    background: #E1E1E4; 
 
} 
 
.container { 
 
    position: fixed; 
 
} 
 
.folder { 
 
    display: inline-block; 
 
    position: relative; 
 
    background: #2A2A33; 
 
    width: 40vh; 
 
    margin: 10px; 
 
    border-radius: 8px; 
 
    color: white; 
 
    font-size: 1em; 
 
    float: left; 
 
    min-height: 50px; 
 
} 
 
.folder:before { 
 
    content: ""; 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    border-width: 0 30px 30px 0; 
 
    border-style: solid; 
 
    border-color: #666666 #E1E1E4; 
 
} 
 
.folder .fa-trash-o { 
 
    padding: 5px; 
 
    cursor: pointer; 
 
} 
 
.addItem { 
 
    float: right; 
 
    margin-right: 18%; 
 
    margin-top: 2%; 
 
} 
 
li { 
 
    list-style: none; 
 
} 
 
.bigandspacy { 
 
    font-size: 1.2em; 
 
    padding: 5px; 
 
    width: 80%; 
 
    margin-top: 5px; 
 
} 
 
.bigandspacy:focus { 
 
    border: 1px solid white; 
 
} 
 
.bigandspacy:hover { 
 
    cursor: pointer; 
 
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> 
 

 
<button id="newFolder"><i class="fa fa-plus"></i> 
 
</button> 
 
<div id="container"></div>

Спасибо заранее.

+0

Вы должны публиковать полную, но минимальную разметку, которая показывает проблему здесь. Вы не указали HTML или javascript. – Rob

+1

Привет, Роб, это мой первый раз, и я думал, что все эти вещи считаются плохими. Я понимаю, что требуемые коды должны быть опубликованы напрямую и последуют за ним. Спасибо за совет. –

ответ

2

Дайте на вход прозрачную границу так, что она не меняет размер в фокусе:

.bigandspacy{ 
    font-size: 1.2em; 
    padding: 5px; 
    width: 80%; 
    margin-top: 5px; 
    border: 1px solid transparent; 
} 

(Тогда просто обновить border-color на фокусе)

Обновлено скрипку: https://jsfiddle.net/axs5ec89/2/

+1

+1 Спасибо. Это решило проблему, но я совершенно не понимаю, что вызвало это. Было бы полезно, если бы вы могли объяснить причину, по которой он ведет себя так. –

+0

Фокус был причиной того, что ваш ящик расширялся по ширине и высоте на 2 пикселя (по 1px с каждой стороны для границы ввода). Принимая во внимание общий размер коробки (включая маржу), это означало, что поле слева и внизу больше не может вписываться в доступное пространство - для того, чтобы он был хорошо протекающим, все они должны были быть одинаковыми размерами. –

+0

Для списков переменных размеров есть способы с 'flex', чтобы вещи лучше поменялись (но я не думаю, что вам нужны переменные размеры): https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie= UTF-8 # q = css% 20flex% 20masonry –

0

You может просто добавить маржу к стилю фокусировки - это предотвратит скачок.

.bigandspacy:focus{ 
    border: 1px solid white; 
    margin:-1px; 
} 
+0

Привет, Биргит Мартинел, я не понимаю, как это меняет маржа? –

+0

хорошо - граница добавляется вокруг вашего текстового поля - поэтому он добавляет один пиксель к размеру вашего элемента - если вы даете ему поле в -1pixel, вы в основном говорите ему, чтобы создать зависающий элемент - элемент, который получает границу - 1 пиксель меньше - который компенсирует увеличение и делает его точно такого же размера - поэтому не прыгает. –

+0

Привет, я сделал изменения, но это не сработало. Вот ссылка на изображение. [Изображение переустановленной папки] (https://postimg.org/image/n9l9h282p/) –

Смежные вопросы