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;
}
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;
...
}
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;
}
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;
}
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();
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>
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;
}
Kemudian kami menggunakan Prism untuk mengambil kod daripada