divisore verticale tra due colonne in bootstrap


Risposte:


99

Se il tuo codice ha questo aspetto:

<div class="row">
  <div class="span6">
  </div>
  <div class="span6">
  </div>
</div>

Quindi presumo che tu stia utilizzando DIVS aggiuntivi all'interno del DIVS "span6" per contenere / disegnare i tuoi contenuti? Così...

<div class="row">
  <div class="span6">
    <div class="mycontent-left">
    </div>
  </div>
  <div class="span6">
    <div class="mycontent-right">
    </div>
  </div>
</div>

Quindi potresti semplicemente aggiungere un po 'di CSS alla classe "mycontent-left" per creare il tuo divisore.

.mycontent-left {
  border-right: 1px dashed #333;
}

1
il problema con quanto sopra è che il bordo si attacca al mio contenuto nel primo intervallo. Nella prima campata ho un modulo e il bordo ne abbraccia il contenuto. Come posso separarlo?
murtaza52

Semplice: aggiungi un po 'di spaziatura interna ai DIV di contenuto sinistro e contenuto destro.
Billy Moat

10
Il problema si verificherebbe se il contenuto della destra fosse <span>superiore a quello sinistro. In tal caso, la linea verticale sarà brutta.
lvarayut

Se le colonne sono di altezze diverse, puoi far scorrere la riga fino in fondo impostando min-height: 100%; height: 100%;il CSS per il contenitore dive le divs contenenti ciascuna colonna.
raul

@raul Credo che funzioni solo se utilizzi flexbox. Se stai usando float sui col-*div, questo non funzionerà.
Jacob Stamm

30

