webForumDet fria alternativet

Tomma float-divvar kollapsar trots width/height

23 svar · 2 001 visningar · startad av spango

spangoMedlem sedan juni 20006 147 inlägg
#1

Hej wF,

jag har ett problem. Jag har ett XML-baserat filformat som används för checklistor över saker man ska göra på olika platser. XML:erna har ett XSL-stylesheet kopplade till sig så att man kan öppna dem i sin browser och skriva ut dem, och kryssa av vilka saker man gjort i små rutor. I bifogad PNG syns det hur det ser ut idag.

XML:en (inte helt relevant för frågan, men är med som bakgrund) ser ut så här, typ:

<list name="Somewhere">
	<place name="Place 1">
		<item>Item 1</item>
		<item>Item 2</item>
	</place>
	<place name="Place 2">
		<item>Item 3</item>
		<item>Item 4</item>
	</place>
</list>

Utifrån detta får jag HTML som blir ungefär så här (modulo whitespace etc):

<h1>Somewhere</h1>
<h2>Place 1</h2>
<ul>
	<li>Item 1</li>
	<li>Item 2</li>
</ul>
<h2>Place 2</h2>
<ul>
	<li>Item 3</li>
	<li>Item 4</li>
</ul>

Spana nu in den bifogade bilden. De små rutorna till höger har jag fått till genom att ge li:en en bakgrundsbild som har repeat-y, och en padding-right som motsvarar bredden på bilden. Det funkar och ser väl ut som jag vill, men jag irriterar mig över att behöva använda en bakgrundsbild, eftersom det gör det mycket besvärligare att ändra border, bredd och antal på rutorna.

Innan jag gav upp och körde på bakgrundsbilden var mitt försök ungefär så här. Först genererar jag HTML enligt följande:

<ul>
	<li>Item 1 <div></div> <div></div> <div></div>  <div></div> </li>
	<li>Item 2 <div></div> <div></div> <div></div>  <div></div> </li>
</ul>

Sen såg min CSS ungefär ut på följande vis:

ul { 
	border: 1px solid black;
	border-bottom: none;
}
ul li { border-bottom: 1px solid black; }
ul li div { /* rutorna man bockar av en item i */
	float: right; 
	width: 1.2em; /* typ ett tecken brett, drygt */
	height: 100%; /* fyll li:en på höjden */
}

Och jag lyckades typ får önskvärd effekt... om jag lade in en   i varje div, för divvarna kollapsade, eftersom de var tomma. Jag har dock gett mig fan på fixa det här på ett "riktigt" sätt. Är det någon som kan åstadkomma vad jag vill göra med enbart HTML+CSS (inga bilder) och utan fulhack (typ   eller tomma kommentarer)? Min nuvarande version finns i den bifogade zippen. Kom ihåg att radbrytningar måste funka som i det befintliga exemplet.

Aktuell browser: Mest Firefox, men allmänt standardenligt är att föredra, IE-kompabilitet kan jag för ovanlighetens skull glatt strunta i.

joserMedlem sedan mars 2002634 inlägg
#2

spango skrev:

...
Och jag lyckades typ får önskvärd effekt... om jag lade in en   i varje div, för divvarna kollapsade, eftersom de var tomma. Jag har dock gett mig fan på fixa det här på ett "riktigt" sätt. Är det någon som kan åstadkomma vad jag vill göra med enbart HTML+CSS (inga bilder) och utan fulhack (typ   eller tomma kommentarer)?...

Divvarna kollapsar för att 100% höjd i det här fallet blir "auto" eftersom deras förälder inte har en höjd satt. :)

Endast AP element kan basera procent på värdet av en auto höjd. AP är alltid block så divvarna kan ersättas av inline element, t.ex. span, b, eller annat.

En lösning utifrån din kod är:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled</title>
<meta name="generator" content="PSPad editor, www.pspad.com">
<style type="text/css">
ul{
	margin:0;
	padding:0;
}
li{
	list-style:none;
	position:relative;
	margin-bottom:-1px;
	border:1px solid;
	padding-right:5em;
}
li div{
	position:absolute;
	top:-1px;
	right:-1px;
	border:1px solid;
	width:1.2em;
	height:100%;
}
li div div{
	right:1.2em;
}
</style>
</head><body>

<h1>Somewhere</h1>
<h2>Place 1</h2>
<ul>
	<li>Item 1, which really is rather long and spans more than a line and causes a line break<div><div><div><div></div></div></div></div></li>
	<li>Item 2<div><div><div><div></div></div></div></div></li>
