Qualche modo per limitare la lunghezza del bordo?


216

Esiste un modo per limitare la lunghezza di un bordo. Ho un <div>bordo che ha un bordo inferiore, ma voglio aggiungere un bordo a sinistra del bordo <div>che si estende solo per metà.

C'è un modo per farlo senza aggiungere elementi extra alla pagina?

Risposte:


175

Spero che questo ti aiuti:

#mainDiv {
  height: 100px;
  width: 80px;
  position: relative;
  border-bottom: 2px solid #f51c40;
  background: #3beadc;
}

#borderLeft {
  border-left: 2px solid #f51c40;
  position: absolute;
  top: 50%;
  bottom: 0;
}
<div id="mainDiv">
  <div id="borderLeft"></div>
</div>


5
Questo sembra ancora il modo migliore per farlo. È compatibile con più browser e di facile manutenzione.
Pim Schaaf,

1
c'è un modo per farlo su un cerchio?
www139,

1
applica box-shadow per il cerchio.
Piyush Dholariya,

3
Questo può avere vantaggi marginali sulla compatibilità tra browser rispetto ai browser antichi ed è più facile da controllare tramite JS ... ma nessuno di questi è un problema della domanda originale. Tuttavia, questo aggiunge un ulteriore elemento al markup che la domanda originale chiede specificamente di evitare. Quindi non capisco perché questa è la risposta accettata per questa domanda.
Spencer O'Reilly,

In questo modo: after non richiede alcun markup aggiuntivo
Mark

257

Il contenuto generato da CSS può risolverlo per te:

div {
  position: relative;
}


/* Main div for border to extend to 50% from bottom left corner */

div:after {
  content: "";
  background: black;
  position: absolute;
  bottom: 0;
  left: 0;
  height: 50%;
  width: 1px;
}
<div>Lorem Ipsum</div>

(nota: la content: "";dichiarazione è necessaria per il rendering dello pseudo-elemento)


21
Penso che questa sia semanticamente un'opzione molto migliore, in quanto non introduce ulteriori div.
Louis Otto,

21
Questa dovrebbe essere la risposta accettata perché favorisce CSS come unico mezzo per lo styling rispetto al markup.
Lukas,

4
Perfetto. E funziona come previsto anche con imbottitura e margine.
Nolonar,

4
Ricorda: non puoi gestire le proprietà degli pseudo-elementi da JS (in realtà puoi, ma sarà molto confuso). Quindi, se hai intenzione di creare una sorta di barra di avanzamento con questa soluzione, dimentica. Scegli la risposta già accettata. In tutti gli altri casi questa risposta è migliore, è vero.
Sergei Panfilov,

2
Questo cross-browser e / o JS è compatibile? Preferisco la risposta accettata, a causa del commento di @ SergeyPanfilov.
matthaeus,

36

Il :after rocce :)

Se giochi un po 'puoi persino impostare il tuo bordo ridimensionato in modo che appaia centrato o appaia solo se c'è un altro elemento accanto (come nei menu). Ecco un esempio con un menu:

#menu > ul > li {
    position: relative;
    float: left;
    padding: 0 10px;
}

#menu > ul > li + li:after {
    content:"";
    background: #ccc;
    position: absolute;
    bottom: 25%;
    left: 0;
    height: 50%;
    width: 1px;
}


1
Puoi aggiungere un campione HTML? Come pensi di usarlo con le celle della tabella, qualche indizio?
Peter Krauss,

22

Con le proprietà CSS, possiamo controllare solo lo spessore del bordo; non lunghezza.

Tuttavia, possiamo imitare l'effetto bordo e controllare il suo widtheheight come vogliamo in altri modi.

Con CSS (gradiente lineare):

Possiamo usare linear-gradient() per creare un'immagine di sfondo e controllarne le dimensioni e la posizione con CSS in modo che appaia come un bordo. Poiché possiamo applicare più immagini di sfondo a un elemento, possiamo usare questa funzione per creare più bordi come immagini e applicare su diversi lati dell'elemento. Possiamo anche coprire l'area disponibile rimanente con un colore uniforme, sfumatura o immagine di sfondo.

HTML richiesto:

