Użyj Fieldset Legend z bootstrapem

174

Używam Bootstrap dla mojej JSPstrony.

Chcę używać <fieldset>i <legend>dla mojej formy. To jest mój kod.

<fieldset class="scheduler-border">
    <legend class="scheduler-border">Start Time</legend>
    <div class="control-group">
        <label class="control-label input-label" for="startTime">Start :</label>
        <div class="controls bootstrap-timepicker">
            <input type="text" class="datetime" id="startTime" name="startTime" placeholder="Start Time" />
            <i class="icon-time"></i>
        </div>
    </div>
</fieldset>

CSS jest

fieldset.scheduler-border {
    border: 1px groove #ddd !important;
    padding: 0 1.4em 1.4em 1.4em !important;
    margin: 0 0 1.5em 0 !important;
    -webkit-box-shadow:  0px 0px 0px 0px #000;
            box-shadow:  0px 0px 0px 0px #000;
}

legend.scheduler-border {
    font-size: 1.2em !important;
    font-weight: bold !important;
    text-align: left !important;
}

Otrzymuję takie wyniki wprowadź opis obrazu tutaj

Chcę uzyskać wyniki w następujący sposób

wprowadź opis obrazu tutaj

Próbowałem dodać

border:none;
width:100px;

do legend.scheduler-borderw CSS. Otrzymuję oczekiwany wynik. Problem w tym, że chciałbym dodać kolejne <fieldset>dla innych pól. W tym przypadku problemem jest szerokość tekstu w legendzie, ponieważ jest ona dłuższa niż 100px.

Więc co mam zrobić, aby uzyskać wyniki takie, jak wspomniałem? (Bez uderzania w tekst legendy)

Shiju K Babu
źródło
Kod, który udostępniłeś, wydaje się działać dobrze. Oto Fiddle
Menno
4
@Aquillo Twoje Fiddle nie używa Bootstrap.
James Donnelly
1
@JamesDonnelly też zauważyłem, że jest to spowodowane przez Bootstrap;)
Menno
1
Myślę, że powinieneś rozważyć użycie panelu Bootstrap. Ma bardzo podobne zachowanie, jak zestaw pól i legenda, ale jest bardziej stylowy.
Chandra Destiawan

Odpowiedzi:

222

Dzieje się tak, ponieważ Bootstrap domyślnie ustawia szerokość legendelementu na 100%. Możesz to naprawić, zmieniając swoje legend.scheduler-borderna:

legend.scheduler-border {
    width:inherit; /* Or auto */
    padding:0 10px; /* To give a bit of padding on the left and right */
    border-bottom:none;
}

Przykład JSFiddle .

Musisz również upewnić się, że twój niestandardowy arkusz stylów jest dodawany po Bootstrap, aby zapobiec nadpisaniu przez Bootstrap twojego stylu - chociaż twoje style tutaj powinny mieć większą specyficzność.

Możesz również chcieć margin-bottom:0;coś do niego dodać , aby zmniejszyć odstęp między legendą a separatorem.

James Donnelly
źródło
2
Ftr: dla mnie Bootstrap 3.3.6 również ustawił a margin-bottom: 20px;na legend, co spowodowało wypchnięcie go powyżej granicy pola, zamiast umieszczać go na linii. Ustawienie margin-bottom: 0;niestandardowego legend.scheduler-bordernaprawiono tak łatwo.
dtk
87

W bootstrap 4 znacznie łatwiej jest mieć ramkę na zestawie pól, która łączy się z legendą. Nie potrzebujesz do tego niestandardowego css, można to zrobić w ten sposób:

<fieldset class="border p-2">
   <legend  class="w-auto">Your Legend</legend>
</fieldset>

który wygląda tak: zestaw pól bootstrap 4 i legenda

Joe Audette
źródło
w-auto nie jest dostępne w Bootstrap 4.0, ale jest dostępne w wersji
4.1+
19

Miałem ten problem i rozwiązałem w ten sposób:

fieldset.scheduler-border {
    border: solid 1px #DDD !important;
    padding: 0 10px 10px 10px;
    border-bottom: none;
}

legend.scheduler-border {
    width: auto !important;
    border: none;
    font-size: 14px;
}
Mohammad Aghayari
źródło
17

Miałem inne podejście, użyłem panelu bootstrap, aby pokazać, że jest trochę bardziej bogaty. Tylko po to, aby komuś pomóc i poprawić odpowiedź.

.text-on-pannel {
  background: #fff none repeat scroll 0 0;
  height: auto;
  margin-left: 20px;
  padding: 3px 5px;
  position: absolute;
  margin-top: -47px;
  border: 1px solid #337ab7;
  border-radius: 8px;
}

.panel {
  /* for text on pannel */
  margin-top: 27px !important;
}

.panel-body {
  padding-top: 30px !important;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<div class="container">
  <div class="panel panel-primary">
    <div class="panel-body">
      <h3 class="text-on-pannel text-primary"><strong class="text-uppercase"> Title </strong></h3>
      <p> Your Code </p>
    </div>
  </div>
  <div>

To da poniższy wygląd. wprowadź opis obrazu tutaj

Uwaga: musimy zmienić style, aby użyć innego rozmiaru nagłówka.

Jajikanth pydimarla
źródło
7

Chciałem tylko w skrócie podsumować wszystkie prawidłowe odpowiedzi powyżej. Ponieważ musiałem spędzić dużo czasu, aby dowiedzieć się, która odpowiedź rozwiązuje problem i co dzieje się za kulisami.

Wydaje się, że istnieją dwa problemy związane z ustawieniem pola z ładowaniem początkowym:

  1. bootstrapWyznacza szerokość do legend100%. Dlatego nakłada się na górną granicę pliku fieldset.
  2. Jest bottom borderdla legend.

Więc wszystko, co musimy naprawić, to ustawić szerokość legendy na automatyczną w następujący sposób:

legend.scheduler-border {
   width: auto; // fixes the problem 1
   border-bottom: none; // fixes the problem 2
}
Manoj Shrestha
źródło