</ul>
<h2>Place 2</h2>
<ul>
	<li>Item 3<div><div><div><div></div></div></div></div></li>
	<li>Item 4, which really is rather long, too, and spans more than line and causes a line break<div><div><div><div></div></div></div></div></li>
</ul>

</body></html>
jawbreakerMedlem sedan jan. 2003294 inlägg
#3

Varför inte använda tabeller till detta? Det känns ganska lämpligt tycker jag eftersom du trots allt har kopplingar mellan rader och kolumner. Att det dessutom gör layoutbiten lite lättare i detta fall är väl bara en bonus...

joserMedlem sedan mars 2002634 inlägg
#4

Blir lite nyfiken på hur tabellkoden skulle vara lättare att styra. :)

Jag ser det här som en layoutfråga för en uppgiftslista med tomma markerings rutor.

spangoMedlem sedan juni 20006 147 inlägg
#5

jawbreaker skrev:

Varför inte använda tabeller till detta? Det känns ganska lämpligt tycker jag eftersom du trots allt har kopplingar mellan rader och kolumner. Att det dessutom gör layoutbiten lite lättare i detta fall är väl bara en bonus...

Jag använder inte tabeller efter som jag är masochist, och lite bakom flötet. Ska sanningen fram körde jag faktiskt på tabeller förut (blir tämligen enkelt även om enpixelsbordern ställer till oväntat mycket problem) tills jag fick en fix idé om att göra detta med divvar för mitt eget höga nöjes skull. Det är ju mer en lista än det är en tabell :)

@joser, jag ska testa ditt förslag vid tillfälle och återkommer med hur det gick.

jarvkloMedlem sedan juli 20013 295 inlägg
#6

joser skrev:

Blir lite nyfiken på hur tabellkoden skulle vara lättare att styra. :)

Hmm..
joser: det tar jag som en utmaning :e

Om man tolkar "tabeller" som "CSS-tabeller" skulle det kunna bli ungefär som följer:
(dvs "enklare" iom att CSS-koden blir "renare" och "lättare att förstå" än koden för "absolut nästlade div-positioner" om du frågar mig om min högst subjektiva åsikt)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ett av Jarvklos exempel</title>
<meta name="generator" content="Jarvklo">
<style type="text/css">
ul{ display: table; border-collapse: collapse; width: 100%}
li { display: table-row; }
li span {
        display: table-cell;
        border: 1px solid silver;
}
li span + span { width: 20px; min-height: 20px;} /* rutorna */
</style>
</head><body>
<h1>Somewhere</h1>
<h2>Place 1</h2>
<ul>
        <li>
                <span>Item 1, which really is rather long and spans more than a line and causes a line break</span>
                <span></span> <span></span> <span></span> <span></span> <span></span>
        </li>
        <li>
                <span>Item 2</span>
                <span></span> <span></span> <span></span> <span></span> <span></span>
        </li>
</ul>
<h2>Place 2</h2>
<ul>
        <li>
                <span>Item 3</span>
                <span></span> <span></span> <span></span> <span></span> <span></span>
        </li>
        <li>
                <span>Item 4, which really is rather long, too, and spans more than line and causes a line break</span>
                <span></span> <span></span> <span></span> <span></span> <span></span>
        </li>
</ul>
</body></html>

Testa: http://jarvklo.se/htmlexempel/spangogrid.html

... och vill man (i motsats till Spango :) ) ha en "fallback" för tidiga MSIE (före version 8), kan man lägga på ett villkorat hack typ detta i <head>

<!--[if  IE 7]>
<style type="text/css">
ul { display: block;}
li {display: inline-block; width: 100%; vertical-align: top;}
li span { display: inline-block; height: 100%; width: 80%}
li span + span { width: 20px; height: 100%; }
</style>
<![endif]-->

Mellanslagen mellan span-elementen i koden spelar bara roll i "äldre MSIE" - och i ärlighetens namn skall jag väl lägga till att jag inte lagt till de hack som behövs för IE6 - men ni fattar principen :)

Lycka till :bire

spangoMedlem sedan juni 20006 147 inlägg
#7

Tjusigt, jarvklo.

joserMedlem sedan mars 2002634 inlägg
#8

jarvklo skrev:

Hmm..
joser: det tar jag som en utmaning :e

Om man tolkar "tabeller" som "CSS-tabeller" skulle det kunna bli ungefär som följer:
(dvs "enklare" iom att CSS-koden blir "renare" och "lättare att förstå" än koden för "absolut nästlade div-positioner" om du frågar mig om min högst subjektiva åsikt)

