Jak animować rysunek tekstu na stronie internetowej?

Chcę mieć stronę internetową, która ma jedno wyśrodkowane słowo.

Chcę, aby to słowo było rysowane za pomocą animacji, tak aby Strona "zapisywała" słowo w ten sam sposób, co my, tzn. zaczyna się w jednym punkcie i rysuje linie i krzywe w czasie, tak aby końcowy wynik był glifem.

Nie obchodzi mnie, czy to jest zrobione z <canvas> lub DOM, i nie obchodzi mnie, czy to jest zrobione z JavaScript lub CSS. Brak jQuery byłby miły, ale nie wymagany.

How can I do to? Szukałam wyczerpująco bez powodzenia.

Author: epistemex, 2015-04-28

3 answers

Chcę, aby to słowo zostało narysowane animacją, tak aby Strona "pisze" słowo w ten sam sposób, w jaki byśmy

Wersja Canvas

To będzie rysować pojedyncze znaki bardziej jak pisane ręcznie. Używa długiego wzorca myślnika, w którym kolejność włączania/wyłączania jest zamieniana w czasie na znak. Ma również parametr prędkości.

Migawka
przykładowa animacja (zobacz demo poniżej)

Aby zwiększyć realizm i poczucie organiczności, dodałem losowe odstępy między literami, przesunięcie delta y, przezroczystość, bardzo subtelny obrót i wreszcie użycie już "odręcznej" czcionki. Można je zapakować jako parametry dynamiczne, aby zapewnić szeroką gamę "stylów pisania".

Dla jeszcze bardziej realistycznego wyglądu wymagane są dane ścieżki, które nie są domyślnie. Ale jest to krótki i wydajny fragment kodu, który przybliża ręcznie pisane zachowanie i jest łatwy do zaimplementowania.

Jak to działa

Definiując wzorzec kreski mamy może tworzyć maszerujące mrówki, kropkowane linie i tak dalej. Korzystając z tego, definiując bardzo długą kropkę dla kropki " off "i stopniowo zwiększając kropkę "on", daje to iluzję rysowania linii podczas głaskania podczas animowania długości kropki.

Ponieważ off dot jest tak długi, powtarzający się wzór nie będzie widoczny(długość będzie się różnić w zależności od rozmiaru i właściwości użytego kroju pisma). Ścieżka listu będzie miała długość, więc musimy się upewnić, że jesteśmy każda kropka przynajmniej pokrywa tę długość.

Dla liter składających się z więcej niż jednej ścieżki (np. O, R, P itd.) jak jeden jest dla konturu, jeden jest dla pustej części, linie będą wyglądać na narysowane jednocześnie. Nie możemy wiele z tym zrobić za pomocą tej techniki, ponieważ wymagałoby to oddzielnego głaskania dostępu do każdego segmentu ścieżki.

Zgodność

Dla przeglądarek, które nie obsługują elementu canvas, alternatywny sposób wyświetlania tekstu może być umieszczony pomiędzy znaczniki, na przykład tekst stylizowany:

<canvas ...>
    <div class="txtStyle">STROKE-ON CANVAS</div>
</canvas>

Demo

To tworzy na żywo animowane stroke-on (BEZ zależności) -

var ctx = document.querySelector("canvas").getContext("2d"),
    dashLen = 220, dashOffset = dashLen, speed = 5,
    txt = "STROKE-ON CANVAS", x = 30, i = 0;

ctx.font = "50px Comic Sans MS, cursive, TSCu_Comic, sans-serif"; 
ctx.lineWidth = 5; ctx.lineJoin = "round"; ctx.globalAlpha = 2/3;
ctx.strokeStyle = ctx.fillStyle = "#1f2f90";

