supaya mereka boleh menatal bersama-sama dan kekal berbaris.
CSS
Berikut ialah keseluruhan CSS yang saya gunakan untuk editor.
html,
body {
height: 100vh;
width: 100vw;
padding: 0;
margin: 0;
}
#editor {
height: 100%;
width: 100%;
box-sizing: border-box;
display: grid;
grid-template: 1fr / 1fr;
place-items: top;
overflow: auto;
padding: 2rem;
background-color: #1a1723;
}
#editor .code,
#editor .preview {
all: unset;
}
#editor .code,
#editor .preview {
height: auto;
grid-column: 1 / 1;
grid-row: 1 / 1;
font-family: Monaco, monospace;
font-size: 16px;
resize: none;
line-height: 24px;
white-space: pre-wrap;
overflow: hidden;
}
#editor .preview {
pointer-events: none;
color: #ccc;
}
#editor .code {
color: rgba(255, 255, 255, 0);
caret-color: magenta;
}
Salin selepas log masuk
Salin selepas log masuk
Bertindih elemen
Salah satu bahagian penting di sini ialah menggunakan grid paparan untuk menindih kawasan teks dan pratonton
#editor {
...
display: grid;
grid-template: 1fr / 1fr;
place-items: top;
overflow: auto;
...
}
Salin selepas log masuk
Salin selepas log masuk
Saya menggunakan unit fr untuk menindih dua elemen di dalam bekas. Anda boleh membaca lebih lanjut tentang fr di CSSTricks di sini.
Mengikat kawasan teks dan pratonton secara sama
Anda mungkin perasan bahawa saya menggunakan peraturan yang sama pada pratonton dan kawasan teks. Ini memastikan ia bertindih dengan tepat.
#editor .code,
#editor .preview {
height: auto;
grid-column: 1 / 1;
grid-row: 1 / 1;
font-family: Monaco, monospace;
font-size: 16px;
resize: none;
line-height: 24px;
white-space: pre-wrap;
overflow: hidden;
}
Salin selepas log masuk
Jadikan textarea telus
Menggunakan rgba untuk warna teks membolehkan saya mempunyai teks sepenuhnya telus, jadi nampaknya anda sedang memilih dan mengedit pratonton.
#editor .code {
color: rgba(255, 255, 255, 0);
caret-color: magenta;
}
Salin selepas log masuk
Sedikit Javascript
Kami memerlukan sedikit Javascript untuk menggabungkan ini semua. Mari lihat apa yang kita perlukan.
const $preview = document.querySelector("#editor .preview");
const $code = document.querySelector("#editor .code");
function mirror() {
// make textarea grow to height of content so we can scroll together
$code.style.height = $code.scrollHeight;
// update the preview underlay with the syntax highlight
$preview.innerHTML = Prism.highlight(
$code.value,
Prism.languages.javascript,
"javascript",
);
}
// insert two spaces on tab
$code.addEventListener("keydown", (ev) => {
if (ev.code === "Tab") {
ev.preventDefault();
$code.setRangeText(" ", $code.selectionStart, $code.selectionStart, "end");
mirror();
}
});
$code.addEventListener("input", mirror);
mirror();
Salin selepas log masuk
Kami akan menggunakan Prism untuk ini, tetapi anda boleh menggunakan apa sahaja yang anda suka.
Fungsi mirror() sedang melakukan beberapa perkara di sini.
<div id="editor">
<div class="preview"></div>
<textarea class="code" spellcheck="false"></textarea>
</div>
Salin selepas log masuk
Salin selepas log masuk
Ini memastikan bahawa semasa anda menaip, ketinggian
html,
body {
height: 100vh;
width: 100vw;
padding: 0;
margin: 0;
}
#editor {
height: 100%;
width: 100%;
box-sizing: border-box;
display: grid;
grid-template: 1fr / 1fr;
place-items: top;
overflow: auto;
padding: 2rem;
background-color: #1a1723;
}
#editor .code,
#editor .preview {
all: unset;
}
#editor .code,
#editor .preview {
height: auto;
grid-column: 1 / 1;
grid-row: 1 / 1;
font-family: Monaco, monospace;
font-size: 16px;
resize: none;
line-height: 24px;
white-space: pre-wrap;
overflow: hidden;
}
#editor .preview {
pointer-events: none;
color: #ccc;
}
#editor .code {
color: rgba(255, 255, 255, 0);
caret-color: magenta;
}
Salin selepas log masuk
Salin selepas log masuk
Kemudian kami menggunakan Prism untuk mengambil kod daripada