Tôi đã mã hóa một tập lệnh (với sự trợ giúp của người dùng ở đây) cho phép tôi mở rộng một div đã chọn và làm cho các div khác hoạt động tương ứng bằng cách kéo dài bằng nhau để phù hợp với không gian còn lại (ngoại trừ cái đầu tiên có chiều rộng được cố định).
Và đây là bức tranh về những gì tôi muốn đạt được:
Cho rằng tôi sử dụng flex và chuyển tiếp.
Nó hoạt động tốt, nhưng tập lệnh jQuery chỉ định giá trị kéo dài "400%" (rất phù hợp để thử nghiệm).
Bây giờ tôi muốn div được chọn mở rộng / thu nhỏ để phù hợp chính xác với nội dung thay vì giá trị cố định "400%".
Tôi không biết làm thế nào tôi có thể làm điều đó.
Có thể không?
Tôi đã cố gắng sao chép div, khớp với nội dung, lấy giá trị của nó và sau đó sử dụng giá trị này để chuyển tiếp NHƯNG điều này có nghĩa là tôi có chiều rộng ban đầu theo tỷ lệ phần trăm nhưng giá trị đích tính bằng pixel. Điều đó không hiệu quả.
Và nếu tôi chuyển đổi giá trị pixel theo tỷ lệ phần trăm, thì kết quả không chính xác phù hợp với nội dung vì bất kỳ lý do gì.
Trong mọi trường hợp, điều này có vẻ hơi phức tạp để đạt được những gì tôi muốn.
Không có bất kỳ thuộc tính flex nào có thể được chuyển đổi để phù hợp với nội dung của một div đã chọn?
Đây là mã (được chỉnh sửa / đơn giản hóa để đọc tốt hơn ):
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>
Đây là jsfiddle:
https://jsfiddle.net/zajsLrxp/1/
EDIT: Đây là giải pháp làm việc của tôi với sự giúp đỡ của tất cả các bạn (kích thước được cập nhật trên thay đổi kích thước cửa sổ + số lượng div và chiều rộng của cột đầu tiên được tính toán động):
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>
Và đây là một ví dụ đầy đủ trong công việc (kiểu + đệm + thêm dữ liệu):
https://jsfiddle.net/zrqLowx0/2/
Cảm ơn tất cả !