Vertical Align Label in Li

Status
Niet open voor verdere reacties.

vistavision

Gebruiker
Lid geworden
7 mei 2014
Berichten
18
Hallo allen,

Ik ben al een tijdje aan het stoeien met het uitlijnen van een tekst op een knop, maar ik kom er echt niet uit. Ik heb een radiobutton gestyled als knop en wil het label daarin verticaal in het midden positioneren, maar dat lukt me helaas niet. Zie mijn code via http://jsfiddle.net/HP5jM/:

HTML:
HTML:
	<div class="stelling" id="stelling1">
	<p class="vraagtekst">Vraag 1</p>
	<h2>Wat is uw woonsituatie?</h2>
	<ul class="vraaggroep">
		<li><label for="1Alleenstaand"><input type="radio" id="1Alleenstaand" name="vraag1" value="1Alleenstaand" />Alleenstaand</label></li>
		<li><label for="1Samenwonend"><input type="radio" id="1Samenwonend" name="vraag1" value="1Samenwonend" />Samenwonend</label></li>
		<li><label for="1Gezin met kinderen"><input type="radio" id="1Gezin met kinderen" name="vraag1" value="1Gezin met kinderen" />Gezin met kinderen</label></li>
	</ul>
	</div>

CSS:
HTML:
.vraaggroep {
     list-style-type:none;
     margin:25px 0 0 0;
     padding:0;
	 letter-spacing: -1px;
}

