4 回答

TA貢獻1850條經驗 獲得超11個贊
如果您檢查計算出的字體大小,您會發現一些問題:
所以我的假設是,由于您正在轉換所有 CSS 屬性(通過設置您不排除任何屬性更改),因此在計算新字體大小時,transition: 0.3s
寬度不是 600px。.resize
嘗試更長的過渡時間,例如 2 秒。您可能需要點擊兩次以上才能獲得最終的字體大小。如果發生這種情況,那么您就發現了問題。
如果您還想轉換寬度更改,則解決方案是將所需寬度 (600px) 傳遞給fontResize()
而不是依賴于 HTML 元素寬度(將更改 0.3 秒)。

TA貢獻1804條經驗 獲得超7個贊
文本立即調整大小 - 問題是調整大小函數將黃色矩形的初始尺寸作為調整大小的度量 - 而不是動畫完成后的最終尺寸。因此,文本大小調整為相同大小,您看不到任何差異。
當您單擊該按鈕時,您將指示文本調整為黃色矩形的大小。但此時黃色矩形尚未完全調整大小,基本上文本元素的大小是相對于黃色矩形的初始尺寸調整的。
要驗證這一點,您只需對文本動畫應用 setTimeout,您就會看到,如果黃色矩形有時間進行動畫處理,則文本元素將按照您的預期進行動畫處理。
要明白我的意思,請將點擊處理程序替換為以下代碼。
$('button.do-resize').click(function() { $('#chartdiv').width(600) setTimeout(function() { $('#chartdiv').fontResize() }, 300) })
所以你看,如果你給矩形擴展時間,文本將能夠從中獲得更大的尺寸來擴展。
但是如果你硬編碼最終的字體大小,動畫將立即開始
代替:
$el.css('font-size', ($el.width() * $el.height()) / 2800 + 'px');
嘗試:
$el.css('font-size','40px');
要點是,確保在單擊按鈕時確定適當的尺寸。

TA貢獻1827條經驗 獲得超9個贊
由于您通過執行 來硬編碼點擊處理程序中的最終寬度$('#chartdiv').width(600),因此您不妨將其作為參數傳遞以幫助您調整文本大小。
而不是這樣的:
$el.css('font-size', ($el.width() * $el.height()) / 2800 + 'px');
更像這樣的東西:
$el.css('font-size', (parameter * parameter) / 2800 + 'px');
這是一個正在運行的JSFiddle。
在我的示例中,所有內容都會立即動畫到正確的位置。
請參閱我所做更改的評論:
$.fn.fontResize = function(newSize) { // receive parameter
return this.each(function() {
$el = $(this)
const halfSize = newSize/2 // divide width by 2
$el.css('font-size', (halfSize * halfSize) / 2800 + 'px'); // apply in calculation
});
}
$('button.do-resize').click(function(){
const newSize = 600 // declare as const to use twice in next line
$('#chartdiv').width(newSize).fontResize(newSize) // pass as parameter to fontResize
})

TA貢獻1843條經驗 獲得超7個贊
添加以下內容:
$('#chartdiv').on('transitionend', function () {
$(this).fontResize()
});
每次轉換結束時都會觸發fontResize(),以確保使用正確的 div。
$.fn.fontResize = function() {
return this.each(function() {
const $el = $(this);
$el.css('font-size', ($el.width() * $el.height()) / 2800 + 'px');
});
}
$('button.do-resize').click(function() {
$('#chartdiv').width(Math.random()*600).fontResize() // use plugin function
})
$('#chartdiv').on('transitionend', function () {
$(this).fontResize()
});
$('.resize').resizable({
minWidth: 210,
minHeight: 120,
resize: function(event, ui) {
$(this).fontResize(); // use plugin function
}
});
.resize {
font-size: 2.8vh;
white-space: nowrap;
color: black;
background: yellow;
cursor: move;
width: 300px;
height: 130px
}
.resize {
transition: 0.3s;
}
<button class="do-resize" type="button">Click Me!</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/themes/smoothness/jquery-ui.css">
<div class="resize" id="chartdiv">Some name that is very long</div>
添加回答
舉報