Copiar texto al portapapeles
Solución
<script>
function copiar(idTxt){
let blq = document.getElementById(idTxt);
let txt = blq.innerHTML;
//si no se quiere incluir código html usar innerText
let btn = event.target;
let btnLbl = btn.innerText;
navigator.clipboard.writeText(txt);
btn.innerHTML = "Copiado";
setTimeout(()=>btn.innerText = btnLbl, 1200);
}
</script>
<body>
<div id="texto">
<p>Este texto se puede copiar al clipboard usando el botón copiar<br>
Lo fundamental es leer el innerHTML del bloque de donde se copiará <br>
Y poner este texto en el clipboard usando el objeto clipboard del navegador.<br>
El evento se puede asociar en el HTML o con addEventListener, aquí lo pongo por comodidad con HTML.<br>
El resto muestra que se ha completado la acción con la etiqueta del botón
</p>
</div>
<button id="btnCopiar" onclick="copiar('texto')">Copiar</button>
<body>
Explicación
Este comportamiento se implementa mediante una función que lee el contenido del bloque que queramos copiar. Posteriormente usa este cntenido como argumento del método writeText del clipboard.
Si solo se quiere copiar el texto, sin las etiquetas HTML usamos innerText para extraer el contenido del bloque, pero si queremos copiar también est código usamos innerHTML (línea 4)
En el ejemplo se implementa mediante un botón: al pulsar se copia el texto y se cambia su etiqueta de copiar a copiado, al cabo de 1200ms la etiqueta vuelve a cambiar
También puedes usar un click sobre el propio texto
En la ventana de demostración se copia el texto, luego puedes pegar en cualquier documento de texto para comprobar que ha funcionado