Hade lite bråttom bara. ;)
Det går lika bra utan nästlade element:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled</title>
<meta name="generator" content="PSPad editor, www.pspad.com">
<style type="text/css">
ul{
	margin:0;
}
li{
	position:relative;
	margin-bottom:-1px;
	border:1px solid;
	padding-right:80px;
	overflow:hidden;
	list-style:none;
	line-height:1.2;
}
* html li{
	display:inline-block;
}
li span{
	display:inline-block;
	border:0;
	width:100%;
	vertical-align:bottom;
}
li b{
	position:relative;
	right:-80px;
	float:right;
	margin:-99px -1px 0 0;
	border:solid;
	border-width:0 1px;
	width:19px;
	height:100px;
}
</style>
</head><body>

<h1>Somewhere</h1>
<h2>Place 1</h2>
<ul>
	<li>
		<span>Item 1, which really is rather long and spans more than a line and causes a line break</span>
		<b></b><b></b><b></b><b></b>
	</li>
	<li>
		<span>Item 2</span>
		<b></b><b></b><b></b><b></b>
	</li>
</ul>

<h2>Place 2</h2>
<ul>
	<li>
		<span>Item 3</span>
		<b></b><b></b><b></b><b></b>
	</li>
	<li>
		<span>Item 4, which really is rather long, too, and spans more than line and causes a line break</span>
		<b></b><b></b><b></b><b></b>
	</li>
</ul>

</body></html>

jarvklo skrev:

Mellanslagen mellan span-elementen i koden spelar bara roll i "äldre MSIE" - och i ärlighetens namn skall jag väl lägga till att jag inte lagt till de hack som behövs för IE6 - men ni fattar principen :)

Lycka till :bire

Här är din kod igen, hackad och klar. IMHO är båda ovanstående alternativen enklare. :bire:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled</title>
<meta name="generator" content="PSPad editor, www.pspad.com">
<style type="text/css">
ul{ display:table; border-collapse:collapse; width:100%}
li{ display:table-row}
li b,
li span{ display:table-cell; border:1px solid silver}
li b{ width:19px}
</style>
<!--[if lt IE 8]>
<style type="text/css">
ul{ margin:0}
li{ position:relative; margin-bottom:-1px; border:1px solid silver; overflow:hidden; list-style:none; height:1%}
li span{ display:inline-block; margin-right:100px; border:0}
li b{ float:right; margin:-7.2em -1px -1px 0; height:7.2em}
</style>
<![endif]-->
</head><body>

<h1>Somewhere</h1>
<h2>Place 1</h2>
<ul>
	<li>
		<span>Item 1, which really is rather long and spans more than a line and causes a line break</span>
		<b></b><b></b><b></b><b></b><b></b>
	</li>
	<li>
		<span>Item 2</span>
		<b></b><b></b><b></b><b></b><b></b>
	</li>
</ul>

<h2>Place 2</h2>
<ul>
	<li>
		<span>Item 3</span> 
		<b></b><b></b><b></b><b></b><b></b>
	</li>
	<li>
		<span>Item 4, which really is rather long, too, and spans more than line and causes a line break</span>
		<b></b><b></b><b></b><b></b><b></b>
	</li>
</ul>

</body></html>
jarvkloMedlem sedan juli 20013 295 inlägg
#9

joser skrev:

Här är din kod igen, hackad och klar. IMHO är båda ovanstående alternativen enklare. :bire:

Håller med - min "punkt" var kanske mest egentligen att få fram att man numera produktionsmässigt faktiskt kan börja ta till display:table som grundalternativ för CSS-layouter, och sedan hacka till ett alternativ för MSIE < 8 baserat utifrån den "renare" kodstruktur den vanan ofta ger - istället för att börja med en massa "baklängesvolter" i form av nästlingar, absolutpositioneringar och float-orgier för att tillfredsställa MSIE.

Den sista versionen av din sammanslagning av koden sammanfattar det argumentet på ett ypperligt sätt tycker jag :birp

joserMedlem sedan mars 2002634 inlägg
#10

Håller med om de framtida fördelarna i fall som det här när vi äntligen slipper de gamla IE. De stöder varken css table eller pseudo element. I det här fallet som passar en css table kunde vi t.ex. använt :after för att lägga in tomma css celler efter texten och sluppit dem i html koden. Det hade varit mer semantiskt och ännu enklare. :bire:

jarvkloMedlem sedan juli 20013 295 inlägg
#11

joser skrev:

I det här fallet som passar en css table kunde vi t.ex. använt :after för att lägga in tomma css celler efter texten och sluppit dem i html koden. Det hade varit mer semantiskt och ännu enklare. :bire:

Hmm... §e Om vi nu skall ge oss på att diskutera semantik för ett redan löst problem... §e
Exakt hur menar du att utelämnat innehåll bättre kan härledas semantiskt till betydelsen "här ligger det ett gäng kryssrutor" än ett par tomma, generella element? - eller omformulerat: Är verkligen betydelsen (dvs den semantiska innebörden) av "här ligger ingenting alls" bättre att lägga in i HTML-dokumentet än betydelsen "här ligger *något* i strukturen men det har inget innehåll (ännu)"?

Ur det strikt semantiska perspektivet hade en knippe <input type="checkbox">-element naturligtvis varit både det "enklaste" och "mest semantiskt korrekta" att använda i detta fall (eftersom det ju var just en sorts kryssrutor som skulle byggas) - men eftersom <input type="checkbox"> tyvärr (och av olika skäl) inte "tar styling" på det sätt som krävs för att uppnå ett utseende enligt förutsättningarna går de inte (enkelt) att använda i just detta fall för att uppnå det efterfrågade resultatet ;)

Men, som sagt, nu var semantisk perfektion inte en del av problemet löstes här ;)

joserMedlem sedan mars 2002634 inlägg
#12

OT

jarvklo skrev:

Hmm... §e Om vi nu skall ge oss på att diskutera semantik för ett redan löst problem... §e
Exakt hur menar du att utelämnat innehåll bättre kan härledas semantiskt ...

Jag uppfattade tomma-rutor-problemet som att det gällde en stil för utskrift av en att-göra-lista för att sedan kunna checka av dem på utskriften. Om det varit ett formulär hade det funnits checkrutor, så jag såg dem som ren presentation utan betydelse i annat sammanhang. :P

jarvkloMedlem sedan juli 20013 295 inlägg
#13

Mer OT:

joser skrev:

jag såg dem som ren presentation utan betydelse i annat sammanhang. :P

Jag med - och det är därför du fått mig nyfiken på resonemanget bakom det du säger att :after-inducering av innehåll via CSS i HTML-strukturen på något vis är "mer semantiskt" än något annat

... för oavsett *hur* man får dit "extralementen" (via t.ex. :after i CSS, via Javascript eller "manuellt" inlagda i HTML-källkoden) så blir väl ändå den semantiska betydelsen av elementen i dokumentet (och den semantiska betydelsen av dokumentets innehåll) efter induceringen exakt densamma oavsett metod? - eller ? ;)

joserMedlem sedan mars 2002634 inlägg
#14

OT :)

jarvklo skrev:

...
... för oavsett *hur* man får dit "extralementen" (via t.ex. :after i CSS, via Javascript eller "manuellt" inlagda i HTML-källkoden) så blir väl ändå den semantiska betydelsen av elementen i dokumentet (och den semantiska betydelsen av dokumentets innehåll) efter induceringen exakt densamma oavsett metod? - eller ? ;)

Ett pseudoelement är i "abstrakt DOM", syns inte i DOM-trädet och är utom räckhåll för javascript. Elementet induceras inte i dokumantet, det skapas vid renderingen utifrån CSS regeln.

Det kan diskuteras om de tomma checkrutorna har en betydelse i dokumentet iom att användarens behov kan vara att de visas också på skärmen, eller om de får en betydelse först som utskrivna och då inte har någon uppgift i dokumentet och kan skapas före utskrift. ...Jag lutar åt det senare. ;)

OT OT
Jag kom tillbaka till wF för att bidra där andra kanske kör fast. Inte för att bli ett troll. :(

jarvkloMedlem sedan juli 20013 295 inlägg
#15

Ja det är fortfarande off topic men...

joser skrev:

OT OT
Jag kom tillbaka till wF för att bidra där andra kanske kör fast. Inte för att bli ett troll. :(

Eh ??? :o
Semantik är svårt.
Om den kommentaren kommer pga att jag ställt för svåra och nagelfarande frågor om semantik antar att jag tydligen använde för få smileys i mina frågor. :bire

joserMedlem sedan mars 2002634 inlägg
#16

jarvklo skrev:

Eh ??? :o
Semantik är svårt.
Om den kommentaren kommer pga att jag ställt för svåra och nagelfarande frågor om semantik antar att jag tydligen använde för få smileys i mina frågor. :bire

Inte för svårigheten. Kändes bara som att vi hijackade tråden. :h

Semantik är inte min starka sida. Men i just det här fallet är semantiken absolut värd en diskussion. Det intressanta tycker jag är att rutorna får ett innehåll iom utskriften. På skärmen har de bara ett förhandsgrankande värde, eventuellt ett innehåll som meddelande om en funktion efter utskrift. vad det nu medför? Innehållet skulle isf vara att bli en unik plats för en ännu ej gjord markering knuten till den intilliggande uppgiften. Möjligen att tomma element med en titel blev ett alternativ? - Eller? :birp

jarvkloMedlem sedan juli 20013 295 inlägg
#17

Hmm...

Men nu var det ju iofs inte en diskussion av semantisk perfektion jag var ute efter (som du ser om du läser tillbaka lite i tråden, men OK ;) )
Semantiskt sett finns bara en "perfekt lösning" i detta fall - <input type="checkbox"> - eftersom vi pratar om - just det - kryssrutor ;) men i detta fall tvingas vi till avsteg från det pga de praktiska brister som finns i vad CSS kan göra med <input>-element )

... i övrigt tror jag nu att jag förstår hur du tänker, men jag håller inte med dig om att CSS-inducering av semantiskt neutrala element skulle vara "mer semantiskt" än att lägga in samma element direkt i dokumentet :birp

joserMedlem sedan mars 2002634 inlägg
#18

OT
Semantiskt... :)

Förutsättningen från OP: Checklistor ska skrivas ut med grupper av kryssrutor vid varje punkt för att kryssas i på utskriften.

En komplikation är att vi inte har hela bilden. Punkterna ska ramas in och vara i en column. Det ska vara en rad kryssrutor i sina kolumner vid varje punkt, vilket antyder att krysskolumnerna kan ha en betydelse. Det kan möjligen finnas rubriker vid varje kolumn som anger relation i två axlar, vilket liknar en tabell.

jarvklo skrev:

Semantiskt sett finns bara en "perfekt lösning" i detta fall - <input type="checkbox"> - eftersom vi pratar om - just det - kryssrutor ;) men i detta fall tvingas vi till avsteg från det pga de praktiska brister som finns i vad CSS kan göra med <input>-element )

Hur jag tänker: ;)

Man kan se checklistan som en ofylld blankett. Avcheckningen blir ett innehåll som tillförs utanför listan i datordokumentet och tomma rutor blir ett visuellt stöd för placering av markeringskryss vid respektive att-göra-punkt i listan.

Att tillföra dokumentet tomma element i lista eller tabell.
- Det är inte en mall som ska redigeras och sparas eller skrivas ut ikryssad eller fyllas i med kryssdata.

Att tillföra checkrutor i dokumentet som formulärelement (element som inte används i sin funktion är inte semantiskt korrekta).
- Formulär med checkrutor används om checklistan ska skickas eller om den ska skrivas ut ifylld. Det ska den inte. Men den ska i princip användas som formulär/blankett efter utskrift.

En blankett kan vara förtryckt med tomma rader och kryssrutor. Då är problemet här är att listuppgifterna kan behöva radbrytas och kryssrutorna sträckas ut.

En lösning som jag ser som mer semantisk, är att generera blanketten vid utskrift. Det är vad CSS är avsett för; formatering -- och även komplettering -- av innehåll i presentationssyfte. Ramar runt listpunkterna och tomma kryssrutor ser jag som ett visuellt stöd vid läsning och kryssmarkering.

Det låter också dokumentet vara den lista av att-göra-punkter som det verkar vara. :birp

spangoMedlem sedan juni 20006 147 inlägg
#19

joser skrev:

Inte för svårigheten. Kändes bara som att vi hijackade tråden. :h

Jag har redan fått de svar jag ville ha. För mig får ni gärna sväva ut i hur teoretiska diskussioner som helst :)

spangoMedlem sedan juni 20006 147 inlägg
#20

joser skrev:

Man kan se checklistan som en ofylld blankett. Avcheckningen blir ett innehåll som tillförs utanför listan i datordokumentet och tomma rutor blir ett visuellt stöd för placering av markeringskryss vid respektive att-göra-punkt i listan.

Korrekt. Listorna används i sammanhang där det inte är praktiskt att släpa runt på en dator. Man skriver ut en lista, gör det som står på den, och kryssar i rutorna i första kolumnen, och sen återanvänder man den och kryssar för i andra kolumnen, tredje gången i tredje kolumnen, osv. När alla kolumnerna är använda har man normalt ackumulerat en massa nya grejer man vill göra (sparat i form av anteckningar i marginalerna), så då uppdaterar man XML-filen och gör en ny utskrift.

HTML är egentligen inte ett optimalt format (eftersom det enda jag är ute efter är visuell formatering för utskrift - man öppnar XML:en i sin Firefox och skriver ut, det är i princip den interaktion man har med dokumentets HTML-skepnad), men det är portabelt och förhållandevis okomplicerat.

Genererad på 513 ms · cache AV · v20260730165559-full.f96bc7eb