Echilon
Echilon

Reputation: 10264

Split button group in half

I have a btn-group which I'd like to separate while maintaining the same group. Currently, although initially the group displays as expected, once I select the button from the other side ('Exclude'), I can't deselect it - the two halves seem to be behaving as two groups.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>   
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<link href="https://bootswatch.com/3/cerulean/bootstrap.min.css" rel="stylesheet"/>

<div class="col-md-9 btn-toolbar" role="toolbar">
    <div class="btn-group" data-toggle="buttons" role="group">
        <label class="btn btn-warning">
            <input type="radio" class="reason" name="reason" id="off" value="None" autocomplete="off"> Exclude
        </label>
    </div>
    <div class="btn-group" data-toggle="buttons" role="group">
        <label class="btn btn-default">
            <input type="radio" class="reason" name="reason" id="war" value="War" autocomplete="off"> War
        </label>
        <label class="btn btn-default">
            <input type="radio" class="reason" name="reason" id="peace" value="Peace" autocomplete="off"> Peace
        </label>
        <label class="btn btn-default active">
            <input type="radio" class="reason" name="reason" id="both" value="Both" autocomplete="off" checked> Both
        </label>
        <label class="btn btn-default">
            <input type="radio" class="reason" name="reason" id="total" value="Total" autocomplete="off"> Total
        </label>
    </div>
</div>

JSFiddle

Upvotes: 0

Views: 1187

Answers (2)

SimonW
SimonW

Reputation: 329

The issue here is that bootstrap applies the styling to the buttons based on the active class, which is applied to the label via Javascript. So the radio buttons are actually selected and unselected correctly, it's just hidden by the styling.

Here's two ways of working around this:

Using HTML & CSS:

Combine the buttons into a single button-group with an id of custom-group and add the following css.

#custom-group label:first-child {
  border-top-right-radius: 5px;
  border-bottom-right-radius: 5px;
  margin-right: 10px;
}

#custom-group label:nth-of-type(2) {
  border-top-left-radius: 5px;
  border-bottom-left-radius: 5px;
}

Similar to the answer by kabanus, this will make the single button group look like two.

Using Javascript

Leave the HTML as is and add the following javascript:

var labels = document.querySelectorAll('label');

labels.forEach(function(label) {
  label.addEventListener('click',function() {
      labels.forEach(function(l) {
        l.classList.remove('active');
    });
    label.classList.add('active');
  });
})

This will 'manually' remove the active class from all the buttons and just add it to the one you just clicked. Make sure to tweak the selector for the labels so it doesn't affect other code on your page.

Here's a fiddle: https://jsfiddle.net/22et5z3h/4/

Upvotes: 1

kabanus
kabanus

Reputation: 26005

I don't think you can separate the divs like that. I think the easiest solution is just to add a bit of margin on the "special" button:

<link href="https://bootswatch.com/3/cerulean/bootstrap.min.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
 
<div class="col-md-9 btn-toolbar" role="toolbar">
     <div class="btn-group" data-toggle="buttons" role="group">
          <label class="btn btn-warning" style="margin-right: 10pt;">
               <input type="radio" class="reason" name="reason" id="off" value="None" autocomplete="off"> 
               Exclude
          </label>     
          <label class="btn btn-default">
              <input type="radio" class="reason" name="reason" id="used" value="War" autocomplete="off"> 
              War
          </label>
           <label class="btn btn-default">
                <input type="radio" class="reason" name="reason" id="off" value="Peace" autocomplete="off"> 
                Peace
            </label>
            <label class="btn btn-default active">
                 <input type="radio" class="reason" name="reason" id="both" value="Both" autocomplete="off" checked> 
                 Both
            </label>
            <label class="btn btn-default">
                 <input type="radio" class="reason" name="reason" id="total" value="Total" autocomplete="off" > 
                 Total
            </label>
      </div>
</div>

Upvotes: 2

Related Questions