.row.vertical-divider {
  overflow: hidden;
}
.row.vertical-divider > div[class^="col-"] {
  text-align: center;
  padding-bottom: 100px;
  margin-bottom: -100px;
  border-left: 3px solid #F2F7F9;
  border-right: 3px solid #F2F7F9;
}
.row.vertical-divider div[class^="col-"]:first-child {
  border-left: none;
}
.row.vertical-divider div[class^="col-"]:last-child {
  border-right: none;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" />
<div class="row vertical-divider" style="margin-top: 30px">
  <div class="col-xs-6">Hi there</div>
  <div class="col-xs-6">Hi world<br/>hi world</div>
</div>


1
Usa il selettore '+' e non hai bisogno del primo e dell'ultimo bambino delle classi:.row.vertical-divider div[class^="col-"] + div[class^="col-"] { text-align: center; padding-bottom: 100px; margin-bottom: -100px; border-left: 3px solid #0396D1; }
Vasyl

1
Questa soluzione è la migliore
Wai Yan Hein

22

In Bootstrap 4 c'è la classe di utilità border-rightche puoi usare.

Quindi ad esempio puoi fare:

<div class="row">
  <div class="col-6 border-right"></div>
  <div class="col-6"></div>
</div>

15

Bene, ecco un'altra opzione che sto usando da un po 'di tempo. Funziona benissimo per me dato che per lo più ho bisogno di separare visivamente 2 colonne. Ed è anche reattivo. Ciò significa che se ho colonne una accanto all'altra in dimensioni dello schermo medie e grandi, allora userei la classecol-md-border , che nasconderebbe il separatore su schermi di dimensioni inferiori.

css:

@media (min-width: 992px) {
    .col-md-border:not(:last-child) {
        border-right: 1px solid #d7d7d7;
    }
    .col-md-border + .col-md-border {
        border-left: 1px solid #d7d7d7;
        margin-left: -1px;
    }
}

In scss puoi generare tutte le classi necessarie probabilmente da questo:

scss:

@media(min-width: $screen-md-min) {
    .col-md-border {
        &:not(:last-child) {
            border-right: 1px solid #d7d7d7;
        }

        & + .col-md-border {
            border-left: 1px solid #d7d7d7;
            margin-left: -1px;
        }
    }
}

HTML:

<div class="row">
    <div class="col-md-6 col-md-border"></div>
    <div class="col-md-6 col-md-border"></div>
</div>  

Come funziona:

I cols devono essere all'interno di un elemento dove non ci sono altri cols altrimenti i selettori potrebbero non funzionare come previsto.

.col-md-border:not(:last-child)corrisponde a tutti tranne l' ultimo elemento prima di .row close e aggiunge il bordo destro ad esso.

.col-md-border + .col-md-bordercorrisponde al secondo div con la stessa classe se questi due sono uno accanto all'altro e aggiunge il bordo sinistro e -1px margine negativo. Il margine negativo è il motivo per cui non importa più quale colonna ha un'altezza maggiore e il separatore sarà 1px della stessa altezza della colonna più alta.

Ha anche alcuni problemi ...

  1. Quando cerchi di essere intelligente / pigro e usi col-XX-Xclass insieme a hidden-XX/ visible-XXclasses all'interno dello stesso elemento riga.
  2. Quando hai molte colonne e hai bisogno di un pixel perfetto. Poiché si sposta n-1 colonna 1px a sinistra.

... Ma d'altra parte è reattivo, funziona alla grande per html semplice ed è facile creare queste classi per tutte le dimensioni dello schermo di bootstrap.


8

Per correggere l'aspetto brutto di un divisore troppo corto quando il contenuto di una colonna è più alto, aggiungi bordi a tutte le colonne. Assegna a ogni altra colonna un margine negativo per compensare le differenze di posizione.

Ad esempio, le mie tre classi di colonne:

.border-right {
    border-right: 1px solid #ddd;
}
.borders {
    border-left: 1px solid #ddd;
    border-right: 1px solid #ddd;
    margin: -1px;
}
.border-left {
    border-left: 1px solid #ddd;
}

E l'HTML:

<div class="col-sm-4 border-right">First</div>
<div class="col-sm-4 borders">Second</div>
<div class="col-sm-4 border-left">Third</div>

Assicurati di usare #ddd se vuoi lo stesso colore dei divisori orizzontali di Bootstrap.


Mi piace questa soluzione ma è progettata solo per tre o più colonne. E se ne volessi solo due? Il div medio ".borders" non sarà lì per regolare i margini.
Matthew Zackschewski

6

Se stai ancora cercando la soluzione migliore nel 2018, ho scoperto che funziona perfettamente se hai almeno uno pseudo elemento libero (:: after o :: before).

Devi solo aggiungere una classe alla tua riga in questo modo: <div class="row divisore verticale ">

E aggiungilo al tuo CSS:

.row.vertical-divider [class*='col-']:not(:last-child)::after {
  background: #e0e0e0;
  width: 1px;
  content: "";
  display:block;
  position: absolute;
  top:0;
  bottom: 0;
  right: 0;
  min-height: 70px;
}

Ogni riga con questa classe avrà ora un divisore verticale tra tutte le colonne che contiene ...

Puoi vedere come funziona in questo esempio.


1
Ometti - in [class * = 'col-'] (a [class * = 'col']) per compatibilità bootstrap 4 con la classe "col"
Trey Dibler

solo un commento "La proprietà viene ignorata a causa del display. Con 'display: inline', le proprietà width, height, margin-top, margin-bottom e float non hanno effetto."
Shuja Ahmed

5

Se vuoi un divisore verticale tra 2 colonne, tutto ciò di cui hai bisogno è aggiungere

class="col-6 border-left" 

a una delle tue colonne div-s

MA

Nel mondo del responsive design, a volte potrebbe essere necessario farlo scomparire.

La soluzione sta scomparendo <hr>+ scomparendo <div>+margin-left: -1px;

<div class="container">
  <div class="row">
    <div class="col-md-7">
      1 of 2
    </div>
    <div class="border-left d-sm-none d-md-block" style="width: 0px;"></div>
    <div class="col-md-5" style="margin-left: -1px;">
    <hr class="d-sm-block d-md-none">
      2 of 2
    </div>
  </div>
</div>

https://jsfiddle.net/8z1pag7s/

testato su Bootstrap 4.1


4

L'ho provato. Funziona bene.

.row.vdivide [class*='col-']:not(:last-child):after {
      background: #e0e0e0;
      width: 1px;
      content: "";
      display:block;
      position: absolute;
      top:0;
      bottom: 0;
      right: 0;
      min-height: 70px;
    }

    <div class="container">
      <div class="row vdivide">
        <div class="col-sm-3 text-center"><h1>One</h1></div>
        <div class="col-sm-3 text-center"><h1>Two</h1></div>
        <div class="col-sm-3 text-center"><h1>Three</h1></div>
        <div class="col-sm-3 text-center"><h1>Four</h1></div>
      </div>
    </div>

1
Funziona, perfettamente come necessario, dovrebbe anche aver spiegato cosa hai fatto.
Atik M.

Assolutamente perfetto e completamente reattivo: anche quando le colonne vengono impilate su schermi più piccoli, il bordo svanisce, come vorresti! Un'ottima soluzione facile, grazie! :)
rmcsharry

1
non funziona, il separatore giusto è ancora lì, dai un'occhiata qui: jsfiddle.net/k4uavbtz
Yevgeniy Afanasyev

Funziona per 3+ colonne. Quando si utilizzano solo due colonne, il divisore segue l'altezza della colonna di sinistra. Pertanto, se la colonna di destra è più lunga, il bordo non sarà abbastanza alto.
Matthew Zackschewski

4

Con Bootstrap 4 puoi usare i bordi , evitando di scrivere altri CSS.

bordo sinistro

E se vuoi spazio tra il contenuto e il bordo puoi usare il riempimento . (in questo esempio padding left 4px)

pl-4

Esempio:

    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet"/>

    <div class="row">
      <div class="offset-6 border-left pl-4">First</div>
      <div class="offset-6 border-left pl-4">Second</div>
    </div>


2

Deve essere aperto a pagina intera per vedere i bordi!

Aggiunte clausole di larghezza dei media nel CSS in modo che non ci siano fastidiosi confini sul lato mobile-friendly delle cose. Spero che sia di aiuto! Questo verrà ridimensionato alla lunghezza della colonna più lunga. Testato su .col-md-4 e .col-md-6 e la mia ipotesi è che sia compatibile con il resto. Nessuna garanzia però.

JSFiddle

.row {
  overflow: hidden;
}

.cols {
  padding-bottom: 100%;
  margin-bottom: -100%;
  overflow: hidden;
}

@media(min-width: 992px) {
  .col-md-4:not(:first-child), 
  .col-md-6:not(:first-child) {
    border-left: 1px solid black;
  }
  .col-md-4:not(:last-child),
  .col-md-6:not(:last-child) {
    border-right: 1px solid black;
    margin-right: -1px;
  }
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">
  <h1>
    .col-md-6
  </h1>
  <hr>
  <div class="row text-center">
    <div class="col-md-6 cols">
      <p>Enter some text here</p>
    </div>
    <div class="col-md-6 cols">
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
    </div>
  </div>
  <hr>
  <h1>
    .col-md-4
  </h1>
  <div class="row text-center">
    <div class="col-md-4 cols">
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
    </div>
    <div class="col-md-4 cols">
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
    </div>
    <div class="cols col-md-4 cols">
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
      <p>Enter some more text here</p>
    </div>
  </div>
</div>


2

Supponendo che tu abbia uno spazio per le colonne, questa è un'opzione. Riequilibrare le colonne a seconda di ciò di cui hai bisogno.

<div class="col-1">
    <div class="col-6 vhr">
    </div>
</div>
.vhr{
  border-right: 1px solid #333;
  height:100%;
}

0

Bene, quello che ho fatto è stato rimuovere la grondaia tra le rispettive campate, quindi disegnare un bordo sinistro per la campata sinistra e un bordo destro per la campata destra in modo tale che i loro bordi si sovrappongano solo per dare una singola linea. In questo modo la linea visibile sarà solo uno dei bordi.

CSS

.leftspan
{
padding-right:20px;
border-right: 1px solid #ccc;
}

.row-fluid .rightspan {
margin-left: -0.138297872340425%;
*margin-left: -0.13191489361702%;
padding-left:20px;
border-left: 1px solid #ccc;
}

.row-fluid .rightspan:first-child {
margin-left: -0.11063829787234%;
*margin-left: -0.104255319148938%;
}

HTML

  <div class="row-fluid" >
      <div class="span8 leftspan" >
      </div>

      <div class="span4 rightspan"  >
      </div>
 </div>

Prova questo funziona per me


1
È brutto quando i 2 div non hanno la stessa altezza.
Alain Tiemblo

-2

Usa questo, garantito al 100%: -

vr {
  margin-left: 20px;
  margin-right: 20px;
  height: 50px;
  border: 0;
  border-left: 1px solid #cccccc;
  display: inline-block;
  vertical-align: bottom;
}
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.