HTML文本框左侧动态行号技巧
HTML 在 textarea 左侧添加行号的实现方法
在文本编辑器中显示行号是提升用户体验的常见需求。以下介绍几种在 <textarea> 左侧动态添加行号的实现方案,涵盖纯 HTML/CSS 和 JavaScript 动态生成的方法。
使用 CSS 和 JavaScript 动态生成行号
通过创建一个行号容器与 <textarea> 联动滚动,实现行号同步更新。
<div class="code-editor">
<div class="line-numbers"></div>
<textarea id="code"></textarea>
</div>
.code-editor {
display: flex;
font-family: monospace;
}
.line-numbers {
padding: 10px;
text-align: right;
background: #f5f5f5;
margin-right: 5px;
overflow-y: hidden;
}
textarea {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
min-height: 200px;
line-height: 1.5;
}
const textarea = document.getElementById('code');
const lineNumbers = document.querySelector('.line-numbers');
textarea.addEventListener('input', updateLineNumbers);
textarea.addEventListener('scroll', syncScroll);
function updateLineNumbers() {
const lines = textarea.value.split('\n').length;
lineNumbers.innerHTML = Array(lines).fill('<span></span>').map((_, i) => `<span>${i + 1}</span>`).join('<br>');
}
function syncScroll() {
lineNumbers.scrollTop = textarea.scrollTop;
}
updateLineNumbers(); // 初始化
利用 contenteditable 模拟编辑器
通过 <div contenteditable> 替代 <textarea> 实现更复杂的行号样式。
<div class="editor">
<div class="gutter"></div>
<div class="content" contenteditable></div>
</div>
document.querySelector('.content').addEventListener('input', function() {
const lines = this.textContent.split('\n').length;
document.querySelector('.gutter').innerHTML =
Array(lines).fill().map((_, i) => i + 1).join('<br>');
});
使用第三方库快速实现
对于复杂需求,可考虑现成库如:
- CodeMirror: 支持行号、语法高亮等专业功能
- PrismJS: 轻量级代码高亮工具
- Ace Editor: 云端代码编辑器解决方案
// CodeMirror 示例
const editor = CodeMirror.fromTextArea(document.getElementById('code'), {
lineNumbers: true,
mode: 'htmlmixed'
});
关键注意事项
- 性能优化: 对于大文件需使用虚拟滚动技术
- 行高同步: 确保行号与文本的行高一致
- 移动端适配: 触控事件需特殊处理
- 无障碍访问: 为行号添加 ARIA 属性
以上方案可根据项目需求选择简单实现或专业编辑器集成,平衡功能与复杂度。
BbS.okapop082.sbs/PoSt/1122_224518.HtM
BbS.okapop083.sbs/PoSt/1122_708127.HtM
BbS.okapop084.sbs/PoSt/1122_494351.HtM
BbS.okapop085.sbs/PoSt/1122_175207.HtM
BbS.okapop086.sbs/PoSt/1122_365993.HtM
BbS.okapop087.sbs/PoSt/1122_826691.HtM
BbS.okapop088.sbs/PoSt/1122_750775.HtM
BbS.okapop090.sbs/PoSt/1122_071754.HtM
BbS.okapop091.sbs/PoSt/1122_166804.HtM
BbS.okapop092.sbs/PoSt/1122_776480.HtM
BbS.okapop082.sbs/PoSt/1122_554803.HtM
BbS.okapop083.sbs/PoSt/1122_041298.HtM
BbS.okapop084.sbs/PoSt/1122_956656.HtM
BbS.okapop085.sbs/PoSt/1122_750644.HtM
BbS.okapop086.sbs/PoSt/1122_790204.HtM
BbS.okapop087.sbs/PoSt/1122_185860.HtM
BbS.okapop088.sbs/PoSt/1122_767832.HtM
BbS.okapop090.sbs/PoSt/1122_687831.HtM
BbS.okapop091.sbs/PoSt/1122_893832.HtM
BbS.okapop092.sbs/PoSt/1122_153690.HtM
BbS.okapop082.sbs/PoSt/1122_627519.HtM
BbS.okapop083.sbs/PoSt/1122_661824.HtM
BbS.okapop084.sbs/PoSt/1122_448898.HtM
BbS.okapop085.sbs/PoSt/1122_220808.HtM
BbS.okapop086.sbs/PoSt/1122_630405.HtM
BbS.okapop087.sbs/PoSt/1122_172584.HtM
BbS.okapop088.sbs/PoSt/1122_999847.HtM
BbS.okapop090.sbs/PoSt/1122_487585.HtM
BbS.okapop091.sbs/PoSt/1122_796111.HtM
BbS.okapop092.sbs/PoSt/1122_205288.HtM
BbS.okapop082.sbs/PoSt/1122_059389.HtM
BbS.okapop083.sbs/PoSt/1122_470008.HtM
BbS.okapop084.sbs/PoSt/1122_440126.HtM
BbS.okapop085.sbs/PoSt/1122_407614.HtM
BbS.okapop086.sbs/PoSt/1122_118232.HtM
BbS.okapop087.sbs/PoSt/1122_196484.HtM
BbS.okapop088.sbs/PoSt/1122_348071.HtM
BbS.okapop090.sbs/PoSt/1122_160719.HtM
BbS.okapop091.sbs/PoSt/1122_329550.HtM
BbS.okapop092.sbs/PoSt/1122_972763.HtM
BbS.okapop082.sbs/PoSt/1122_429889.HtM
BbS.okapop083.sbs/PoSt/1122_689816.HtM
BbS.okapop084.sbs/PoSt/1122_863236.HtM
BbS.okapop085.sbs/PoSt/1122_358969.HtM
BbS.okapop086.sbs/PoSt/1122_833713.HtM
BbS.okapop087.sbs/PoSt/1122_751477.HtM
BbS.okapop088.sbs/PoSt/1122_733318.HtM
BbS.okapop090.sbs/PoSt/1122_277191.HtM
BbS.okapop091.sbs/PoSt/1122_543324.HtM
BbS.okapop092.sbs/PoSt/1122_516966.HtM
BbS.okapop082.sbs/PoSt/1122_598765.HtM
BbS.okapop083.sbs/PoSt/1122_009498.HtM
BbS.okapop084.sbs/PoSt/1122_517015.HtM
BbS.okapop085.sbs/PoSt/1122_192073.HtM
BbS.okapop086.sbs/PoSt/1122_192353.HtM
BbS.okapop087.sbs/PoSt/1122_750289.HtM
BbS.okapop088.sbs/PoSt/1122_127161.HtM
BbS.okapop090.sbs/PoSt/1122_959008.HtM
BbS.okapop091.sbs/PoSt/1122_879886.HtM
BbS.okapop092.sbs/PoSt/1122_631840.HtM
BbS.okapop082.sbs/PoSt/1122_536122.HtM
BbS.okapop083.sbs/PoSt/1122_181611.HtM
BbS.okapop084.sbs/PoSt/1122_903840.HtM
BbS.okapop085.sbs/PoSt/1122_714168.HtM
BbS.okapop086.sbs/PoSt/1122_497412.HtM
BbS.okapop087.sbs/PoSt/1122_683696.HtM
BbS.okapop088.sbs/PoSt/1122_209108.HtM
BbS.okapop090.sbs/PoSt/1122_446257.HtM
BbS.okapop091.sbs/PoSt/1122_252763.HtM
BbS.okapop092.sbs/PoSt/1122_932766.HtM
BbS.okapop082.sbs/PoSt/1122_265317.HtM
BbS.okapop083.sbs/PoSt/1122_442769.HtM
BbS.okapop084.sbs/PoSt/1122_054561.HtM
BbS.okapop085.sbs/PoSt/1122_747716.HtM
BbS.okapop086.sbs/PoSt/1122_467500.HtM
BbS.okapop087.sbs/PoSt/1122_840624.HtM
BbS.okapop088.sbs/PoSt/1122_597568.HtM
BbS.okapop090.sbs/PoSt/1122_658222.HtM
BbS.okapop091.sbs/PoSt/1122_500467.HtM
BbS.okapop092.sbs/PoSt/1122_421634.HtM
