2016-04-08 11 views
1

Ich versuche ein benutzerdefiniertes Optionsfeld zu erstellen. Ich habe this ordentlich Stil gefunden, den ich ein wenig optimieren will, so dass Elemente werden angelegt horizontally.Consider die folgende html:Wie decke ich das Etikett über ein benutzerdefiniertes div, um den Radio Button zu erreichen

<div style="margin-left:30px;"> 
    <div class='container'> 
<input type="radio" id="rdArts" name="itemcat"> 
    <label for="rdArts">Arts</label>  
    <div class="check"></div> 
</div> 

<div class='container'> 
    <input type="radio" id="rdElectronics" name="itemcat"> 
    <label for="rdElectronics">Electronics</label> 

    <div class="check"></div> 
</div> 

<div class='container'> 
    <input type="radio" id="rdCars" name="itemcat"> 
    <label for="rdCars">Cars</label> 

    <div class="check"></div> 
</div> 
    </div> 

und diese CSS:

.container{ 
    float:left; 
    position:relative; 
    margin-right:20px; 
} 

.container input[type=radio]{ 
    position: absolute; 
    visibility: hidden; 
} 

.container label{ 
    display: block; 
    position: ; 
    font-weight: 300; 
    font-size: 1.2em; 
    padding: 25px 25px 25px 10px; 
    margin: 10px auto; 
    height: 30px; 
    z-index: 9; 
    cursor: pointer; 
    -webkit-transition: all 0.25s linear; 
} 
.container:hover label{ 
    color: #485776; 
} 

.container:hover .check{ 
    border-color: #485776; 
} 

.container:hover .check::border{ 
    background-color: #485776; 
} 
.container .check{ 
    display: block; 
    position: relative; 
    border: 4px solid #333E54; 
    border-radius: 100%; 
    height: 15px; 
    width: 15px; 
    top: -67px; 
    left: -25px; 
    z-index: 5; 
    transition: border .25s linear; 
    -webkit-transition: border .25s linear; 
} 

.container .check::before { 
    display: block; 
    position: relative; 
    content: ''; 
    border-radius: 100%; 
    height: 11px; 
    width: 11px; 
    top: 2px; 
    left: 0px; 
    margin: auto; 
    transition: background 0.25s linear; 
    -webkit-transition: background 0.25s linear; 
} 

input[type=radio]:checked ~ .check::before{ 
    background: #333E54; 
} 

ich in der Lage bin zu erhalten dies:

enter image description here

Das einzige Problem ist, ich kann nicht klicken Sie sich auf dem Pseudo-Optionsfeld zu arbeiten. Ich muss auf das Etikett klicken. Und der Grund ist, weil in meinem Fall Label dehnt sich nicht auf das ".check" div. Welchen Stil sollte ich meinem Label geben, damit es das div überlagert? Wenn Sie den vollen HTML-Code und CSS sehen möchten, ist here es.

+0

Einfach die Eingänge in den Etiketten. –

+0

@MrLister, ich weiß, dass dies eine andere Möglichkeit ist, eine Checkbox oder RadioButton Klick zu erreichen, wenn das entsprechende Label angeklickt wird. In diesem Fall müssen Sie das Attribut "for" nicht angeben. Aber wenn Sie sich meinen HTML-Code ansehen, werden Sie sehen, dass ich das eigentliche Radio verberge und seinen Klick mit einem anderen div-Element imitiert. –

+1

Also setzen Sie die Eingänge UND die .checks in die Etiketten. [Hier, eine Geige] (https://jsfiddle.net/MrLister/9hy9j12k/). –

Antwort

2

Dies sollte funktionieren:

ich die .container label Stil leicht bearbeitet ein wenig nach links zu bewegen, über die Checkbox Bilder zu sein.

.container{ 
 
    float:left; 
 
    position:relative; 
 
    margin-right:20px; 
 
} 
 

 
.container input[type=radio]{ 
 
    position: absolute; 
 
    visibility: hidden; 
 
} 
 

 
.container label{ 
 
    display: block; 
 
    position: ; 
 
    font-weight: 300; 
 
    font-size: 1.2em; 
 
    height: 30px; 
 
    z-index: 9; 
 
    cursor: pointer; 
 
    -webkit-transition: all 0.25s linear; 
 
     margin: 10px auto 10px -26px; 
 
    padding: 25px 25px 25px 36px; 
 
    position: relative; 
 
} 
 
.container:hover label{ 
 
    color: #485776; 
 
} 
 

 
.container:hover .check{ 
 
    border-color: #485776; 
 
} 
 

 
.container:hover .check::border{ 
 
    background-color: #485776; 
 
} 
 
.container .check{ 
 
    display: block; 
 
    position: relative; 
 
    border: 4px solid #333E54; 
 
    border-radius: 100%; 
 
    height: 15px; 
 
    width: 15px; 
 
    top: -67px; 
 
    left: -25px; 
 
    z-index: 5; 
 
    transition: border .25s linear; 
 
    -webkit-transition: border .25s linear; 
 
} 
 

 
.container .check::before { 
 
    display: block; 
 
    position: relative; 
 
    content: ''; 
 
    border-radius: 100%; 
 
    height: 11px; 
 
    width: 11px; 
 
    top: 2px; 
 
    left: 0px; 
 
    margin: auto; 
 
    transition: background 0.25s linear; 
 
    -webkit-transition: background 0.25s linear; 
 
} 
 

 
input[type=radio]:checked ~ .check::before{ 
 
    background: #333E54; 
 
}
<div style="margin-left:30px;"> 
 
    <div class='container'> 
 
<input type="radio" id="rdArts" name="itemcat"> 
 
    <label for="rdArts">Arts</label>  
 
    <div class="check"></div> 
 
</div> 
 

 
<div class='container'> 
 
    <input type="radio" id="rdElectronics" name="itemcat"> 
 
    <label for="rdElectronics">Electronics</label> 
 

 
    <div class="check"></div> 
 
</div> 
 

 
<div class='container'> 
 
    <input type="radio" id="rdCars" name="itemcat"> 
 
    <label for="rdCars">Cars</label> 
 

 
    <div class="check"></div> 
 
</div> 
 
    </div>

+0

Vielen Dank. Ich kann die Unterschiede im Label-Stil sehen, aber könnten Sie bitte erklären, warum es so funktioniert? Übrigens, ich habe die Eigenschaft für das Kunstlabel korrigiert, sodass Sie diese Notiz entfernen können. –

+0

Was ich im Grunde genommen getan habe ist, die Labels leicht nach links zu bewegen, um das Checkbox-Bild zu enthalten. Wenn Sie in den Code schauen, werden Sie feststellen, dass die Labels jetzt einen negativen Rand auf der linken Seite haben ... Ich hoffe, das ist klar genug :) – Robert

+0

Um das zu erreichen, was ich will, musste ich ihm einen negativen linken Rand geben –

Verwandte Themen