Я интегрирую редактор Quill в наше приложение, и меня попросили реализовать нумерацию строк в блоках кода. Следуя этому обсуждению, я использовал
.ql-code-block-container {
counter-reset: line;
padding-left: 0;
}
.ql-code-block:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 .5em;
margin-right: .5em;
color: #EEE;
}
Это работает хорошо, но есть одна проблема в Chrome. Я могу добавить текст, который отображается в Dev-tools как:
<div class = "ql-code-block-container" spellcheck = "false">
<div class = "ql-code-block">Here</div>
<div class = "ql-code-block">is</div>
<div class = "ql-code-block">some</div>
<div class = "ql-code-block">text</div>
</div>
и Crome отображается как
Но если я выделю и удалю две средние строки, Dev-tools покажет
<div class = "ql-code-block-container" spellcheck = "false">
<div class = "ql-code-block">Here</div>
<div class = "ql-code-block">text</div>
</div>
в то время как Chrome отображает его как
Если я добавлю новую строку текста, счетчики, похоже, пересчитаются правильно. Я подозреваю, что это ошибка Chrome (в FireFox она отлично обновляется), но есть ли какой-нибудь общий способ заставить браузер обновлять расчеты счетчиков CSS при изменении контента?
Вы можете попробовать переключить counterReset в javascript, чтобы заставить Chrome обновиться. Взгляните на этот пример:
function remove() {
console.info("remove")
var els = document.getElementsByClassName("ql-code-block");
removeCodeBlocElement(els[1])
}
function removeCodeBlocElement(element) {
var elementContainer = element.closest(".ql-code-block-container");
element.remove();
elementContainer.style.counterReset = "none"
//using setTimeout to disable browser property optimisation
setTimeout(() => {
elementContainer.style.counterReset = "";
}, 0);
}
.ql-code-block-container {
counter-reset: line;
padding-left: 0;
}
.ql-code-block:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 .5em;
margin-right: .5em;
}
<div class = "ql-code-block-container" spellcheck = "false">
<div class = "ql-code-block">Here</div>
<div class = "ql-code-block" id = "remove">is</div>
<div class = "ql-code-block">some</div>
<div class = "ql-code-block">text</div>
</div>
<button onclick = "remove()">Remove</button>
Обновлено: если у вас есть какие-либо события на вашем ql-code-block
, вы также можете использовать внутренний HTML и избежать возможного мерцающего номера счетчика.
function remove() {
var elements = document.getElementsByClassName("ql-code-block");
var element = elements[1];
var elementContainer = element.closest(".ql-code-block-container");
element.remove();
//using innerHTML removes all events from child elements
elementContainer.innerHTML = elementContainer.innerHTML;
}
.ql-code-block-container {
counter-reset: line;
padding-left: 0;
}
.ql-code-block:before {
counter-increment: line;
content: counter(line);
display: inline-block;
border-right: 1px solid #ddd;
padding: 0 .5em;
margin-right: .5em;
}
<div class = "ql-code-block-container" spellcheck = "false">
<div class = "ql-code-block">Here</div>
<div class = "ql-code-block" id = "remove">is</div>
<div class = "ql-code-block">some</div>
<div class = "ql-code-block">text</div>
</div>
<button onclick = "remove()">Remove using InnerHTML</button>