如何设置其内容不断被替换的段落的字体大小

wym*_*ony 19 html javascript css jquery jquery-plugins

我想设置一个带有段落的方框.每次单击按钮后,都应该替换此段落的文本.对我来说重要的是,这个文本应该作为一行保留在框内而不是中断.为此,我决定使用FitText.js插件,因为单词的长度不同(给定的单词只是一个例子).通过将其设置为表格和表格单元格,我实现了良好的对齐(垂直和水平).你有任何想法为什么给定的代码不能正常工作?

var words = ["Emily", "William Callum Smith Jr.", "Edwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaard", "Bradley"];

var button1 = document.getElementById("give_me_a_name_please");

button1.addEventListener("click", function1);

function getRandomItem(array){
    return array.splice(Math.floor(Math.random() * array.length), 1)[0];
}
   
function function1(){
    var randomWord = getRandomItem(words); 
    document.getElementById('word').innerHTML = randomWord;
}

$('#give_me_a_name_please').click(function() { 
    function resize () { $("#word").fitText(0.6); } 
});
Run Code Online (Sandbox Code Playgroud)
#parent_of_word {
  width: 20%;
  height: 20%;
  top: 10%;
  left: 10%;
  display: flex;
  position: absolute;
  text-align: center;
  justify-content: center;
  line-height: 100%;
  border: 5px solid black;
  word-break: keep-all;
  white-space: nowrap;
}

#word {
  color: brown;
  display:flex;
  align-items: center;
  justify-content: center;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/davatron5000/FitText.js/0b4183af/jquery.fittext.js"></script>


<div id="parent_of_word">
    <p id="word">----------------</p>
</div>
<button id="give_me_a_name_please">Button</button>
Run Code Online (Sandbox Code Playgroud)

Bof*_*ain 8

编辑:更新的代码片段和JSFiddle,具有更优化的循环.

我已经调整了您的示例代码,使其更精简,更容易理解.它也使用纯jQuery而不是jQuery和纯JS的混合,并且在按下按钮几次后不会停在'undefined',导致一个空数组.它将改为循环遍历所有单词.

这里有两种主要的解决方案.

  • 我们从这种迭代方法中获取灵感,将JavaScript Scale Text设置为Fixed Div,其中字体大小以固定值开始,然后根据需要缩小,直到单词的宽度小于其容器的宽度.不需要插件,因为这非常简单.
  • 第二部分实现,overflow:hidden以便在文本如此庞大以至于不能缩小到足够小的时候(参见while循环中的下限8),它仍然不会突破其容器.

另请参见JSFiddle版本.

var words = [
  "Emily",
  "William Callum Smith Jr.",
  "Edwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaard",
  "EdwaaaaaaaaaaaaaaaaaaaAAAAAAAAAaaaaaAAaaaaAAAaaaaaaaaaaaaaaaaaaaaaaaaard",
  "Bradley",
  "The quick brown fox"
];

var changeWord = $("#change_word");
var parentOfWord = $("#parent_of_word");
var word = $("#word");
var idx = 0;

changeWord.click(function() {
  word.text(words[idx++ % words.length]);
  var size = 40;
  word.css("font-size", size);
  while (word.width() > parentOfWord.width() && size > 8) {
    word.css("font-size", --size);
  }
});
Run Code Online (Sandbox Code Playgroud)
#parent_of_word {
  width: 200px;
  height: 50%;
  top: 50px;
  left: 50%;
  margin-left: -100px;
  display: flex;
  position: absolute;
  text-align: center;
  justify-content: center;
  line-height: 100%;
  border: 5px solid black;
  word-break: keep-all;
  white-space: nowrap;
  overflow: hidden;
}

#word {
  color: brown;
  display: flex;
  align-items: center;
  justify-content: center;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>
  <button id="change_word">Button</button>
</p>
<div id="parent_of_word">
  <p id="word">----------------</p>
</div>
Run Code Online (Sandbox Code Playgroud)


And*_*hiu 3

要将文本排成一行而不中断:

white-space: nowrap;
Run Code Online (Sandbox Code Playgroud)

要将任何内容垂直和水平居中:

display:flex;
align-items: center;
justify-content: center;
Run Code Online (Sandbox Code Playgroud)

应用于您的示例:

white-space: nowrap;
Run Code Online (Sandbox Code Playgroud)
display:flex;
align-items: center;
justify-content: center;
Run Code Online (Sandbox Code Playgroud)
var words = ["Emily", "William Callum Smith Jr.", "Edwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaard", "Resize this to see how it behaves on narrower screens. Lorem ipsum dolor sit amet bla bla bla, lorem ipsum dolor sit amet bla bla bla, lorem ipsum dolor sit amet bla bla bla.", "Bradley"];


var button1 = document.getElementById("give_me_a_name_please");


button1.addEventListener("click", function1);

function getRandomItem(array){
  return array.splice(Math.floor(Math.random() * array.length), 1)[0];
}
   
function function1(){
var randomWord = getRandomItem(words) || 'No more options.'; 
document.getElementById('word').innerHTML = randomWord;
}

$( '#give_me_a_name_please' ).click(function() { 
function resize () { $("#word").fitText(0.6); 
} 
});
Run Code Online (Sandbox Code Playgroud)