Styling text input caret

HtmlCssInputCaret

Html Problem Overview


I want to style the caret of a focused <input type='text'/>. Specifically, the color and thickness.

Html Solutions


Solution 1 - Html

'Caret' is the word you are looking for. I do believe though, that it is part of the browsers design, and not within the grasp of css.

However, here is an interesting write up on simulating a caret change using Javascript and CSS http://www.dynamicdrive.com/forums/showthread.php?t=17450 It seems a bit hacky to me, but probably the only way to accomplish the task. The main point of the article is:

> We will have a plain textarea somewhere in the screen out of the view > of the viewer and when the user clicks on our "fake terminal" we will > focus into the textarea and when the user starts typing we will simply > append the data typed into the textarea to our "terminal" and that's > that.

HERE is a demo in action


2018 update

There is a new css property caret-color which applies to the caret of an input or contenteditable area. The support is growing but not 100%, and this only affects color, not width or other types of appearance.

input{
  caret-color: rgb(0, 200, 0);
}

<input type="text"/>

Solution 2 - Html

If you are using a webkit browser you can change the color of the caret by following the next CSS snippet. I'm not sure if It's possible to change the format with CSS.

input,
textarea {
    font-size: 24px;
    padding: 10px;
    
    color: red;
    text-shadow: 0px 0px 0px #000;
    -webkit-text-fill-color: transparent;
}

input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
    color:
    text-shadow: none;
    -webkit-text-fill-color: initial;
}

Here is an example: http://jsfiddle.net/8k1k0awb/

Solution 3 - Html

In CSS3, there is now a native way to do this, without any of the hacks suggested in the existing answers: the caret-color property.

There are a lot of things you can do to with the caret, as seen below. It can even be animated.

/* Keyword value */
caret-color: auto;
color: transparent;
color: currentColor;

/* <color> values */
caret-color: red;
caret-color: #5729e9;
caret-color: rgb(0, 200, 0);
caret-color: hsla(228, 4%, 24%, 0.8);

The caret-color property is supported from Firefox 55, and Chrome 60. Support is also available in the Safari Technical Preview and in Opera (but not yet in Edge). You can view the current support tables here.

Solution 4 - Html

Here are some vendors you might me looking for

::-webkit-input-placeholder {color: tomato}
::-moz-placeholder          {color: tomato;} /* Firefox 19+ */
:-moz-placeholder           {color: tomato;} /* Firefox 18- */
:-ms-input-placeholder      {color: tomato;}

You can also style different states, such as focus

:focus::-webkit-input-placeholder {color: transparent}
:focus::-moz-placeholder          {color: transparent}
:focus:-moz-placeholder           {color: transparent}
:focus:-ms-input-placeholder      {color: transparent}

You can also do certain transitions on it, like

::-VENDOR-input-placeholder       {text-indent: 0px;   transition: text-indent 0.3s ease;}
:focus::-VENDOR-input-placeholder  {text-indent: 500px; transition: text-indent 0.3s ease;}

Solution 5 - Html

It is enough to use color property alongside with -webkit-text-fill-color this way:

<input type="text"/>

    input {
        color: red; /* color of caret */
        -webkit-text-fill-color: black; /* color of text */
    }

Works in WebKit browsers (but not in iOS Safari, where is still used system color for caret) and also in Firefox.

> The -webkit-text-fill-color CSS property specifies the fill color of > characters of text. If this property is not set, the value of the > color property is used. MDN

So this means we set text color with text-fill-color and caret color with standard color property. In unsupported browser, caret and text will have same color – color of the caret.

Solution 6 - Html

input{
  caret-color: rgb(0, 200, 0);
}

<input type="text"/>

Solution 7 - Html

it is simple. Just add the caret-color attribute like this:

* {cursor: url(http://labs.semplice.com/wp-content/uploads/2020/02/custom-cursor-arrow.png) 20 20, auto;}
input, div {padding: 20px;}

<input style="caret-color: rgb(0, 200, 0);">

<br>
<textarea style="caret-color: blue;"></textarea>

<br>
<div contenteditable style="padding: 5px; border: 1px solid black;border-color: black;caret-color: red"></div>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRandomblueView Question on Stackoverflow
Solution 1 - HtmlMichael JasperView Answer on Stackoverflow
Solution 2 - HtmlNestor BritezView Answer on Stackoverflow
Solution 3 - HtmlSacha NacarView Answer on Stackoverflow
Solution 4 - HtmlSergey KhmelevskoyView Answer on Stackoverflow
Solution 5 - HtmlVeldaView Answer on Stackoverflow
Solution 6 - HtmlGtiClickerView Answer on Stackoverflow
Solution 7 - HtmlTiago Rangel de SousaView Answer on Stackoverflow