(function loop() {
  ctx.clearRect(x, 0, 60, 150);
  ctx.setLineDash([dashLen - dashOffset, dashOffset - speed]); // create a long dash mask
  dashOffset -= speed;                                         // reduce dash length
  ctx.strokeText(txt[i], x, 90);                               // stroke letter

  if (dashOffset > 0) requestAnimationFrame(loop);             // animate
  else {
    ctx.fillText(txt[i], x, 90);                               // fill final letter
    dashOffset = dashLen;                                      // prep next char
    x += ctx.measureText(txt[i++]).width + ctx.lineWidth * Math.random();
    ctx.setTransform(1, 0, 0, 1, 0, 3 * Math.random());        // random y-delta
    ctx.rotate(Math.random() * 0.005);                         // random rotation
    if (i < txt.length) requestAnimationFrame(loop);
  }
})();
canvas {background:url(http://i.imgur.com/5RIXWIE.png)}
<canvas width=630></canvas>
 253
Author: epistemex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-19 14:50:06

Możesz zrobić coś takiego używając svg stroke-dasharray

EDIT The new hottie

Można to również zrobić, owijając każdą literę elementem tspan ręcznie

var s = Snap('svg');
var text = 'Some Long Texts'
var len = text.length;
var array = [];
for (var x = 0; x < len; x++) {
  var t = text[x]
  array.push(t);
}
var txt = s.text(50, 50, array)
$('tspan').css({
  'font-size': 50,
  fill: 'none',
  stroke: 'red',
  'stroke-dasharray': 300,
  'stroke-dashoffset': 300
})

$('tspan').each(function(index) {
  $(this).stop(true, true).delay(800 * index).animate({
    'stroke-dashoffset': 0,
  }, 800, function() {
    $(this).css('fill', 'red')
  })
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg width="500" height="500">
</svg>

text {
  stroke-dasharray: 1000;
  stroke-dashoffset: 1000;
  -webkit-animation: draw 8s forwards;
}
@-webkit-keyframes draw {
  100% {
    stroke-dashoffset: 0;
  }
}
text {
  stroke-dasharray: 1000;
  stroke-dashoffset: 1000;
  -webkit-animation: draw 8s forwards;
  -moz-animation: draw 8s forwards;
  -o-animation: draw 8s forwards;
  -ms-animation: draw 8s forwards;
  animation: draw 8s forwards;
}
@-webkit-keyframes draw {
  100% {
    stroke-dashoffset: 0;
  }
}
@-moz-keyframes draw {
  100% {
    stroke-dashoffset: 0;
  }
}
@-o-keyframes draw {
  100% {
    stroke-dashoffset: 0;
  }
}
@-ms-keyframes draw {
  100% {
    stroke-dashoffset: 0;
  }
}
@keyframes draw {
  100% {
    stroke-dashoffset: 0;
  }
}
<svg width="500" height="500">
  <text x="100" y="80" fill="none" stroke="black" stroke-width="1" font-size="50">Some text</text>
</svg>

Bez keyframes animacji możesz zrobić coś takiego

<svg width="500" height="500">
  <text x="100" y="80" fill="none" stroke="black" stroke-width="5" font-size="50"  stroke-dasharray="1000"
  stroke-dashoffset="1000">Some text
  <animate attributeName="stroke-dashoffset"
    from="1000"
    to="0" 
    dur="8s"
      fill="freeze">
          
      </animate> </text>
</svg>

I do obsługi IE można użyć jquery / javascript

$('text').animate({
    'stroke-dashoffset':'0'
},8000)
text {
  stroke-dasharray: 1000;
  stroke-dashoffset: 1000;
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg width="500" height="500">
  <text x="100" y="80" fill="none" stroke="black" stroke-width="1" font-size="50" 
 >Some text
  </text>
</svg>
 209
Author: Akshay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 03:16:29

Tylko CSS:

@keyframes fadein_left {
  from {
    left: 0;
  }
  to {
    left: 100%;
  }
}

#start:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0%;
  opacity: 0.7;
  height: 25px;
  background: #fff;
  animation: fadein_left 3s;
}
<div id="start">
  some text some text some text some text some text
</div>
 2
Author: zloctb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-30 21:43:52