.vraaggroep li {
     float:left;
     margin:0 5px 0 0;
	width: 150px;
	
	border-radius: 8px;
    position:relative;
	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #92C245), color-stop(1, #5d8121));
	background-image: -o-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -moz-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -webkit-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -ms-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: linear-gradient(to bottom, #92C245 0%, #5d8121 100%);
	
	vertical-align: middle;
	display: table-cell;
	min-height:  50px;
}

.vraaggroep .selected {
	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fa0d52), color-stop(1, #d4022c));
	background-image: -o-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -moz-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -webkit-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -ms-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: linear-gradient(to bottom, #fa0d52 0%, #d4022c 100%);
}

.vraaggroep input[type="radio"] {
    opacity:0.011;
    z-index:100;
	position: absolute;
	left: 0px;
}

.vraaggroep input[type="radio"]:checked + label {
    background:yellow;
}

.vraaggroep label {
    display:block;
    position:absolute;
    top:0;
    left:0;
    right:0;
    bottom:0;
     padding:10px 5px 5px 5px;
     cursor:pointer;
    z-index:90;
	color: #fff;
	font-size: 22px;
	font-weight: bold;
	text-align: center;
	width: 140px;
	min-height: 34px;
	margin: auto;
	line-height: 18px;
}

.vraaggroep label:hover {
	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fa0d52), color-stop(1, #d4022c));
	background-image: -o-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -moz-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -webkit-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -ms-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: linear-gradient(to bottom, #fa0d52 0%, #d4022c 100%);
	border-radius: 8px;
}

Alvast super bedankt voor de hulp (ps, let niet op het lettertype ;))!!

Groeten,
Mark
 
Laatst bewerkt:
Ik heb de opmaak ff eruit gehaald maar die kun je er zelf tussen zetten.
Code:
/* default */
.vraaggroep, .vraaggroep li, .vraaggroep label, .vraaggroep input {
    margin: 0; padding: 0; line-height: 1; text-align: left;
    outline: 0; text-transform: none; vertical-align: baseline;
}

.vraaggroep {
    margin: 25px 0 0 0;
    list-style-type: none;
    position: relative;
}
 
.vraaggroep li {
    float: left;
    padding-right: 8px;
    min-height: 1px;
    vertical-align: middle;
}

.vraaggroep label {
    display: block;
    font: bold 22px arial, helvetica, sans-serif;
    cursor: pointer;
}

.vraaggroep input[type="radio"] {
    float: left;
    width: auto;
    margin: 7px 5px 0 5px; /* radio input op juiste plek zetten */
}
De radio input wordt niet op elke browser even netjes weergegeven :p
 
Laatst bewerkt:
Hallo Bron,

Bedankt voor je reactie. Ik heb de codes tussen de styling geplaatst, maar bij mij werkt het niet? Ik heb alle codes letterlijk erin geplaatst en daarna langzaam de stijling teruggeplaatst. Echter, zodra ik de width toevoeg, wordt het label niet netjes gecentreerd. Ik heb nu het volgende:

HTML:
/* default */
.vraaggroep, .vraaggroep li, .vraaggroep label, .vraaggroep input {
    margin: 0; padding: 0; line-height: 1; text-align: left;
    outline: 0; text-transform: none; vertical-align: baseline;
}

.vraaggroep {
    margin: 25px 0 0 0;
    list-style-type: none;
    position: relative;
	list-style-type: none;
	
}
 
.vraaggroep li {
    float: left;
    padding-right: 8px;
    min-height: 1px;
    vertical-align: middle;
	min-height: 34px;
width: 140px;
		background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #92C245), color-stop(1, #5d8121));
	background-image: -o-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -moz-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -webkit-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -ms-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: linear-gradient(to bottom, #92C245 0%, #5d8121 100%);
	border-radius: 8px;
}

.vraaggroep label {
    display: block;
    font: bold 22px arial, helvetica, sans-serif;
    cursor: pointer;
		color: #fff;
	font-size: 18px;
	font-weight: bold;
	
}

.vraaggroep label:hover {
	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fa0d52), color-stop(1, #d4022c));
	background-image: -o-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -moz-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -webkit-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -ms-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: linear-gradient(to bottom, #fa0d52 0%, #d4022c 100%);
	border-radius: 8px;
}

.vraaggroep input[type="radio"] {
    float: left;
    width: auto;
    margin: 7px 5px 0 5px; /* radio input op juiste plek zetten */
	visibility:hidden;
}

Wat doe ik hier fout? Ik weet dat de radiobuttons niet in iedere browser goed getoond worden, maar er moeten gegevens verzonden worden via een formulier en als ik een <a> ga stijlen, krijg ik geen data verzonden via mijn PHP form.

Alvast bedankt voor de hulp!!
 
Kun je hier iets mee. Ik heb er wat commentaar bij gezet. Let even op de blauwe wijziging. De rest kun je copy/paste'n.
Code:
.vraaggroep, .vraaggroep li, .vraaggroep label, .vraaggroep input {
	margin: 0; padding: 0; line-height: 1; [COLOR="#0000FF"]text-align: center;[/COLOR]
	outline: 0; text-transform: none; vertical-align: baseline;
}

.vraaggroep {
	margin: 25px 0 0 0;
	list-style-type: none;
	position: relative;
}

.vraaggroep li {
	float: left;
	min-height: 1px;
	vertical-align: middle;
	margin-right: 1px; /*ruimte tussen knoppen*/
	border-radius: 8px;
	background: #5d8121; /*fallback als gradient niet werkt*/
	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #92C245), color-stop(1, #5d8121));
	background-image: -o-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -moz-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -webkit-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: -ms-linear-gradient(bottom, #92C245 0%, #5d8121 100%);
	background-image: linear-gradient(to bottom, #92C245 0%, #5d8121 100%);
}

.vraaggroep li:hover {
	background: #d4022c; /*fallback als gradient niet werkt*/
	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fa0d52), color-stop(1, #d4022c));
	background-image: -o-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -moz-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -webkit-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: -ms-linear-gradient(bottom, #fa0d52 0%, #d4022c 100%);
	background-image: linear-gradient(to bottom, #fa0d52 0%, #d4022c 100%);
}

.vraaggroep label {
	display: block;
	width: 140px; /*hierdoor gaan lange teksten op 2 regels*/
	padding: 8px 4px; /*ruimte om de tekst*/
	font: bold 18px arial,helvetica,sans-serif;
	color: #fff;
	cursor: pointer;
}

.vraaggroep input[type="radio"] {
	float: left;
	width: 0; /* width+height op 0 vanwege hidden input*/
	height: 0;
	visibility: hidden;
}
Veel suc6.
 
Hallo Bron,

Super! Bedankt voor je hulp!! Volgens mij is hij bijna goed, alleen de knoppen moeten wel even hoog zijn. Nu zijn knoppen met 1 regel smal en knoppen met 2 regels hoog, zie foto:
knoppen.jpg

Met min-height lukt het helaas niet. Is het ook mogelijk om de knoppen allemaal even hoog te maken? Dan is het perfect! Alvast heel erg bedankt voor alles!!!
 
Als je height: 2.5em; toevoegt aan het label dan zijn ze even hoog.
Misschien wil je ook alle teksten zowel horizontaal als verticaal gecentreerd hebben maar dan moet de hele css op z'n kop gezet worden. Hier zie je een voorbeeld hoe dit wordt gedaan. In ieder geval moet er altijd een vaste hoogte opgeven worden dus je zal van tevoren moeten bedenken hoeveel regels er maximaal op een knop gaan komen en de hoogte van het label hierop aanpassen. Laat maar weten als je nog een aanpassing wilt. Veel suc6.

*** edit: omdat je kiest voor een vaste breedte zullen lange woorden (samenwonend) niet netjes worden weergegeven. De width van het label zal aangepast moeten worden aan het woord met de meeste letters. Alternatief is een kleiner font, of geen bold, of een variabele breedte maar dan krijgen de knoppen verschillende breedtes.
 
Laatst bewerkt:
Hallo Bron,

Bedankt voor je reactie! Het was oorspronkelijk de bedoeling dat de knoppen allemaal even groot zouden worden en de teksten allemaal keurig in het midden komen de staan, dus zowel horizontaal als verticaal gecentreerd. Daarbij moet de :hover de volledige button van achtergrond kunnen veranderen. Ik vrees dat ik dan inderdaad opnieuw moet beginnen. Normaal heb ik niet zoveel problemen met css, maar dit is toch erg lastig! Mocht je nog ideeën hebben, hoor ik het graag! Anders heel erg bedankt voor de info!
 
Er zijn 2 oplossingen, het gebruik van display: table-cell (ughh) of vertical-align: middle.
Vertical-align werkt alleen als je in een container (hier: li) minimaal 2 elementen hebt staan. Als je de mogelijkheid hebt de html te wijzigen dan wordt dit
Code:
<ul class="vraaggroep">
  <li><label for="1Alleenstaand">
    <input type="radio" id="1Alleenstaand" name="vraag1" value="1Alleenstaand" />
    <span>Alleenstaand</span></label></li>
  <li><label for="1Samenwonend">
    <input type="radio" id="1Samenwonend" name="vraag1" value="1Samenwonend" />
    <span>Samenwonend</span></label></li>
  <li><label for="1GezinKinderen">
    <input type="radio" id="1GezinKinderen" name="vraag1" value="1Gezin met kinderen" />
    <span>Gezin met kinderen</span></label></li>
</ul>
De vertical-align wordt toegepast op beide elementen (hier: input en span). Om alles goed te laten werken wordt de input 100% hoog en 0px breed gemaakt. De css wordt dan
Code:
.vraaggroep, .vraaggroep li, .vraaggroep label, .vraaggroep input, .vraaggroep span {
	margin: 0;
	padding: 0;
	line-height: 1;
	outline: 0;
}
.vraaggroep {
	margin: 25px 0 0 0;
	list-style-type: none;
	position: relative;
}
.vraaggroep li {
	float: left;
	width: 150px; /*breedte opgeven voor text-align:center*/
	height: 55px; /*hoogte opgeven voor vertical-align:middle*/
	margin-right: 1px;
	list-style-type: none;
	text-align: center;
	cursor: pointer;
	border-radius: 8px;
	background: #5d8121;
	/*hier alle background-image toevoegen*/
}
.vraaggroep li:hover {
	background: #d4022c;
	/*hier alle background-image toevoegen*/
}
.vraaggroep label {
	cursor: pointer; /*ff*/
}
.vraaggroep span {
	display: inline-block;
	vertical-align: middle;
	font: bold 18px arial,helvetica,sans-serif;
	color: #fff;
}
.vraaggroep input[type="radio"] {
	display: inline-block;
	vertical-align: middle;
	width: 0;
	height: 100%;
	visibility: hidden;
	margin-left: -4px; /*ff*/
	padding-right: 4px; /*ff*/
	-moz-appearance: none; /*ff*/
}
Firefox werkt niet lekker met input[radio] , de fixes staan met /*ff*/ in de css.
1. width: 0 van de input werkt niet tof als deze met text-align: center inline met de span staat
~ opgelost door input een marge -4px en padding +4px te geven met een -moz-appearance: none
2. cursor: pointer werkt niet op de tekst
~ opgelost door cursor: pointer zowel bij li als bij label te zetten

Veel suc6.

*** edit: de id mag geen spaties bevatten.
 
Laatst bewerkt:
Hallo Bron,

Ik heb het erin geplaatst en het werkt nu perfect, alleen nog één klein dingetje... nu moet ik op de span klikken om de knop te activeren, dus precies op de tekst. Als ik er net naast klik, werkt het niet. Kan de volledige knop klikbaar worden? Of is dat niet mogelijk? Verder is SUPER! Ik hoor het graag!!

Groeten,
Mark
 
Pfff, het was een uitdaging om het met css zonder javascript / jquery te maken maar ik geloof dat het is gelukt. Ik heb niet getest of de input's in een form verstuurd worden dus dat is aan jouw :d . Helaas heb ik table-cell moeten gebruiken waarin de elementen met vertical-align zijn gecentreerd. In de css ligt de input over de tekst heen met een opacity 0 zodat je de input niet ziet. Her en der heb ik er wat commentaar bijgezet.
Code:
<ul class="vraaggroep">
  <li><label><span>Alleenstaand</span><input type="radio" name="vraag1" value="1Alleenstaand" /></label></li>
  <li><label><span>Samenwonend</span><input type="radio" name="vraag1" value="1Samenwonend" /></label></li>
  <li><label><span>Gezin met kinderen</span><input type="radio" name="vraag1" value="1Gezin met kinderen" /></label></li>
</ul>

.vraaggroep, .vraaggroep li, .vraaggroep label, .vraaggroep input, .vraaggroep span {
	margin: 0;
	padding: 0;
	line-height: 1;
	outline: 0;
}
.vraaggroep {
	margin: 25px 0 0 0;
	list-style-type: none;
	position: relative;
}
.vraaggroep li, .vraaggroep label, .vraaggroep input[type="radio"] {
	width: 150px; /*breedte voor text-align: center*/
	height: 55px; /*hoogte voor vertical-align: middle*/
	/*max-height bij span even hoog maken*/
}
.vraaggroep li {
	display: table;
	float: left;
	margin-right: 1px;
	list-style-type: none;
	border-radius: 8px;
	text-align: center;
	background: #5d8121; /*fallback*/
	/*hier alle background-image*/
}
.vraaggroep li:hover {
	background: #d4022c; /*fallback*/
	/*hier alle background-image*/
}
.vraaggroep label {
	display: table-cell;
	padding-left: 16px; /*breedte van inputrondje*/
}
.vraaggroep span {
	display: inline-block;
	vertical-align: middle;
	max-height: 55px;
	font: bold 18px arial,helvetica,sans-serif;
	color: #fff;
}
.vraaggroep input[type="radio"] {
	display: inline-block;
	vertical-align: middle;
	margin-left: -100%; /*schuif naar links over de tekst heen*/
	cursor: pointer;
	filter: alpha(opacity=0); /*fallback*/
	-moz-opacity: 0; /*fallback*/
	opacity: 0; /*css3*/
}
Als het niet lukt dan zal het waarschijnlijk javascript / jquery gaan worden.
Veel suc6.
 
Hallo Bron,

Super bedankt voor al je hulp! Het lijkt te werken nu :) Ik ga het nog wel wat beter testen, maar het ziet er goed uit! Super bedankt voor alle hulp, het was een hele uitdaging!!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan