files/en-us/web/css/reference/properties/caret-shape/index.md
{{SeeCompatTable}}
The caret-shape CSS property sets the shape of the insertion caret, the visible marker that appears in editable elements to indicate where the next character will be inserted or deleted.
{{InteractiveExample("CSS Demo: caret-shape")}}
caret-shape: auto;
caret-shape: bar;
caret-shape: block;
caret-shape: underscore;
<section class="default-example container" id="default-example">
<div>
<label for="example-element">Edit text field:</label>
<input id="example-element" type="text" value="Sample text" />
</div>
</section>
div {
text-align: left;
}
#example-element {
font-size: 1.2rem;
padding: 8px;
width: 300px;
}
/* Keyword values */
caret-shape: auto;
caret-shape: bar;
caret-shape: block;
caret-shape: underscore;
/* Global values */
caret-shape: inherit;
caret-shape: initial;
caret-shape: revert;
caret-shape: revert-layer;
caret-shape: unset;
auto
bar
block
underscore
The insertion caret is the blinking cursor that indicates where text will be inserted when typing. Different caret shapes can provide visual feedback about the current editing mode or offer visual customization.
Text editors typically operate in one of two modes:
Different caret shapes have traditional uses, for example:
The caret-shape property affects how the caret is visually rendered but doesn't change its logical position in the text. The caret always represents the insertion point between characters, regardless of its visual shape.
The caret shape adapts to the {{cssxref("writing-mode")}} of the text. In vertical writing modes, bar carets become horizontal, and underscore carets position themselves appropriately relative to the text direction.
{{cssinfo}}
{{csssyntax}}
This example shows how to create a vintage terminal interface using caret-shape: block with animated caret color, replacing the old technique of using borders.
The key part is using the modern caret properties instead of the old border-based technique. We set the caret to block shape, disable the default blinking, and create our own custom animation.
<label for="terminal">Enter a command</label>
<div class="old-screen">
<span>></span>
<textarea id="terminal" class="terminal-input"></textarea>
</div>
label {
background: #092104;
display: block;
padding: 10px 20px;
color: #00ad00;
font-weight: bold;
font-family: monospace;
}
.old-screen {
background: repeating-linear-gradient(
#092104,
#092104 2px,
#123208 2px,
#123208 4px
);
height: 140px;
display: flex;
align-items: flex-start;
padding: 20px;
font-family: monospace;
}
span {
display: inline-block;
padding: 2px 5px;
color: #00ad00;
font-weight: bold;
margin-right: 8px;
}
.terminal-input {
background: transparent;
height: 100%;
border: none;
color: #00ad00;
font-family: inherit;
font-size: 1rem;
outline: none;
flex: 1;
resize: none;
}
.terminal-input {
caret-shape: block;
caret-animation: manual;
animation: old-caret 2s infinite;
}
@keyframes old-caret {
0%,
50% {
caret-color: #00ad00;
}
75%,
100% {
caret-color: transparent;
}
}
{{EmbedLiveSample('Retro_terminal_with_animated_caret', 550, 215)}}
This example demonstrates using caret-shape: underscore to create a console-style interface where the underscore caret complements the terminal aesthetic.
<label for="console">Enter a command</label>
<div class="console-demo">
<div class="console-output">
<p>user@host:css-ui-4 $ ls -a</p>
<p>. .. Overview.bs Overview.html</p>
</div>
<div class="console-input">
<span class="prompt">user@host:css-ui-4 $ </span>
<input type="text" id="console" class="console" value="cd" />
</div>
</div>
label {
background: #2a2a2c;
color: white;
display: block;
padding: 10px 20px;
font-weight: bold;
font-family: monospace;
}
.console-demo {
background: black;
color: white;
font-family: monospace;
padding: 10px 20px;
height: 60px;
}
.console-output {
margin-bottom: 0.5rem;
}
.console-output p {
margin: 0 0.25rem;
}
.console-input {
display: flex;
align-items: center;
}
.prompt {
margin-right: 0;
}
.console {
background: transparent;
border: none;
color: white;
padding-left: 1ch;
font-family: inherit;
outline: none;
flex: 1;
}
.console {
caret-shape: underscore;
}
{{EmbedLiveSample('Console_interface_with_underscore_caret', 550, 115)}}
{{Specifications}}
{{Compat}}