document.addEventListener("DOMContentLoaded", function(event) {
fr = document.querySelector("#cm-resize-frame")
// This 5-6 lines below is only for the WRAP/NOWRAP demo switch:
cm = null
reset = document.getElementById("wrap").onclick = function() {
cm && cm.toTextArea() // clean up previous CM instance
cm = CodeMirror.fromTextArea(document.getElementById("cm"),
{lineWrapping: document.getElementById("wrap").checked,
lineNumbers: true } // just to see if CM is actually alive & resizing
)
function cm_resize() {
cm.setSize(fr.clientWidth + 2, // chrome needs +2, others don't mind...
fr.clientHeight - 10) // and CM needs room for the resize handle :-/
}
// Needed (on FF, Edge & IE11, but not Chrome) for the scrollbars to properly initialize:
cm_resize()
// This is the actual "business logic" of the whole thing! ;)
if (window.ResizeObserver) // Chrome 64+
new ResizeObserver(cm_resize).observe(fr)
else if (window.MutationObserver) // others
new MutationObserver(cm_resize).observe(fr, {attributes: true})
}
reset()
})
#cm-resize-frame {
overflow: hidden; /* CM will manage its own scrollbars. */
resize: both;
height: 10em; /* A fixed initial height is required in Chrome both for the resize handle to appear and to not fall into a shrinking loop due to the neg. offset in cm_resize()! */
/* Optional... */
border: 1px solid lightgrey;
width: 20em;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/codemirror.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/codemirror.min.js"></script>
<div id="cm-resize-frame">
<textarea id="cm">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nunc rhoncus ornare diam eget consequat. Suspendisse potenti.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
Sed scelerisque, ex nec pharetra ultrices, ipsum mi aliquam arcu, sit amet pulvinar erat mauris sit amet mi.
Fusce pulvinar vel ex semper imperdiet. Quisque dapibus purus eu commodo volutpat.
Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
Sed scelerisque, ex nec pharetra ultrices, ipsum mi aliquam arcu, sit amet pulvinar erat mauris sit amet mi.
Fusce pulvinar vel ex semper imperdiet. Quisque dapibus purus eu commodo volutpat.</textarea>
</div>
WRAP: <input id="wrap" type="checkbox" checked>