Come colpire obliquamente con css


97

Ho bisogno di qualcosa di simile:

Come si può ottenere questo risultato con css? So che un modo è usare l'immagine di sfondo, ma posso farlo solo con CSS senza alcuna immagine?

Risposte:


188

C'è un modo hacky per farlo, usando lo :beforepseudo elemento. Dai :beforeun bordo, quindi ruotalo con una trasformazione CSS. In questo modo non vengono aggiunti elementi aggiuntivi al DOM e l'aggiunta / rimozione del barrato è semplice come aggiungere / rimuovere la classe.

Ecco una demo

Avvertenze

  • Funzionerà solo fino a IE8. IE7 non supporta:before , tuttavia si degraderà con grazia nei browser che lo supportano:before ma non supportano le trasformazioni CSS.
  • L'angolo di rotazione è fisso. Se il testo è più lungo, la linea non toccherà gli angoli del testo. Sii consapevole di questo.

CSS

.strikethrough {
  position: relative;
}
.strikethrough:before {
  position: absolute;
  content: "";
  left: 0;
  top: 50%;
  right: 0;
  border-top: 1px solid;
  border-color: inherit;

  -webkit-transform:rotate(-5deg);
  -moz-transform:rotate(-5deg);
  -ms-transform:rotate(-5deg);
  -o-transform:rotate(-5deg);
  transform:rotate(-5deg);
}

HTML

<span class="strikethrough">Deleted text</span>

Non penso che funzioni in IE8 .. non ha alcun analogo a transformquello che conosco a meno che non possa funzionare confilter
Explosion Pills

3
Hai ragione, scusa. IE8 si degraderà con grazia in una normale linea barrata. Avrei dovuto chiarirlo
Bojangles

Ciao @ Bojangles, sto provando ad applicarlo a un elemento TD, ma sembra andare un po 'storto in Firefox .. jsfiddle.net/Ms4Qy Qualche idea del perché potrebbe essere? Grazie
Tom Hunter


3
Un altro avvertimento da considerare: il barrato non verrà visualizzato come previsto se il testo si interrompe su due righe: d.pr/i/1dKP5
Nick

59

Puoi usare lo sfondo linear-gradient con currentColorper evitare l'hardcoding del colore del carattere:

.strikediag {
  background: linear-gradient(to left top, transparent 47.75%, currentColor 49.5%, currentColor 50.5%, transparent 52.25%);
}
.withpadding {
  padding: 0 0.15em;
}
The value is <span class="strikediag">2x</span> 3x<br>
The number is <span class="strikediag">1234567890</span>.
<p>
The value is <span class="strikediag withpadding">2x</span>3x<br>
The number is <span class="strikediag withpadding">1234567890</span>.

Se non è necessario che l'elemento sia completamente in linea, è possibile utilizzare uno pseudo elemento per posizionare la linea sopra l'elemento. In questo modo l'angolo può essere regolato cambiando la dimensione dello pseudo elemento:

.strikediag {
  display: inline-block;
  position: relative;
}
.strikediag::before {
  content: '';
  position: absolute;
  left: -0.1em;
  right: -0.1em;
  top: 0.38em;
  bottom: 0.38em;
  background: linear-gradient(to left top, transparent 45.5%, currentColor 47.5%, currentColor 52.5%, transparent 54.5%);
  pointer-events: none;
}
The value is <span class="strikediag">2x</span> 3x<br>
The number is <span class="strikediag">1234567890</span>.


7
del {
    position:relative;
    text-decoration:none;
}
del::after {
    content:"";
    position:absolute;
    top:50%; left:0; width:100%; height:1px; 
    background:black;
    transform:rotate(-7deg);
}

4

Penso che potresti probabilmente applicare un effetto di rotazione a una riga orizzontale. Qualcosa di simile a:

<html>
    <body>
        <hr />
        123456
    </body>
</html>

Con il CSS:

HR
{
   width: 50px;
   position: absolute;
   background-color: #000000;
   color: #000000;
   border-color: #000000;
   transform:rotate(-7deg);
   -ms-transform:rotate(-7deg);
   -moz-transform:rotate(-7deg);
   -webkit-transform:rotate(-7deg);
   -o-transform:rotate(-7deg);
} 

Violino

Il tuo chilometraggio può variare a seconda del browser e della versione, quindi non sono sicuro se ricorrere a questo. Ad esempio, potresti dover creare un codice VML originale per supportare le versioni precedenti di IE.


Nota 1: -7gradi, non +7; nota 2: HRè grigio in Chrome; è possibile sovrascrivere?
John Dvorak

E per quanto riguarda tutti i browser che non supportano le trasformazioni CSS3?
Mooseman

Sì, credo che dovrai impostare border-colore background-color. Aggiornato Fiddle
Mike Christensen

2

Gradiente CSS3

background-image: linear-gradient(left bottom, rgb(234,20,136) 0%, rgb(255,46,164) 50%, rgb(255,74,197) 0%);
background-image: -o-linear-gradient(left bottom, rgb(234,20,136) 0%, rgb(255,46,164) 50%, rgb(255,74,197) 0%);
background-image: -moz-linear-gradient(left bottom, rgb(234,20,136) 0%, rgb(255,46,164) 50%, rgb(255,74,197) 0%);
background-image: -webkit-linear-gradient(left bottom, rgb(234,20,136) 0%, rgb(255,46,164) 50%, rgb(255,74,197) 0%);
background-image: -ms-linear-gradient(left bottom, rgb(234,20,136) 0%, rgb(255,46,164) 50%, rgb(255,74,197) 0%);

