การเปลี่ยนแปลงแบบยืดหยุ่น: ยืด (หรือหด) เพื่อให้พอดีกับเนื้อหา


9

ฉันเขียนโค้ดสคริปต์ (ด้วยความช่วยเหลือของผู้ใช้ที่นี่) ซึ่งช่วยให้ฉันขยาย div ที่เลือกและทำให้ div อื่นทำงานตามนั้นโดยยืดให้เท่ากันเพื่อให้พอดีกับพื้นที่ที่เหลือ (ยกเว้นอันแรกที่ความกว้างคงที่)

และนี่คือภาพของสิ่งที่ฉันต้องการบรรลุ:

ป้อนคำอธิบายรูปภาพที่นี่

เพื่อที่ฉันใช้ดิ้นและการเปลี่ยน

ใช้งานได้ดี แต่สคริปต์ jQuery ระบุค่าการยืด "400%" (ซึ่งเหมาะสำหรับการทดสอบ)

ตอนนี้ฉันต้องการให้ div ที่เลือกเพื่อขยาย / ย่อขนาดให้พอดีกับเนื้อหาแทนค่าคงที่ "400%"

ฉันไม่รู้ว่าจะทำอย่างไร

เป็นไปได้ไหม ?

ฉันพยายามโคลน div ให้พอดีกับเนื้อหารับค่าจากนั้นใช้ค่านี้เพื่อเปลี่ยน แต่นั่นหมายความว่าฉันมีความกว้างเริ่มต้นเป็นเปอร์เซ็นต์ แต่เป็นค่าเป้าหมายเป็นพิกเซล ไม่ได้ผล

และถ้าฉันแปลงค่าพิกเซลเป็นเปอร์เซ็นต์ผลลัพธ์จะไม่ตรงกับเนื้อหาไม่ว่าจะด้วยเหตุผลใดก็ตาม

ในทุกกรณีนี่เป็นวิธีที่ซับซ้อนเล็กน้อยในการบรรลุสิ่งที่ฉันต้องการอยู่แล้ว

ไม่มีคุณสมบัติยืดหยุ่นใด ๆ ที่สามารถเปลี่ยนเพื่อให้พอดีกับเนื้อหาของ div ที่เลือกหรือไม่

นี่คือรหัส ( แก้ไข / ลดความเรียบง่ายตั้งแต่อ่านดีขึ้น ):

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>

นี่คือ jsfiddle:

https://jsfiddle.net/zajsLrxp/1/

แก้ไข: นี่คือวิธีการแก้ปัญหาการทำงานของฉันด้วยความช่วยเหลือของคุณทุกคน (ขนาดที่ได้รับการปรับปรุงในการปรับขนาดหน้าต่าง + จำนวน divs และความกว้างของคอลัมน์แรกคำนวณแบบไดนามิก):

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>

และนี่คือตัวอย่างที่สมบูรณ์แบบในที่ทำงาน (สไตล์ + การเติมเต็ม + ข้อมูลเพิ่มเติม):

https://jsfiddle.net/zrqLowx0/2/

ขอบคุณทุกคน !


1
โปรดใจดีพอที่จะเพิ่มผลลัพธ์สุดท้ายให้กับคำถามของคุณซึ่งแสดงสิ่งที่คุณสร้างขึ้นหลังจากทั้งหมดนี้ ฉันสนใจในสิ่งที่ดูเหมือนจริง ๆ ขอบคุณ! (... อาจจะเข้าใจอย่างถ่องแท้ว่าใช้กับอะไร ... )
Rene van der Lende

ตกลงฉันจะทำทันทีที่ฉันทำความสะอาดสคริปต์ของฉันจากองค์ประกอบที่ไม่จำเป็นทั้งหมด (ในไม่กี่นาทีที่ฉันเดา) ที่กล่าวว่าฉันจะทำอย่างไร ฉันเพิ่งแก้ไขโพสต์ต้นฉบับและเพิ่มสิ่งที่ฉันทำถึงแม้ว่าคำตอบ Azametzin นั้นใช้ได้ดีหรือไม่? ฉันเปลี่ยนบางสิ่ง แต่ก็ 90% เหมือนกัน (ฉันยินดีที่จะแสดงมัน) ..
Bachir Messaouri

นี่คือประเด็น: ฉันเลียนแบบ Excel สเปรดชีตและฉันต้องการให้ผู้คนสามารถคลิกคอลัมน์ที่ต้องการเพื่อให้พอดีกับเนื้อหา โดยปกติแล้วตารางจะทำ แต่คอลัมน์จะไม่ทำงานอย่างถูกต้องเมื่อมันปรับขนาดตามที่ฉันต้องการ (ง่ายต่อการขยายคอลัมน์หนึ่งครั้ง แต่มันยากที่จะทำให้คนอื่นประพฤติตามเวลาจริงเพื่อครอบครองพื้นที่ที่เหลือทาง ดิ้นจะทำเพื่อ divs พวกเขาเพียงขยาย erratically ฉันทำวิจัยและสิ่งที่ฉันต้องการเป็นไปไม่ได้กับตาราง) มีเหตุผลอื่น ๆ ที่ฉันไม่ได้ใช้ตารางหรือ dataTable แต่อยู่นอกขอบเขตของโพสต์นี้
Bachir Messaouri

1
ง่ายพอเพียงกด 'แก้ไข' ไปที่จุดสิ้นสุดของคำถามแล้วเริ่มเพิ่มการไตร่ตรองที่น่าเบื่อรวมถึงตัวอย่างใหม่ (ทั้งหมด) ตรวจสอบให้แน่ใจว่า 'ซ่อนตัวอย่าง' โดยค่าเริ่มต้น (ช่องทำเครื่องหมายด้านล่างซ้าย), รบกวนน้อยกว่า / สำหรับผู้อ่านใหม่ ' ความคิดแรกของฉันคือคุณกำลังจะใช้มันสำหรับวิดเจ็ตไอคอนและทุกอย่าง สเปรดชีตฮะฉันมีแบบเต็มหน้าจอยืดทั่ววางขึ้น / ลง / ซ้าย / ขวาวางรอบโดยใช้หลักการเดียวกับที่กล่าวถึงที่นี่ (ถ้าคุณสนใจ)
Rene van der Lende

2
ยิ่งใหญ่ที่คุณไปไมล์พิเศษโพสต์ผลสุดท้าย ทำให้การตอบคำถามเกี่ยวกับการให้รางวัลมากยิ่งขึ้น! Cudos ...
Rene van der Lende

คำตอบ:


4

มันเป็นไปได้ที่จะแก้ปัญหาโดยใช้และmax-widthcalc()

ขั้นแรกให้แทนที่width: 100%ด้วยflex: 1สำหรับ divs ใน CSS เพื่อให้มันเติบโตขึ้นซึ่งจะดีกว่าในกรณีนี้ max-widthนอกจากนี้ยังใช้การเปลี่ยนแปลงสำหรับ

ตอนนี้เราต้องเก็บค่าที่เกี่ยวข้อง:

  • จำนวน divs ที่จะเคลื่อนไหว ( divsLengthตัวแปร) - 3 ในกรณีนี้
  • ความกว้างรวมที่ใช้สำหรับ div คงที่และเส้นขอบ ( extraSpaceตัวแปร) - 39px ในกรณีนี้

ด้วยตัวแปร 2 ตัวนั้นเราสามารถตั้งค่าเริ่มต้นmax-width( defaultMaxWidthตัวแปร) ให้กับ div ทั้งหมดรวมถึงใช้ในภายหลัง นั่นคือเหตุผลที่พวกเขาจะถูกเก็บไว้ทั่วโลก

คือdefaultMaxWidthcalc((100% - extraSpace)/divsLength)

ตอนนี้ให้เข้าสู่ฟังก์ชั่นคลิก:

ในการขยายตัว div ความกว้างของข้อความเป้าหมายจะถูกเก็บไว้ในตัวแปรที่เรียกว่าtextWidthและมันจะถูกนำไปใช้กับ div ตามที่max-width.มันใช้.getBoundingClientRect().width(เนื่องจากมันคืนค่าทศนิยม)

สำหรับ div ที่เหลือจะถูกสร้างขึ้นcalc()สำหรับmax-widthที่จะนำไปใช้กับพวกเขา
มันคือ: calc(100% - textWidth - extraScape)/(divsLength - 1).
ผลลัพธ์ที่คำนวณได้คือความกว้างที่แต่ละ div ที่เหลือควรเป็น

เมื่อคลิกที่ div ที่ขยายนั่นคือเพื่อกลับสู่ปกติระบบmax-widthจะใช้ค่าเริ่มต้นกับ.divองค์ประกอบทั้งหมดอีกครั้ง

var expanded = false,
    divs = $(".div:not(:first-child)"),
    divsLength = divs.length,
    extraSpace = 39, //fixed width + border-right widths 
    defaultMaxWidth = "calc((100% - " + extraSpace + "px)/" + divsLength + ")";

    divs.css("max-width", defaultMaxWidth);

$(document).on("click", ".div:not(:first-child)", function (e) {
  var thisInd = $(this).index();

  if (expanded !== thisInd) {
    
    var textWidth = $(this).find('span')[0].getBoundingClientRect().width;  
    var restWidth = "calc((100% - " + textWidth + "px - " + extraSpace + "px)/" + (divsLength - 1) + ")";
    
    //fit clicked fluid div to its content and reset the other fluid divs 
    $(this).css({ "max-width": textWidth });
    $('.div').not(':first').not(this).css({ "max-width": restWidth });
    expanded = thisInd;
  } else {
    //reset all fluid divs
    $('.div').not(':first').css("max-width", defaultMaxWidth);
    expanded = false;
  }
});
.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) {
  flex: 1;
  transition: max-width 1s;
}

.div:not(:first-child) span {
  background: #ddd;
}

.div:last-child {
  border-right: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.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 text)</span></div>
  <div class="div"><span>Fluid</span></div>
  <div class="div"><span>Fluid</span></div>

</div>

วิธีการนี้ทำงานแบบไดนามิกและควรทำงานกับวิธีแก้ปัญหาใด ๆ
ค่าเดียวที่คุณต้องใช้รหัสยากคือextraSpaceตัวแปร


1
ใช่นี่เป็นปัญหาที่ต้องใช้การคำนวณที่แม่นยำและความเข้าใจที่มากขึ้นของเฟล็กบ็อกซ์การย่อขนาด ฉันยังไม่มีวิธีแก้ปัญหา "ที่สมบูรณ์แบบ" แต่ฉันต้องการลองอีกครั้งในอนาคตดังนั้นฉันจึงได้ทำบุ๊กมาร์กคำถามของคุณอีกครั้งเพื่อลองหาวิธีการทำในสิ่งที่ถูกต้อง มันเป็นความท้าทายที่ดี
Azametzin

1
เพียง FYI ฉันแก้ไขโค้ดเนื่องจากทำให้ง่ายต่อการอ่านและทดสอบ ฉันเพิ่มช่วงเวลาซึ่งเป็นส่วนเสริมที่ดี ฉันยังไม่ได้เพิ่มช่วงการเปลี่ยนภาพความกว้างสูงสุดอย่างไรก็ตามจนถึงตอนนี้พวกเขาใช้งานไม่ได้ดี
Bachir Messaouri

1
เย็น. ฉันแค่แก้ไขมัน ฉันกำลังแก้ไขคำตอบ
Azametzin

1
ดี! ใช้เวลาของคุณในขณะที่ฉันออกไปสองสามชั่วโมงต่อไป ;-)
Bachir Messaouri

1
Oooh ฉันเพิ่งเห็นความคิดเห็นที่แก้ไขของคุณ (กำลังรอความคิดเห็นอัปเดต) การใช้ getBoundingClientRect () นั้นฉลาดมากและมันก็ไม่ได้เกิดขึ้นกับฉัน (เหมือนกันสำหรับการคำนึงถึงความกว้างคงที่ 39 px ไว้ในบัญชี) ฉันจะทดสอบอีกเล็กน้อยเพื่อดูว่ามันทำงานได้กับหน้าต่างทุกขนาดและจำนวนของไหลทุกประเภท ฉันจะกลับไปหาคุณ. ขอบคุณมาก! PS: โซลูชันของคุณทำงานกับ jQuery 3.3.1 แต่ไม่ใช่กับ 3.4.1 ไม่ว่าด้วยเหตุผลใดก็ตาม
Bachir Messaouri

3

คุณต้องจัดการกับฟังก์ชัน width หรือ calc Flexbox จะมีทางออก

ที่จะทำให้ divs ทั้งหมดเท่ากับ (อย่างใดอย่างหนึ่งไม่ได้เป็นครั้งแรก) flex: 1 1 autoที่เราใช้

<div class="wrapper">
  <div class="div"><span>Fixed</span></div>
  <div class="div"><span>Fluid (long long long long text)</span></div>
  <div class="div"><span>Fluid</span></div>
  <div class="div"><span>Fluid</span></div>
</div>

กำหนดกฏการยืดหยุ่นสำหรับ div ปกติและ div ที่เลือกของคุณ transition: flex 1s;เป็นเพื่อนของคุณ. สำหรับการเลือกหนึ่งที่เราไม่จำเป็นต้องเติบโตดิ้นเพื่อให้เราใช้flex: 0 0 auto;

.wrapper {
  width: 100%;
  margin-top: 20px;
  border: 1px solid black;
  display: flex;
}

.div {
  white-space: nowrap;
  border-right: 1px solid black;
  transition: flex 1s;
  flex: 1 1 auto;
}

.div.selected{
  flex: 0 0 auto;
}

.div:first-child {
  min-width: 50px;
  background: #999;
  text-align: center;
}

.div:not(:first-child) {
  text-align: center;
}

.div:last-child {
  border-right: 0px;
}

div:not(:first-child) span {
  background: #ddd;
}

เพิ่มคลาสที่เลือกในแต่ละครั้งเมื่อผู้ใช้คลิก div นอกจากนี้คุณยังสามารถใช้สลับในการคลิกครั้งที่สองเพื่อให้คุณสามารถบันทึกรายการที่เลือกในแผนที่และคุณสามารถแสดงรายการที่เลือกหลายรายการ (ไม่ใช่ตัวอย่างรหัสนี้แน่นอน)

$(document).on("click", ".div:not(:first-child)", function(e) {
  const expanded = $('.selected');
  $(this).addClass("selected");
  if (expanded) {
    expanded.removeClass("selected");
  }
});

https://jsfiddle.net/f3ao8xcj/


ขอบคุณ. ฉันต้องศึกษากรณีของคุณเพราะมันตรงข้ามกับสิ่งที่ฉันต้องการและฉันไม่แน่ใจว่าจะย้อนกลับยังได้อย่างไร (อาจเป็นเรื่องเล็กน้อย) ตามค่าเริ่มต้นแล้ว div ของของเหลวทั้งหมดจะมีขนาดใหญ่เท่ากัน มันก็ต่อเมื่อฉันคลิกที่อันที่ตรงกับเนื้อหาของมัน (และ div อื่น ๆ ที่ใช้ร่วมกันพื้นที่เท่ากันที่เหลือ) และถ้าฉันคลิกเป็นครั้งที่สองใน div เดียวกัน Fluid div ทั้งหมดจะรีเซ็ตโดยแบ่งพื้นที่เท่า ๆ กันอีกครั้งโดยไม่ต้องกังวลเกี่ยวกับเนื้อหาของพวกเขาเลย ดังนั้นถ้าฉันไม่เข้าใจผิดมันเป็นสิ่งที่ตรงกันข้ามกับสิ่งที่คุณทำ ยังไม่แน่ใจว่าจะย้อนกลับอย่างไร
Bachir Messaouri

อย่างไรก็ตามถ้าสิ่งนี้สามารถย้อนกลับได้ฉันชอบความหรูหราและความเรียบง่ายของโซลูชันของคุณเนื่องจากไม่จำเป็นต้องยุ่งกับแอตทริบิวต์ css width Flex ดูเหมือนว่าจะจัดการกับสิ่งนี้ภายใน ที่กล่าวว่าฉันมีลางสังหรณ์มันจะยากขึ้นเพื่อให้บรรลุในทางตรงกันข้าม รอดู. ขอบคุณสำหรับการติดตาม
Bachir Messaouri

1
@BachirMessaouri มันค่อนข้างง่ายอีกครั้ง โปรดดูรุ่นที่อัปเดต
พายุเฮอริเคน

ฉันรักความสง่างามของสคริปต์ของคุณ แต่โซลูชันของคุณพิจารณาเพียงบางส่วนของคำขอของฉัน คำขอของฉันไม่เพียง แต่เกี่ยวกับการปรับเนื้อหาเท่านั้น แต่ยังเกี่ยวกับการแบ่งปันพื้นที่ที่เหลืออย่างเท่าเทียมกันทั้งก่อนระหว่างและหลังจากการคลิก div div สคริปต์ของคุณไม่สามารถพูดได้ว่าดีมากหากไม่ได้เลย และนั่นคือสิ่งที่ทำให้สมองมีสมอง ฉันเพิ่มรูปภาพในโพสต์ดั้งเดิมเพื่อทำให้ความต้องการของฉันชัดเจนมาก สคริปต์อื่น ๆ ด้านบนเริ่มตรงที่คุณไม่สามารถส่งได้ ดูเหมือนว่าการผสมผสานทั้งสคริปต์ของคุณอาจทำงานได้ดี ฉันกำลังทดสอบและเมื่อเสร็จแล้วฉันจะกลับไปหาคุณ
Bachir Messaouri

@BachirMessaouri สิ่งที่คุณพลาดไปที่นี่ก็คือไม่มีใครต้องการโซลูชั่นที่สมบูรณ์แบบสำหรับกรณีของคุณ Flex transition: Stretch (or shrink) to fit contentเป็นชื่อคำถามของคุณและคำตอบนี้เป็นตัวอย่างง่ายๆของวิธีการทำ มันเป็นความรับผิดชอบของคุณในการหาแนวทางแก้ไขสำหรับกรณีของคุณ
พายุเฮอริเคน

2

หลังจากทดลองใช้สองสามครั้งดูเหมือนว่านี่จะเป็นทางออกที่สั้นที่สุดและตรงไปตรงมาที่สุดของฉัน

ทั้งหมดที่เป็นหลักที่ต้องทำคือมี flexbox ยืด<div>องค์ประกอบขีด จำกัด ของตนโดยเริ่มต้น แต่เมื่อ<span>คลิกข้อ จำกัด การยืดของที่<div>จะ<span>กว้าง ...

รหัสหลอก:

when <span> clicked and already toggled then <div> max-width = 100%, reset <span> toggle state

otherwise <div> max-width = <span> width, set <span> toggle state

ฉันแบ่ง CSS เป็นส่วน 'กลไกที่เกี่ยวข้อง' และ 'eye-candy only' เพื่อให้ง่ายต่อการอ่าน (และการเขียนโค้ดซ้ำ)

รหัสมีการแสดงความคิดเห็นอย่างหนักดังนั้นข้อความไม่มากที่นี่ ...

มุมแหลมอย่างใดมีความล่าช้าเป็นพิเศษในtransitionเมื่อเปลี่ยนdivจากการmax-width: 100% max-width = span widthฉันได้ตรวจสอบพฤติกรรมนี้ใน Chrome, Edge, IE11 และ Firefox (W10 ทั้งหมด) และดูเหมือนว่าจะมีเรื่องแปลก ๆ อาจมีการคำนวณซ้ำภายในเบราว์เซอร์บางครั้งหรืออาจใช้transitionเวลาสองครั้ง ('รู้สึกเหมือน') ในทางกลับกันก็แปลกพอไม่มีความล่าช้าพิเศษ

อย่างไรก็ตามด้วยช่วงเวลาการเปลี่ยนภาพสั้น ๆ (เช่น 150 มิลลิวินาทีในขณะที่ฉันกำลังใช้งานอยู่) ความล่าช้าพิเศษนี้ไม่ได้ / แทบจะไม่สังเกตเห็นได้เลย (คำถามที่ดีสำหรับคำถาม SO อื่น ... )

UPDATE

<div>รุ่นใหม่ที่ตั้งค่าอื่น ๆ ทั้งหมด ฉันเกลียดความน่ากลัวอย่างแท้จริง แต่นั่นเป็นเพราะ Flexbox ยืดและtransitionคุณค่า โดยไม่ต้องtransitionไม่มีการกระโดดที่มองเห็นได้ คุณต้องลองใช้สิ่งที่เหมาะกับคุณ

ฉันเพิ่งเพิ่มdocument.querySelectorAll()รหัสจาวาสคริปต์


ขอบคุณมากสำหรับข้อเสนอของคุณ มันไม่เหมาะกับความต้องการของฉัน (แต่มันเป็นจุดเริ่มต้นที่ดีมาก) เมื่อเราคลิกที่กองของเหลวมันไม่เป็นไร แต่อีกสองกองไม่ขยายตัวเท่า ๆ กันเพื่อครอบครองพื้นที่ที่เหลือ ซึ่งเป็น 50% ของปัญหา และใช่มีการเล่นโวหารนี้เช่นกัน สคริปต์ของ Azametzin ทำงานได้ 100% โดยไม่ต้องเล่นโวหาร ... ฉันลงเอยด้วยการผสมผสานทั้งสคริปต์ของเขาและการใช้การเปลี่ยนเฟล็กซ์แทนความกว้างสูงสุดและใช้งานได้อย่างมีเสน่ห์ ขอบคุณมากสำหรับความช่วยเหลือของคุณ !
Bachir Messaouri

ข้อสังเกตของ Seconding @ Azametzin: มันเป็นวันที่สนุกมากในเทพนิยายนี้ :) บางทีครั้งต่อไปเริ่มด้วยภาพ?
Rene van der Lende

ตกลง. ฉันคิดว่าคำอธิบายนั้นเพียงพอ แต่เห็นได้ชัดว่าฉันผิด ภาพมีตั้งแต่เมื่อวานแม้ว่า แต่ฉันได้รับคะแนนของคุณ ฉันจะแก้ไขข้อความต้นฉบับของฉันเพื่อแสดงสคริปต์ที่กำหนดเองของฉันในไม่กี่นาที ขอบคุณมาก !
Bachir Messaouri

โพสต์ต้นฉบับอัปเดตด้วยโซลูชันที่กำหนดเอง!
Bachir Messaouri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.