Tutto ciò di cui abbiamo bisogno è un solo elemento (possibilmente con qualche classe).

<div class="box"></div>

passi:

  1. Crea immagini di sfondo con linear-gradient().
  2. Utilizzare background-sizeper regolare l'immagine width/ le heightimmagini sopra create in modo che appaia come un bordo.
  3. Utilizzare background-positionper regolare la posizione (come left, right, left bottometc.) dei suddetti confine creato (s).

CSS necessario:

.box {
  background-image: linear-gradient(purple, purple),
                    // Above css will create background image that looks like a border.
                    linear-gradient(steelblue, steelblue);
                    // This will create background image for the container.

  background-repeat: no-repeat;

  /* First sizing pair (4px 50%) will define the size of the border i.e border
     will be of having 4px width and 50% height. */
  /* 2nd pair will define the size of stretched background image. */
  background-size: 4px 50%, calc(100% - 4px) 100%;

  /* Similar to size, first pair will define the position of the border
     and 2nd one for the container background */
  background-position: left bottom, 4px 0;
}

Esempi:

Con linear-gradient() possiamo creare bordi di colore solido oltre ad avere sfumature. Di seguito sono riportati alcuni esempi di bordi creati con questo metodo.

Esempio con bordo applicato solo su un lato:

Esempio con bordo applicato su due lati:

Esempio con bordo applicato su tutti i lati:

Immagine dello schermo:

Immagine di output che mostra i bordi a mezza lunghezza


14

per le linee orizzontali puoi usare il tag hr:

hr { width: 90%; }

ma non è possibile limitare l'altezza del bordo. solo altezza elemento.


Sì, qui "larghezza" è la "lunghezza della linea HR". Per qualcosa come una larghezza del bordo utilizzare la dimensione dell'attributo HR o CSS height. Per sostituire il bordo della cella in un tag TD usare <td>your content<hr/></td>.
Peter Krauss,

8

I bordi sono definiti solo per lato, non in frazioni di lato. Quindi no, non puoi farlo.

Inoltre, un nuovo elemento non sarebbe nemmeno un bordo, imiterebbe solo il comportamento desiderato, ma sarebbe comunque un elemento.


7

Un altro modo per farlo è usare l'immagine di confine in combinazione con un gradiente lineare.

div {
  width: 100px;
  height: 75px;
  background-color: green;
  background-clip: content-box; /* so that the background color is not below the border */
  
  border-left: 5px solid black;
  border-image: linear-gradient(to top, #000 50%, rgba(0,0,0,0) 50%); /* to top - at 50% transparent */
  border-image-slice: 1;
}
<div></div>

jsfiddle: https://jsfiddle.net/u7zq0amc/1/


Supporto browser: IE: 11+

Chrome: tutti

Firefox: 15+

Per un supporto migliore aggiungi anche i prefissi del fornitore.

immagine di confine di caniuse


5

Questo è un trucco CSS, non una soluzione formale. Lascio il codice con il punto nero perché mi aiuta a posizionare l'elemento. Successivamente, colora il tuo contenuto (colore: bianco) e (margine superiore: -5px circa) per renderlo come se il periodo non fosse lì.

div.yourdivname:after {
content: ".";
  border-bottom:1px solid grey;
  width:60%;
  display:block;
  margin:0 auto;
}

2

Un'altra soluzione è che potresti usare un'immagine di sfondo per imitare l'aspetto di un bordo sinistro

  1. Crea lo stile del bordo sinistro richiesto come elemento grafico
  2. Posizionalo all'estrema sinistra del tuo div (rendilo abbastanza lungo da gestire all'incirca due aumenti della dimensione del testo per i browser più vecchi)
  3. Imposta la posizione verticale del 50% dalla parte superiore del div.

Potrebbe essere necessario modificare IE (come al solito), ma vale la pena provare se è questo il design che stai cercando.

  • In genere sono contrario all'utilizzo delle immagini per qualcosa che CSS fornisce intrinsecamente, ma a volte se il design ne ha bisogno, non c'è altro modo per aggirarlo.

1

È possibile definire un bordo solo per lato. Dovresti aggiungere un ulteriore elemento per quello!

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.