Анимация CSS / переход не работает должным образом

#javascript #html #jquery #css

#javascript #HTML #jquery #css

Вопрос:

Вот без кода анимации / перехода проверьте это:

 <!DOCTYPE html>
<html>
<head>
    <style>
        
    </style>

</head>
<body>
    <!DOCTYPE html>
<html>

<head>
  <style>
    .resize {
      font-size: 2.8vh;
      white-space: nowrap;
      color: black;
      background: yellow;
      cursor: move;
      width: 300px;
      height: 130px
    }
        
  </style>

</head>

<body>

  <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>


</body>

</html>
    <script type="text/javascript">
        $.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(600).fontResize()// use plugin function
})


$('.resize').resizable({
  minWidth: 210,
  minHeight: 120,
  resize: function(event, ui) {   
    $(this).fontResize();// use plugin function
  }
});
    </script>
</body>
</html> 

и теперь это с кодом анимации / перехода: просто я добавил сюда только переход CSS для класса div, .resize{transition: 0.3s;} и я думаю, что он должен работать, но проблема в том, что это не работает с одним щелчком мыши, если я нажимаю один раз, текст font-size становится маленьким, а затем после второго щелчка он работает, в чем проблемапроблема, пожалуйста, проверьте это. я хочу работать с ним только одним щелчком мыши.

 <!DOCTYPE html>
<html>
<head>
    <style>
        
    </style>

</head>
<body>
    <!DOCTYPE html>
<html>

<head>
  <style>
    .resize {
      font-size: 2.8vh;
      white-space: nowrap;
      color: black;
      background: yellow;
      cursor: move;
      width: 300px;
      height: 130px
    }
    
    .resize{transition: 0.3s;}
    
  </style>

</head>

<body>

  <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>


</body>

</html>
    <script type="text/javascript">
        $.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(600).fontResize()// use plugin function
})


$('.resize').resizable({
  minWidth: 210,
  minHeight: 120,
  resize: function(event, ui) {   
    $(this).fontResize();// use plugin function
  }
});
    </script>
</body>
</html> 

Ответ №1:

Если вы проверите вычисленный размер шрифта, вы обнаружите некоторые проблемы:

введите описание изображения здесь

Итак, я предполагаю, что, поскольку вы переносили все свойства CSS (установив transition: 0.3s , что вы не исключаете никаких изменений свойств), ширина .resize не будет составлять 600 пикселей к моменту вычисления нового размера шрифта. Попробуйте использовать более длительное время перехода, например, 2 секунды. Вероятно, вам потребуется более 2 кликов, чтобы получить окончательный размер шрифта. Если это произойдет, значит, вы нашли проблему.

Решением, если вы хотите также изменить ширину, было бы передать желаемую ширину (600 пикселей) fontResize() и не полагаться на ширину элемента HTML (которая будет меняться в течение .3 секунд).

Комментарии:

1. можете ли вы помочь мне, как это сделать

Ответ №2:

Текст немедленно изменяет размер — проблема в том, что функция изменения размера принимает начальные размеры желтого прямоугольника в качестве мер для изменения размера, а не конечные размеры после завершения анимации. Таким образом, размер текста изменяется до того же размера, и вы не видите разницы.

Когда вы нажимаете кнопку, вы указываете тексту изменить размер до размера желтого прямоугольника. Но на данный момент желтый прямоугольник не полностью изменен, в основном текстовый элемент изменяется относительно начальных размеров желтого прямоугольника.

Чтобы убедиться в этом, вам нужно только применить 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');
 

Дело в том, что обязательно определите соответствующие размеры во время нажатия кнопки.

Комментарии:

1. да, вы правы, но есть ли какое-либо другое решение, которое может решить эту проблему с помощью «$ el.css (‘font-size’, ($ el.width () * $ el.height ()) / 2800 ‘px’);» эти коды.

Ответ №3:

Добавьте следующее:

 $('#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> 

Комментарии:

1. это все еще не решает мою проблему, пожалуйста, четко прочитайте вопрос

2. @RRSuthar вы сказали, что я хочу работать с ним только одним щелчком мыши. —> он работает одним щелчком мыши в моем коде

3. но много раз это не работает, посмотрите еще раз, пожалуйста

4. @RRSuthar ну, это так, вы заметили, что я использую случайную функцию?

5. @RRSuthar не могли бы вы уточнить, потому что я не совсем понимаю, что вы имеете в виду, а что не работает

Ответ №4:

Поскольку вы жестко кодируете конечную ширину в обработчике кликов, выполнив это $('#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
})
 

Комментарии:

1. Он работает, но теперь функция перетаскивания мыши не работает, проверьте это еще раз, пожалуйста