HTML - Draw An X in CSS - Stack Overflow
HTML - Draw An X in CSS - Stack Overflow
Asked 9 years, 6 months ago Modified 4 months ago Viewed 166k times
69
I'd like to draw a white X in this div somehow so that it looks more like
Anyway to do this in CSS or is it going to be easier to just draw this in Photoshop and use the
image as the div background? The div code just looks like
div {
height: 100px;
width: 100px;
background-color: #FA6900;
border-radius: 5px;
}
Share Improve this question edited Feb 15, 2015 at 14:47 asked Sep 20, 2013 at 15:31
Follow Gildas.Tambo natsuki_2002
22k 7 50 78 23.8k 19 45 50
can you not just use the letter X and give it an absolute position and color white and place on top of the
background – topcat3 Sep 20, 2013 at 15:36
1 @topcat3 — Think how that would sound in a screen reader. – Quentin Mar 2, 2020 at 10:24
Sorted by:
15 Answers Highest score (default)
div {
height: 100px;
width: 100px;
background-color: #FA6900;
border-radius: 5px;
position: relative;
}
div:after {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
content: "\274c"; /* use the hex value here... */
font-size: 50px;
color: #FFF;
line-height: 100px;
text-align: center;
}
Cross-Browser Issue
The cross-mark entity does not display with Safari or Chrome. However, the same entity
displays well in Firefox, IE and Opera.
It is safe to use the smaller but similarly shaped multiplication sign entity, × which
displays as ×.
Share Improve this answer Follow edited Jul 7, 2015 at 19:23 answered Sep 20, 2013 at 15:37
Marc Audet
45.6k 11 63 83
6 Any idea how to force a color on the cross mark in Safari? It is always rendered as red... – minlare Jul 7,
2015 at 14:20
7 The hex code for the Unicode character 'MULTIPLICATION SIGN' is \D7 (U+00D7), thus the CSS code
would be content: "\D7"; – Spyryto Sep 20, 2017 at 10:19
72
single element solution:
body{
background:blue;
}
div{
width:40px;
height:40px;
background-color:red;
position:relative;
border-radius:6px;
box-shadow:2px 2px 4px 0 white;
}
div:before,div:after{
content:'';
position:absolute;
width:36px;
height:4px;
background-color:white;
border-radius:2px;
top:16px;
box-shadow:0 0 2px 0 #ccc;
}
div:before{
-webkit-transform:rotate(45deg);
-moz-transform:rotate(45deg);
transform:rotate(45deg);
left:2px;
}
div:after{
-webkit-transform:rotate(-45deg);
-moz-transform:rotate(-45deg);
transform:rotate(-45deg);
right:2px;
}
<div></div>
Probably overly complex for this application, but a very good demonstration of what can be done with
transforms. – Marc Audet Sep 20, 2013 at 16:24
15 This is the real answer! Nice. Definitely not "overly complex" it is perfect because it doesn't use a font
and it can scale to any size. Upvoted! – FirstVertex Sep 10, 2014 at 20:57
2 I completely agree with H Dog, this is the correct answer. Using the ❌ in Chrome displays a
question mark in a box. Using a font angles the ends of the cross. Well done Tambo!! – Rogala Mar 9,
2015 at 16:01
1 Amazing solution, upvoted. I've added an answer which adds adaptive math to your work, full credit for
the solution itself given to you of course. – Rashid Clark Jul 10, 2020 at 18:08
Yet another pure CSS solution (i.e. without the use of images, characters or additional fonts),
based on @Bansoa is the answer's answer .
43
I've simplified it and added a bit of Flexbox magic to make it responsive.
Cross in this example automatically scales to any square container, and to change the
thickness of its lines one have just to tune height: 4px; (to make a cross truly responsive,
you may want to set the height in percents or other relative units).
div {
position: relative;
height: 150px; /* this can be anything */
width: 150px; /* ...but maintain 1:1 aspect ratio */
display: flex;
flex-direction: column;
justify-content: center;
}
div::before,
div::after {
position: absolute;
content: '';
width: 100%;
height: 4px; /* cross thickness */
background-color: black;
}
div::before {
transform: rotate(45deg);
}
div::after {
transform: rotate(-45deg);
}
<div></div>
Run code snippet Expand snippet
Share Improve this answer Follow edited Aug 2, 2021 at 20:21 answered Nov 15, 2016 at 20:54
Neurotransmitter
6,061 2 50 37
1 Suppose I want it to work with non-square DIVs and to not preserve aspect ratio? – Ross Presser Oct 4,
2018 at 13:15
1 @RossPresser you can use something like transform: scale(1, 0.75); to scale the cross to
whatever shape you want. It has to be applied to the <div> . – Neurotransmitter Feb 5, 2020 at 10:26
21
demo: https://codepen.io/JasonWoof/pen/rZyRKR
code:
<span class="close-x"></span>
<style>
.close-x {
display: inline-block;
width: 20px;
height: 20px;
border: 7px solid #f56b00;
background:
linear-gradient(45deg, rgba(0,0,0,0) 0%,rgba(0,0,0,0) 43%,#fff
45%,#fff 55%,rgba(0,0,0,0) 57%,rgba(0,0,0,0) 100%),
linear-gradient(135deg, #f56b00 0%,#f56b00 43%,#fff 45%,#fff
55%,#f56b00 57%,#f56b00 100%);
}
</style>
Yet another attempt... this one uses ×. A lot of the examples on this page only show for me as
a box, but × works
19
HTML
<div class="close"></div>
CSS
.close {
height: 100px;
width: 100px;
background-color: #FA6900;
border-radius: 5px;
}
.close:after {
position:relative;
content:"\d7";
font-size:177px;
color:white;
font-weight:bold;
top:-53px;
left:-2px
}
JSFIDDLE
Share Improve this answer Follow answered Sep 20, 2013 at 15:52
Gray
7,020 2 29 51
@MarcAudet Thanks for that link. I hadn't seen that site before, and it is pretty helpful. For your answer
though, I only see boxes. Do you have a Mac by any chance? – Gray Sep 20, 2013 at 16:35
I am working on a Windows 7 machine. So you don't see the cross mark in my fiddle? – Marc Audet Sep
20, 2013 at 17:05
Correct. I am using Windows 7 with Chrome (same results with IE/FF). Here is a screencap:
i.imgur.com/u9UwCQZ.png – Gray Sep 20, 2013 at 17:27
Also a nice solution, especially with the entity. I just had to reposition it a bit to center the 'x' - see
updated jsFiddle – Netsurfer Sep 20, 2013 at 17:34
You could just put the letter X in the HTML inside the div and then style it with css.
HTML:
<div id="orangeBox">
<span id="x">X</span>
</div>
CSS:
#orangeBox {
background: #f90;
color: #fff;
font-family: 'Helvetica', 'Arial', sans-serif;
font-size: 2em;
font-weight: bold;
text-align: center;
width: 40px;
height: 40px;
border-radius: 5px;
}
Share Improve this answer Follow answered Sep 20, 2013 at 15:45
AJT
334 2 6 29
8 Since this was selected, I will extract the (possibly) useful info from my answer and put it here.
× might look nicer than an X depending on your font. – Gray Sep 20, 2013 at 15:55
6 All other answers proposing the use of a pseudo element ( ::before or ::after ) are much more to
prefer, because this would be semantically correct in contrast to this answer. That the questioner has
chosen this answer shows that there might be a lack of understanding ...! – Netsurfer Sep 20, 2013 at
16:05
1 @Netsurfer I agree that using the pseudo-elements are preferred, but I am not sure I would say that
doing this is "semantically incorrect." There are many benefits to using a pseudo-element (I think the
most important is the fact that you cannot select the text), but that doesn't make this solution wrong.
– Gray Sep 20, 2013 at 16:33
4 @Gray: It does! Because if the 'X' has a 'function' then it should be an <input> or <button>
element. And if not, it is purely "presentational markup". So it is wrong in both cases. And assumed it
serves only for presentational purposes then it should be done with CSS and not adding any non-
content to the markup. – Netsurfer Sep 20, 2013 at 17:06
@Netsurfer Interesting point of view. Thanks for the clarification. I can see your point when you put it
like that. – Gray Sep 20, 2013 at 17:26
11 div {
height: 100px;
width: 100px;
background-color: #FA6900;
border-radius: 5px;
}
div:after {
content: "X";
font-size: 2em;
color: #FFF;
}
Share Improve this answer Follow answered Sep 20, 2013 at 15:36
António Regadas
724 4 11
9
#x{
width: 20px;
height: 20px;
background-color:orange;
position:relative;
border-radius:2px;
}
#x::after,#x::before{
position:absolute;
top:9px;
left:0px;
content:'';
display:block;
width:20px;
height:2px;
background-color:red;
}
#x::after{
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
#x::before{
-webkit-transform: rotate(-45deg);
-moz-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
}
<div id=x>
</div>
Share Improve this answer Follow answered Sep 22, 2014 at 15:15
user669677
I love this question! You could easily adapt my code below to be a white × on
an orange square:
8
$pFontSize: 18px;
p {
font-size: $pFontSize;
}
span{
font-weight: bold;
}
.x-overlay,
.x-emoji-overlay {
position: relative;
}
.x-overlay,
.x-emoji-overlay {
&:after {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
color: red;
text-align: center;
}
}
.x-overlay:after {
content: '\d7';
font-size: 3 * $pFontSize;
line-height: $pFontSize;
opacity: 0.7;
}
.x-emoji-overlay:after {
content: "\274c";
padding: 3px;
font-size: 1.5 * $pFontSize;
line-height: $pFontSize;
opacity: 0.5;
}
.strike {
position: relative;
display: inline-block;
}
.strike::before {
content: '';
border-bottom: 2px solid red;
width: 110%;
position: absolute;
left: -2px;
top: 46%;
}
.crossed-out {
/*inspired by https://www.tjvantoll.com/2013/09/12/building-custom-text-
strikethroughs-with-css/*/
position: relative;
display: inline-block;
&::before,
&::after {
content: '';
width: 110%;
position: absolute;
left: -2px;
top: 45%;
opacity: 0.7;
}
&::before {
border-bottom: 2px solid red;
-webkit-transform: skewY(-20deg);
transform: skewY(-20deg);
}
&::after {
border-bottom: 2px solid red;
-webkit-transform: skewY(20deg);
transform: skewY(20deg);
}
}
Share Improve this answer Follow answered Mar 11, 2017 at 15:51
Ryan
21.9k 29 172 348
5 text-align: center;
font-size: 120px;
line-height: 100px;
color: white;
font-family: monospace;
http://jsfiddle.net/Ncvyj/1/
Share Improve this answer Follow answered Sep 20, 2013 at 15:40
Explosion Pills
187k 51 325 398
Here is a single div and dynamic size version without using pseudo element.
4
body {
display: flex;
gap: 30px;
}
.x {
--color: #444;
--l: 5px; /* line-width */
width: 50px;
height: 50px;
background: linear-gradient(to top right, transparent calc(50% - var(--l) /
2), var(--color) calc(50% - var(--l) / 2) calc(50% + var(--l) / 2), transparent
calc(50% + var(--l) / 2)),
linear-gradient(to bottom right, transparent calc(50% - var(--l)
/ 2), var(--color) calc(50% - var(--l) / 2) calc(50% + var(--l) / 2),
transparent calc(50% + var(--l) / 2));
2 <span>×</span>
This technically puts the multiplication symbol there, but no one will really notice (found some
websites that have a popup box and most use this for the x button).
If you need more control you can style it with color opacity etc...
example (index.html)
<span class="x-button">×</span>
styles.css
span.x-button {
color:gray;
opacity:0.7;
font-size:1.5em;
}
<span>×</span>
<span class="x-button">×</span>
Note: you can highlight this unlike other solutions, but this may not be desirable depending on
the application. You can solve this in pure css too, just add
user-select:none;
-webkit-user-select:none;
Share Improve this answer Follow edited Nov 23, 2022 at 23:44 answered Nov 23, 2022 at 23:29
Fighter178
135 1 8
You also shouldn't really need to worry about the aspect ratio as most English text is already 1:1.
(though it is often centered). – Fighter178 Nov 23, 2022 at 23:46
HTML
1 <div class="close-orange"></div>
CSS
.close-orange {
height: 100px;
width: 100px;
background-color: #FA6900;
border-radius: 5px;
}
.close-orange:before,.close-orange:after{
content:'';
position:absolute;
width: 50px;
height: 4px;
background-color:white;
border-radius:2px;
top: 55px;
}
.close-orange:before{
-webkit-transform:rotate(45deg);
-moz-transform:rotate(45deg);
transform:rotate(45deg);
left: 32.5px;
}
.close-orange:after{
-webkit-transform:rotate(-45deg);
-moz-transform:rotate(-45deg);
transform:rotate(-45deg);
left: 32.5px;
}
https://jsfiddle.net/cooperwebdesign/dw4xd289/
Share Improve this answer Follow answered Aug 20, 2016 at 11:21
Dennis Sørensen
21 2
:root {
/* Width and height of the box containing the "X" */
--BUTTON_W: 40px;
/* This is the length of either of the 2 lines which form the "X", as a
percentage of the width of the button. */
--CLOSE_X_W: 95%;
/* Thickness of the lines of the "X" */
--CLOSE_X_THICKNESS: 4px;
}
body{
background:blue;
}
div{
width: var(--BUTTON_W);
height: var(--BUTTON_W);
background-color:red;
position: relative;
border-radius: 6px;
box-shadow: 2px 2px 4px 0 white;
}
/* The "X" in the button. "before" and "after" each represent one of the two
lines of the "X" */
div:before,div:after{
content: '';
position: absolute;
width: var(--CLOSE_X_W);
height: var(--CLOSE_X_THICKNESS);
background-color:white;
border-radius: 2px;
top: calc(50% - var(--CLOSE_X_THICKNESS) / 2);
box-shadow: 0 0 2px 0 #ccc;
}
/* One line of the "X" */
div:before{
-webkit-transform:rotate(45deg);
-moz-transform: rotate(45deg);
transform: rotate(45deg);
left: calc((100% - var(--CLOSE_X_W)) / 2);
}
/* The other line of the "X" */
div:after{
-webkit-transform:rotate(-45deg);
-moz-transform: rotate(-45deg);
transform: rotate(-45deg);
right: calc((100% - var(--CLOSE_X_W)) / 2);
}
<div></div>
Share Improve this answer Follow answered Jul 10, 2020 at 18:04
Rashid Clark
71 1 2
-1 <span class='act-html-check'></span>
<span class='act-html-cross'><span class='act-html-cross'></span></span>
<style type="text/css">
span.act-html-check {
display: inline-block;
width: 12px;
height: 18px;
border: solid limegreen;
border-width: 0 5px 5px 0;
transform: rotate( 45deg);
}
span.act-html-cross {
display: inline-block;
width: 10px;
height: 10px;
border: solid red;
border-width: 0 5px 5px 0;
transform: rotate( 45deg);
position: relative;
}