Ich habe ein Skript (mit Hilfe eines Benutzers hier) codiert, mit dem ich ein ausgewähltes Div erweitern und die anderen Divs entsprechend verhalten kann, indem ich es gleichmäßig strecke, um es an den verbleibenden Platz anzupassen (mit Ausnahme des ersten, dessen Breite festgelegt ist).
Und hier ist ein Bild von dem, was ich erreichen möchte:
Dafür benutze ich Flex und Übergänge.
Es funktioniert gut, aber das jQuery-Skript gibt einen Dehnungswert von "400%" an (der sich hervorragend zum Testen eignet).
Jetzt möchte ich, dass das ausgewählte div erweitert / verkleinert wird, um genau zum Inhalt zu passen, anstatt zum festen Wert "400%".
Ich habe keine Ahnung, wie ich das machen könnte.
Ist es möglich ?
Ich habe versucht, das div zu klonen, es an den Inhalt anzupassen, seinen Wert abzurufen und diesen Wert dann für den Übergang zu verwenden, ABER dies bedeutet, dass ich eine anfängliche Breite in Prozent, aber einen Zielwert in Pixel habe. Das geht nicht
Und wenn ich den Pixelwert in Prozent umrechne, passt das Ergebnis aus irgendeinem Grund nicht genau zum Inhalt.
In allen Fällen scheint dies ein etwas komplizierter Weg zu sein, um das zu erreichen, was ich sowieso will.
Gibt es keine Flex-Eigenschaft, die geändert werden könnte, um dem Inhalt eines ausgewählten Divs zu entsprechen?
Hier ist der Code ( bearbeitet / vereinfacht, da zum besseren Lesen ):
var expanded = '';
$(document).on("click", ".div:not(:first-child)", function(e) {
var thisInd =$(this).index();
if(expanded != thisInd) {
//fit clicked fluid div to its content and reset the other fluid divs
$(this).css("width", "400%");
$('.div').not(':first').not(this).css("width", "100%");
expanded = thisInd;
} else {
//reset all fluid divs
$('.div').not(':first').css("width", "100%");
expanded = '';
}
});
.wrapper {
overflow: hidden;
width: 100%;
margin-top: 20px;
border: 1px solid black;
display: flex;
justify-content: flex-start;
}
.div {
overflow: hidden;
white-space: nowrap;
border-right: 1px solid black;
text-align:center;
}
.div:first-child {
min-width: 36px;
background: #999;
}
.div:not(:first-child) {
width: 100%;
transition: width 1s;
}
.div:not(:first-child) span {
background: #ddd;
}
.div:last-child {
border-right: 0px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Click on the div you want to fit/reset (except the first div)
<div class="wrapper">
<div class="div"><span>Fixed</span></div>
<div class="div"><span>Fluid (long long long long long text)</span></div>
<div class="div"><span>Fluid</span></div>
<div class="div"><span>Fluid</span></div>
</div>
Hier ist die jsfiddle:
https://jsfiddle.net/zajsLrxp/1/
BEARBEITEN: Hier ist meine Arbeitslösung mit Hilfe von Ihnen allen (Größen, die beim Ändern der Fenstergröße aktualisiert wurden + Anzahl der Divs und dynamisch berechnete Breite der ersten Spalte):
var tableWidth;
var expanded = '';
var fixedDivWidth = 0;
var flexPercentage = 100/($('.column').length-1);
$(document).ready(function() {
// Set width of first fixed column
$('.column:first-child .cell .fit').each(function() {
var tempFixedDivWidth = $(this)[0].getBoundingClientRect().width;
if( tempFixedDivWidth > fixedDivWidth ){fixedDivWidth = tempFixedDivWidth;}
});
$('.column:first-child' ).css('min-width',fixedDivWidth+'px')
//Reset all fluid columns
$('.column').not(':first').css('flex','1 1 '+flexPercentage+'%')
})
$(window).resize( function() {
//Reset all fluid columns
$('.column').not(':first').css('flex','1 1 '+flexPercentage+'%')
expanded = '';
})
$(document).on("click", ".column:not(:first-child)", function(e) {
var thisInd =$(this).index();
// if first click on a fluid column
if(expanded != thisInd)
{
var fitDivWidth=0;
// Set width of selected fluid column
$(this).find('.fit').each(function() {
var c = $(this)[0].getBoundingClientRect().width;
if( c > fitDivWidth ){fitDivWidth = c;}
});
tableWidth = $('.mainTable')[0].getBoundingClientRect().width;
$(this).css('flex','0 0 '+ 100/(tableWidth/fitDivWidth) +'%')
// Use remaining space equally for all other fluid column
$('.column').not(':first').not(this).css('flex','1 1 '+flexPercentage+'%')
expanded = thisInd;
}
// if second click on a fluid column
else
{
//Reset all fluid columns
$('.column').not(':first').css('flex','1 1 '+flexPercentage+'%')
expanded = '';
}
});
body{
font-family: 'Arial';
font-size: 12px;
padding: 20px;
}
.mainTable {
overflow: hidden;
width: 100%;
border: 1px solid black;
display: flex;
margin-top : 20px;
}
.cell{
height: 32px;
border-top: 1px solid black;
white-space: nowrap;
}
.cell:first-child{
background: #ccc;
border-top: none;
}
.column {
border-right: 1px solid black;
transition: flex 0.4s;
overflow: hidden;
line-height: 32px;
text-align: center;
}
.column:first-child {
background: #ccc;
}
.column:last-child {
border-right: 0px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span class="text">Click on the header div you want to fit/reset (except the first one which is fixed)</span>
<div class="mainTable">
<div class="column">
<div class="cell"><span class="fit">Propriété</span></div>
<div class="cell"><span class="fit">Artisan 45</span></div>
<div class="cell"><span class="fit">Waterloo 528</span></div>
</div>
<div class="column">
<div class="cell"><span class="fit">Adresse</span></div>
<div class="cell"><span class="fit">Rue du puit n° 45 (E2)</span></div>
<div class="cell"><span class="fit">Chaussée de Waterloo n° 528 (E1)</span></div>
</div>
<div class="column">
<div class="cell"><span class="fit">Commune</span></div>
<div class="cell"><span class="fit">Ixelles</span></div>
<div class="cell"><span class="fit">Watermael-Boitsfort</span></div>
</div>
<div class="column">
<div class="cell"><span class="fit">Ville</span></div>
<div class="cell"><span class="fit">Marche-en-Famenne</span></div>
<div class="cell"><span class="fit">Bruxelles</span></div>
</div>
<div class="column">
<div class="cell"><span class="fit">Surface</span></div>
<div class="cell"><span class="fit">120 m<sup>2</sup></span></div>
<div class="cell"><span class="fit">350 m<sup>2</sup></span></div>
</div>
</div>
Und hier ist ein vollwertiges Beispiel bei der Arbeit (Stile + Auffüllen + mehr Daten):
https://jsfiddle.net/zrqLowx0/2/
Danke euch allen !