background-image: -webkit-gradient( linear, left bottom,right top,color-stop(0, rgb(234,20,136)), color-stop(0.5, rgb(255,46,164)), color-stop(0, rgb(255,74,197)) );

Il mio esempio non soddisferà perfettamente le tue esigenze ma, per maggiori informazioni e divertenti modifiche, vedi http://gradients.glrzad.com/ .

Quello che devi fare è creare un background-gradientdi white-black-whitee posizionarti opacityin qualcosa di simile 48% 50% 52%.


questo mi dà blocchi, non linee.
ashleedawg

0

Non credo che ci sia una soluzione CSS sostenibile a questo.

La mia soluzione CSS pura sarebbe quella di posizionare un altro elemento di testo dietro il tuo primo elemento di testo che è identico in numero di caratteri (i caratteri sono ""), una declinazione del testo di line-through e una trasformazione di rotazione.

Qualcosa di simile a:

<html>
<head>
<style>
.strike{
 text-decoration: line-through;
-webkit-transform: rotate(344deg);
-moz-transform: rotate(344deg);
-o-transform: rotate(344deg);}
</style>
</head>
<body>
<p>Text to display</p>
<p class='strike'>               </p>
</body>

Esempio di rotazione del testo

Non vedo l'ora di ricevere risposte migliori da altri utenti.


0

Questa è una vecchia domanda, ma in alternativa puoi usare CSS3 Linear Gradients per esempio ( http://codepen.io/yusuf-azer/pen/ojJLoG ).

Per una spiegazione approfondita e un controllo MENO Soluzione

http://www.yusufazer.com/tutorials-how-to/how-to-make-a-diagonal-line-through-with-css3/

span.price--line-through {
  background-color: transparent;
  background-image: -webkit-gradient(linear, 19.1% -7.9%, 81% 107.9%, color-stop(0, #fff), color-stop(.475, #fff), color-stop(.5, #000), color-stop(.515, #fff), color-stop(1, #fff));
  background-image: -webkit-repeating-linear-gradient(287deg, #fff 0%, #fff 47.5%, #000 50%, #fff 51.5%, #fff 100%);
  background-image: repeating-linear-gradient(163deg, #fff 0%, #fff 47.5%, #000 50%, #fff 51.5%, #fff 100%);
  background-image: -ms-repeating-linear-gradient(287deg, #fff 0%, #fff 47.5%, #000 50%, #fff 51.5%, #fff 100%);
} 

-1

L'ho fatto in questo modo usando un SVG nell'HTM con una classe CSS:

HTML:

<ul>
<li>Regular Price: <div class="zIndex-10a">$4.50</div><div class="zIndex-10b"><svg height="16" width="5"><line x1="0" y1="20" x2="40" y2="0" class="Strike-01a"></svg></div></li>
</ul>

CSS:

/* -- CONTAINS TEXT TO STRIKE ---- */ .zIndex-10a { display: inline-block; position: relative;  left:  0px; z-index: 10; }
/* -- CONTAINS SVG LINE IN HTML -- */ .zIndex-10b { display: inline-block; position: relative; right: 40px; z-index: 11; }
/* -- SVG STROKE PROPERTIES ------ */ .Strike-01a { stroke: rgb(255,0,0); stroke-width:2; }

Potrebbero esserci modi più semplici a questo punto. L'ho appena preparato in un pizzico per la mia pagina dell'offerta speciale dei dettagli del prodotto. Spero che aiuti qualcuno.


Deve mancare qualcosa perché questo non funziona in uno snippet così
com'è

-1

Provare

.mydiv {
    background-color: #990000;
    color: #FFFF00;
    font-size: 2em;
    padding-top: 10px;
    padding-bottom: 10px;
    border-radius: 15px;
    max-width: 300px;
    width: 100%;
}
.strikethrough-100p, .strikethrough-50p{
  position: relative;
 text-align: center;
}
.strikethrough-100p:before {
  position: absolute;
  content: "";
  left: 0;
  top: 50%;
  right: 0;
  border-top: 3px solid;
  border-color: inherit;

  -webkit-transform:rotate(-5deg);
  -moz-transform:rotate(-5deg);
  -ms-transform:rotate(-5deg);
  -o-transform:rotate(-5deg);
  transform:rotate(-5deg);
}
.strikethrough-50p:before {
  position: absolute;
  content: "";
  width:50%;
  left: 25%;
  top: 50%;
  right: 0;
  border-top: 3px solid;
  border-color: inherit;

  -webkit-transform:rotate(-5deg);
  -moz-transform:rotate(-5deg);
  -ms-transform:rotate(-5deg);
  -o-transform:rotate(-5deg);
  transform:rotate(-5deg);
}
<div class="mydiv">
<div class="strikethrough-100p">123456</div>
</div>
<br>
<div class="mydiv">
<div class="strikethrough-50p">123456</div>
</div>


-3

Ed ecco una versione stravagante:

background:none repeat scroll 0 0 rgba(255, 0, 0, 0.5);
-moz-border-radius:20px 0;
-webkit-border-radius:20px 0;
border-radius:20px 0;
content: "";
height:5px; left:-5%;
position:absolute;
top:30%;
-moz-transform:rotate(-7deg);
-webkit-transform:rotate(-7deg);
transform:rotate(-7deg);
transform-origin:50% 50% 0;
width:110%;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.