2014-12-01 35 views
8

Boşluklarımı yeniden boyutlandırmak için yeniden boyutlandırılabilir jQuery'yi kullanmaya çalışıyorum, stop olayından sonra jQuery UI, % değerinimi pixel değerine geri döndürmesi dışında oldukça iyi çalışmam gerekiyor.jQuery yeniden boyutlandırmayı yüzde olarak kullanmak için nasıl zorlanır?

Ben ettik burada çalışan bir keman: İlk kez current konteyner sürüklediğinizde http://jsfiddle.net/totszwai/j60h38fy/5/

, doğru bütün değerini hesaplamak, ama stop olaydan sonra, jQuery UI ve% değişim güncellerdi piksele geri dönersiniz ... bir dahaki sefere tekrar sürüklediğinizde,% kaybedilir.

jQuery öğesini genişlik değerini% olarak ayarlamak için nasıl zorlarsınız? Teknik olarak setTimeout gibi bir şey kullanabilirdim, ama bu çok çirkin olurdu.

Ayrıca, piksellerdeki divleri işlemek için bir çözüm istemiyorum çünkü teknik olarak n-div'ları kurulumuma ekleyebilirim ve bu kodun% n'ad'lerle çalışması gerekir.

Benim neighbor div'uma bakarsanız,% orada tutulur, yalnızca current üzerine yazılmıştır. Ayrıca ui.size.width'u% 0'a ayarlamanın yanı sıra ui.element ile oynamayı da denedim, ancak bunların hiçbiri de işe yaramıyor.

Güncelleme: Bir geçici çözüm bu hala nerede stop döner hatalı piksel değeri sorunu çözmüyor Ancak stop etkinliğinde veri her şey saklamak ve asla start de tekrar kontrol etmektir. Güncelleştirilmiş jsFiddle: http://jsfiddle.net/totszwai/j60h38fy/6/

Yalnızca jQuery yeniden boyutlandırılabilir% değerini alırsam, her şey beklendiği gibi çalışır.

Çözüm: apaul34208 yanıtını kabul ettim, çünkü% nasıl kullanılacağını sordum. Ancak, asıl olarak çözmek istediklerimi çözmek için yerine piksel kullanıyorum. Cevabın size yardımcı olması durumunda, below gönderdiğim cevabı görün, lütfen bunun yerine bunu belirtin.

cevap

7

Bu aynı soruna rastladım ve seçilen çözüm benim için işe yaramıyor çünkü herhangi bir sayıdaki sütunları genelleştirmek için buna ihtiyacım var. Ayrıca, codenamezero'nun cevabı orijinal sorunun genişlikler için yüzdelerin kullanılmasını gerektirdiği gerçeğiyle ilgilenmedi.

Genişlik için yüzdeler kullanmakta olan durumum için bir tablo düzenleyicisi uygulandığından ve kaydedilen tablonun nerede oluşturulduğuna bağlı olarak boyutu dinamik olarak değiştirmesi gerektiğinden önemlidir. Diğerleri harcamak kalmamak
http://jsfiddle.net/genpsire/4mywcm1x/14/

$(document).ready(function() { 

    var container = $(".wrapper"); 
    var numberOfCol = 3; 
    $(".test").css('width', 100/numberOfCol +'%'); 

    var sibTotalWidth; 
    $(".test").resizable({ 
     handles: 'e', 
     start: function(event, ui){ 
      sibTotalWidth = ui.originalSize.width + ui.originalElement.next().outerWidth(); 
     }, 
     stop: function(event, ui){  
      var cellPercentWidth=100 * ui.originalElement.outerWidth()/ container.innerWidth(); 
      ui.originalElement.css('width', cellPercentWidth + '%'); 
      var nextCell = ui.originalElement.next(); 
      var nextPercentWidth=100 * nextCell.outerWidth()/container.innerWidth(); 
      nextCell.css('width', nextPercentWidth + '%'); 
     }, 
     resize: function(event, ui){ 
      ui.originalElement.next().width(sibTotalWidth - ui.size.width); 
     } 
    }); 
}); 

bu çözümü seçiniz:

yüzden yüzdeler olarak ayarlanır codenamezero en çözümüne ama durdurmak değişti genişlikleri benzer işleri bu çözüm geldi sabahları apaul34208'in çözümünü n sütunlarına doğru genellemeye çalışarak saçlarını çekiyorlar. (benim gibi!)

+0

bu bir apaul değil daha iyidir, ama

kullanmamalısınız ... – codenamezero

+0

Konteyner bir tablo olmak zorunda değildir, bu yüzden bu div'lerle çalışacaktır. Tablo verilerini görüntülemek için

kullanıyorsanız, sorun yok. Bir sayfayı biçimlendirmek için
'un kullanılmaması gerektiğini kabul ediyorum. Benim durumumda sekmeli veriyi gösteriyoruz. – genspire

+0

Teşekkürler, iyi bir çözüm! Vardiya sürükleme testini (en boy oranı ölçeklendirme için) başarısız olur, ancak '.resizable()' kullanan tüm diğer cevapları da yapın (vardiya tutarken yeniden boyutlandırırken yükseklik değiştiği için). Ancak, bunu düzeltmek kolaydır. 'resizable' ve 'stop' olaylarında: '$ (this) .css ('height', '')'. Kemanı unuttum ve burada birkaç düzeltme ve iyileştirme ekledim: http: // jsfiddle.net/8auwgazu/ – nothingisnecessary

0

Hayaleti kaldırmak ve animasyon ve css bir bit oynamak vardı display: flex; beklenmedik sonuçlar neden gibiydi, ama ben basit bir çözüm üzerinde tökezledi olabileceğini düşünüyorum:

Working Example

$(document).ready(function() { 

    $(".test").resizable({ 
    handles: 'e', 
    resize: function() { 
     $('.test:first-of-type').css('width', $('.test:first-of-type').outerWidth() * 100/$(window).innerWidth() + '%'); 
     $('.test:nth-of-type(2)').css('width', 100 - ($('.test:first-of-type').outerWidth() * 100/$(window).innerWidth()) + '%'); 

    } 

    }); 
}); 
* { 
    -moz-box-sizing: border-box; 
    box-sizing: border-box; 
} 
html, 
body { 
    height: 100%; 
    width: 100%; 
    padding: 0; 
    margin: 0; 
} 
.wrapper { 
    height: 100%; 
    width: 100%; 
} 
.test { 
    float: left; 
    border: 3px solid red; 
} 
<div class="wrapper"> 
    <div class="test" style="width: 50%; height: 200px;">current</div> 
    <div class="test" style="width: 50%; height: 200px;">neighbor</div> 
</div> 
1

Bir başka sabah için çekiçledikten sonra, sonunda mükemmel çözümü buldum. Aslında düşündüğümden çok daha basit, sadece karmaşık şeyleri karıştırıyordum.

ui.helper dinamik boyutunu elde etmeye çalışıyordum ve stop adresindeki komşu öğesini işlemeye çalıştım. Ama ya gerçekten çok dikkatli this elementin genişliği ve yakın komşu elementin genişliği ... yani ben aşağıdakileri yaparak sona:

start: function (event, ui) { 
     // just remember the total width of self + neighbor 
     this.widthWithNeighbor = 
      ui.originalSize.width + ui.element.next().outerWidth(); 
    }, 
    resize: function (event, ui) { 
     // then simply subtract it! 
     ui.element.next().width(this.widthWithNeighbor - ui.size.width); 
    }, 
    stop: function(event, ui) { 
     // clean up, is this needed? 
     delete this.widthWithNeighbor; 
    } 

Bu çözüm yan yana oturan n + 1 DIV öğeleri için çalışır. Genişliği yüksekliğe çevirirseniz, dikey olarak yığılmış DIV'lerle de çalışır.:)

Şerefe!

Working jsFiddle

Not: hayalet ve jQuery-UI seçeneğinden animasyon hala eskisi gibi garip sorunu veriyor. Bu jQuery 2.0.2 ve jQuery-UI 1.10.3'tür, umarım kısa zamanda yama yaparlar.

+0

Sana% ile çalışan boyutlandırılabilir unsurları almaya çalışırken sanıyordum: Benim durumumda Tamamen yüzden "width" değişim dışarı yorumladı genişliğini görmezden boyutlandırmak gerekli? Yanıtınız hem Firefox'ta hem de Chrome'da px cinsinden genişliklere dönecek gibi görünüyor. – apaul

+0

Hum ... evet haklısın. Aslen DIV'leri doğru şekilde ayarlamak için bir yol bulamadığım için% ile çalışmak istedim. N + 1 DIV ile çalışmayı değiştirebilirseniz, cevabınızı kabul edebilir miyim? – codenamezero

+0

Daha sonra bugün bir başka çatlak daha alacağım – apaul

0

Sıklıkla güncellenen bir kitaplığı özelleştirmenizi gerektirdiğinden yanıtımın "iyi bir uygulama" olmadığını biliyorum, ancak sorunumu çözdü: "Yeniden boyutlandırma" işlevini jquery-ui içinde değiştirin. .js dosyası istediğiniz gibi genişletmek için. Soruyu yanlış yaptım,

resize: function(event, ui) { 
     var that = $(this).resizable("instance"), 
      o = that.options, 
      os = that.originalSize, 
      op = that.originalPosition, 
      delta = { 
       height: (that.size.height - os.height) || 0, 
    ----------->//width: (that.size.width - os.width) || 0, 
       top: (that.position.top - op.top) || 0, 
       left: (that.position.left - op.left) || 0 
      }; 

      $(o.alsoResize).each(function() { 
       var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {}, 
        css = el.parents(ui.originalElement[ 0 ]).length ? 
     ----------------->[ /*"width",*/ "height" ] : 
          [ "width", "height", "top", "left" ]; 

       $.each(css, function(i, prop) { 
        var sum = (start[ prop ] || 0) + (delta[ prop ] || 0); 
        if (sum && sum >= 0) { 
         style[ prop ] = sum || null; 
        } 
       }); 

       el.css(style); 
      }); 
    }, 
+0

Evet, işe yarayacaktı, fakat size, 3. parti kütüphanelerini hacklemenin, geleceği korumak ve yükseltmek için popodaki bir acı olduğunu deneyimlerimden anlatacağım. Aynı zamanda, diğer gevşek bir şekilde ilgili kodları etkileyen, burayı takip etme ve yama/düzeltme/hacklemek için bir kâbus haline getiren belirsiz hataları da tanıtabilirsiniz. – codenamezero