亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

arctext.js實現文字平滑彎曲弧形效果的插件

2019-11-19 11:35:14
字體:
來源:轉載
供稿:網友

本文介紹了實現文字平滑彎曲弧形效果的插件-arctext.js,分享給大家,具體如下:

扇形的文字

有時候產品大佬就是很任性,說做一個宣傳頁,一個類似拱門的效果,每次文字不一樣,但是文字得呈現拱形狀,類似上圖啦。

嘗試自己使用canvas畫和css3的rotate旋轉div,兩種方法都是計算旋轉角度的時候很麻煩,因為可能5個字10個字,但是得均勻地呈拱形分布,要知道讓每個文字都沿著彎曲路徑排布相當的復雜,于是便發現了這個好用的插件---arctext.js

它能夠自動計算每個文字正確的旋轉角度,并且生成對應的CSS ,其實就是基于css3和jquery,使用起來也很方便。

1.創建一個容器裝文字

<h3 id="title">文字彎曲效果類似扇形拱橋狀</h3>

2.引入jquery和arctext.js

<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js" ></script><script src="jquery.arctext.js"></script>

3.調用arctext的方法:

$(function(){    $("#title").show().arctext({      radius:180    })  })

arctext參數說明:

  • radius:彎曲度數,最小的值是文字長度,如果設置為-1,則顯示直線。
  • rotate:默認true,為false則不旋轉文字
  • dir:默認1 (1:向下彎曲 非1(-1,0,2等):向上彎曲 )
  • fitText:默認false,如果你想嘗試使用fitText插件,設置為true,記住包裝的標簽需要fluid布局。

效果圖完整demo:

<!DOCTYPE html><html><head lang="en">  <meta charset="UTF-8">  <title></title>  <style>   #title{      font-size: 20px;      color: #ffe400;      text-align: center;    }  </style></head><body>  <h3 id="title">文字彎曲效果類似扇形拱橋狀</h3><script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js" ></script><script src="jquery.arctext.js"></script><script>  $(function(){    $("#title").arctext({      radius:180    })  })</script></body></html>

jquery.arctext.js

/** * Arctext.js * A jQuery plugin for curved text * http://www.codrops.com * * Copyright 2011, Pedro Botelho / Codrops * Free to use under the MIT license. * * Date: Mon Jan 23 2012 */(function( $, undefined ) {    /*!   * FitText.js 1.0  *  * Copyright 2011, Dave Rupert http://daverupert.com  * Released under the WTFPL license   * http://sam.zoy.org/wtfpl/  *  * Date: Thu May 05 14:23:00 2011 -0600  */  $.fn.fitText = function( kompressor, options ) {    var settings = {      'minFontSize' : Number.NEGATIVE_INFINITY,      'maxFontSize' : Number.POSITIVE_INFINITY    };    return this.each(function() {      var $this = $(this);       // store the object      var compressor = kompressor || 1; // set the compressor        if ( options ) {        $.extend( settings, options );      }        // Resizer() resizes items based on the object width divided by the compressor * 10      var resizer = function () {        $this.css('font-size', Math.max(Math.min($this.width() / (compressor*10), parseFloat(settings.maxFontSize)), parseFloat(settings.minFontSize)));      };      // Call once to set.      resizer();      // Call on resize. Opera debounces their resize by default.       $(window).resize(resizer);    });  };  /*   * Lettering plugin   *   * changed injector function:   *  add   for empty chars.   */  function injector(t, splitter, klass, after) {    var a = t.text().split(splitter), inject = '', emptyclass;    if (a.length) {      $(a).each(function(i, item) {        emptyclass = '';        if(item === ' ') {          emptyclass = ' empty';          item=' ';        }          inject += '<span class="'+klass+(i+1)+emptyclass+'">'+item+'</span>'+after;      });       t.empty().append(inject);    }  }    var methods       = {    init : function() {      return this.each(function() {        injector($(this), '', 'char', '');      });    },    words : function() {      return this.each(function() {        injector($(this), ' ', 'word', ' ');      });    },        lines : function() {      return this.each(function() {        var r = "eefec303079ad17405c889e092e105b0";        // Because it's hard to split a <br/> tag consistently across browsers,        // (*ahem* IE *ahem*), we replaces all <br/> instances with an md5 hash         // (of the word "split"). If you're trying to use this plugin on that         // md5 hash string, it will fail because you're being ridiculous.        injector($(this).children("br").replaceWith(r).end(), r, 'line', '');      });    }  };  $.fn.lettering     = function( method ) {    // Method calling logic    if ( method && methods[method] ) {      return methods[ method ].apply( this, [].slice.call( arguments, 1 ));    } else if ( method === 'letters' || ! method ) {      return methods.init.apply( this, [].slice.call( arguments, 0 ) ); // always pass an array    }    $.error( 'Method ' + method + ' does not exist on jQuery.lettering' );    return this;  };    /*   * Arctext object.   */  $.Arctext        = function( options, element ) {      this.$el  = $( element );    this._init( options );      };    $.Arctext.defaults   = {    radius : 0,  // the minimum value allowed is half of the word length. if set to -1, the word will be straight.    dir   : 1,  // 1: curve is down, -1: curve is up.    rotate : true, // if true each letter will be rotated.    fitText : false // if you wanna try out the fitText plugin (http://fittextjs.com/) set this to true. Don't forget the wrapper should be fluid.  };    $.Arctext.prototype   = {    _init        : function( options ) {            this.options    = $.extend( true, {}, $.Arctext.defaults, options );            // apply the lettering plugin.      this._applyLettering();            this.$el.data( 'arctext', true );            // calculate values      this._calc();            // apply transformation.      this._rotateWord();            // load the events      this._loadEvents();          },    _applyLettering   : function() {          this.$el.lettering();            if( this.options.fitText )        this.$el.fitText();            this.$letters  = this.$el.find('span').css('display', 'inline-block');        },    _calc        : function() {            if( this.options.radius === -1 )        return false;            // calculate word / arc sizes & distances.      this._calcBase();            // get final values for each letter.      this._calcLetters();        },    _calcBase      : function() {            // total word width (sum of letters widths)      this.dtWord   = 0;            var _self    = this;            this.$letters.each( function(i) {                        var $letter     = $(this),          letterWidth   = $letter.outerWidth( true );                _self.dtWord += letterWidth;                // save the center point of each letter:        $letter.data( 'center', _self.dtWord - letterWidth / 2 );              });            // the middle point of the word.      var centerWord = this.dtWord / 2;            // check radius : the minimum value allowed is half of the word length.      if( this.options.radius < centerWord )        this.options.radius = centerWord;            // total arc segment length, where the letters will be placed.      this.dtArcBase = this.dtWord;            // calculate the arc (length) that goes from the beginning of the first letter (x=0) to the end of the last letter (x=this.dtWord).      // first lets calculate the angle for the triangle with base = this.dtArcBase and the other two sides = radius.      var angle    = 2 * Math.asin( this.dtArcBase / ( 2 * this.options.radius ) );            // given the formula: L(ength) = R(adius) x A(ngle), we calculate our arc length.      this.dtArc   = this.options.radius * angle;          },    _calcLetters    : function() {            var _self    = this,        iteratorX  = 0;              this.$letters.each( function(i) {                  var $letter     = $(this),          // calculate each letter's semi arc given the percentage of each letter on the original word.          dtArcLetter   = ( $letter.outerWidth( true ) / _self.dtWord ) * _self.dtArc,          // angle for the dtArcLetter given our radius.          beta      = dtArcLetter / _self.options.radius,          // distance from the middle point of the semi arc's chord to the center of the circle.          // this is going to be the place where the letter will be positioned.          h        = _self.options.radius * ( Math.cos( beta / 2 ) ),          // angle formed by the x-axis and the left most point of the chord.          alpha      = Math.acos( ( _self.dtWord / 2 - iteratorX ) / _self.options.radius ),          // angle formed by the x-axis and the right most point of the chord.          theta      = alpha + beta / 2,          // distances of the sides of the triangle formed by h and the orthogonal to the x-axis.          x        = Math.cos( theta ) * h,          y        = Math.sin( theta ) * h,          // the value for the coordinate x of the middle point of the chord.          xpos      = iteratorX + Math.abs( _self.dtWord / 2 - x - iteratorX ),          // finally, calculate how much to translate each letter, given its center point.          // also calculate the angle to rotate the letter accordingly.          xval  = 0| xpos - $letter.data( 'center' ),          yval  = 0| _self.options.radius - y,          angle  = ( _self.options.rotate ) ? 0| -Math.asin( x / _self.options.radius ) * ( 180 / Math.PI ) : 0;                // the iteratorX will be positioned on the second point of each semi arc        iteratorX = 2 * xpos - iteratorX;                // save these values        $letter.data({          x  : xval,          y  : ( _self.options.dir === 1 ) ? yval : -yval,          a  : ( _self.options.dir === 1 ) ? angle : -angle        });                });        },    _rotateWord     : function( animation ) {            if( !this.$el.data('arctext') ) return false;            var _self = this;            this.$letters.each( function(i) {                var $letter     = $(this),          transformation = ( _self.options.radius === -1 ) ? 'none' : 'translateX(' + $letter.data('x') + 'px) translateY(' + $letter.data('y') + 'px) rotate(' + $letter.data('a') + 'deg)',          transition   = ( animation ) ? 'all ' + ( animation.speed || 0 ) + 'ms ' + ( animation.easing || 'linear' ) : 'none';                $letter.css({          '-webkit-transition' : transition,          '-moz-transition' : transition,          '-o-transition' : transition,          '-ms-transition' : transition,          'transition' : transition        })        .css({          '-webkit-transform' : transformation,          '-moz-transform' : transformation,          '-o-transform' : transformation,          '-ms-transform' : transformation,          'transform' : transformation        });            });          },    _loadEvents     : function() {            if( this.options.fitText ) {              var _self = this;                $(window).on( 'resize.arctext', function() {                    _self._calc();                    // apply transformation.          _self._rotateWord();                  });            }        },    set         : function( opts ) {            if( !opts.radius &&         !opts.dir &&        opts.rotate === 'undefined' ) {          return false;      }            this.options.radius = opts.radius || this.options.radius;      this.options.dir  = opts.dir || this.options.dir;            if( opts.rotate !== undefined ) {        this.options.rotate = opts.rotate;      }              this._calc();            this._rotateWord( opts.animation );          },    destroy       : function() {            this.options.radius = -1;      this._rotateWord();      this.$letters.removeData('x y a center');      this.$el.removeData('arctext');      $(window).off('.arctext');          }  };    var logError      = function( message ) {    if ( this.console ) {      console.error( message );    }  };    $.fn.arctext      = function( options ) {      if ( typeof options === 'string' ) {            var args = Array.prototype.slice.call( arguments, 1 );            this.each(function() {              var instance = $.data( this, 'arctext' );                if ( !instance ) {          logError( "cannot call methods on arctext prior to initialization; " +          "attempted to call method '" + options + "'" );          return;        }                if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {          logError( "no such method '" + options + "' for arctext instance" );          return;        }                instance[ options ].apply( instance, args );            });        }     else {          this.each(function() {              var instance = $.data( this, 'arctext' );        if ( !instance ) {          $.data( this, 'arctext', new $.Arctext( options, this ) );        }      });        }        return this;      };  })( jQuery );

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区在线视频| 日韩av免费在线看| 精品国产电影一区| 欧美激情精品久久久久久久变态| 欧美专区福利在线| 日韩亚洲精品视频| 欧美激情按摩在线| 欧美亚洲视频一区二区| 日韩在线视频网站| 欧美福利在线观看| 亚洲一级黄色av| 欧美国产第一页| 亚洲欧美激情一区| 久久的精品视频| 日韩精品视频在线观看免费| www.午夜精品| 伦伦影院午夜日韩欧美限制| 亚洲a区在线视频| 久久国产精品视频| 日韩av中文字幕在线播放| 久久在线视频在线| 中文字幕日韩精品有码视频| 国产欧美精品va在线观看| 日韩中文有码在线视频| 欧美成人在线网站| 国产免费久久av| 欧美影院成年免费版| 欧美亚州一区二区三区| 青青草精品毛片| 91sao在线观看国产| 国产精品∨欧美精品v日韩精品| 亚洲国产精品va在线看黑人动漫| 欧洲亚洲免费在线| 亚洲最大的网站| 亚洲人成在线观看网站高清| 成人免费xxxxx在线观看| 欧美成人精品h版在线观看| 俺去亚洲欧洲欧美日韩| 国产精品电影在线观看| 一二美女精品欧洲| 色综合久久88| 国产精品亚洲欧美导航| 国产精品久久久久久久午夜| 国产精品色午夜在线观看| 午夜精品视频在线| 国产一区二区欧美日韩| 日韩中文视频免费在线观看| 久久久久久欧美| 亚洲激情视频网| 欧美理论片在线观看| 日本不卡免费高清视频| 国产精品∨欧美精品v日韩精品| 青草青草久热精品视频在线网站| 欧美激情网站在线观看| 成人羞羞国产免费| 一区二区三区www| 亚洲日本中文字幕| 欧美老少做受xxxx高潮| 日韩一中文字幕| 精品伊人久久97| 久久久精品日本| 揄拍成人国产精品视频| 97久久精品人搡人人玩| 国产精品视频精品视频| 成人黄色在线播放| 国产一区二区三区在线播放免费观看| 精品国产精品三级精品av网址| 自拍偷拍亚洲欧美| 精品视频在线观看日韩| 国内精品久久久久久| 午夜精品久久久久久99热| 国产视频亚洲精品| 亚洲人成在线免费观看| 久久久久久国产精品美女| 欧洲成人免费aa| 欧美激情中文字幕乱码免费| 成人久久久久久久| 一区二区三区亚洲| 国产成人avxxxxx在线看| 久久久人成影片一区二区三区| 人体精品一二三区| 日韩精品免费综合视频在线播放| 两个人的视频www国产精品| 欧美国产高跟鞋裸体秀xxxhd| 国产狼人综合免费视频| 久久九九亚洲综合| 国产偷国产偷亚洲清高网站| 深夜福利一区二区| 午夜精品久久久久久久男人的天堂| 国产亚洲精品久久久久久| 欧美福利视频网站| 日韩麻豆第一页| 亚洲综合自拍一区| 欧美精品久久久久久久免费观看| 97在线视频免费看| 欧美成人午夜激情在线| 中文字幕一区二区三区电影| 国产精品久久久久久久久久尿| 欧美性在线视频| 亚州国产精品久久久| 日本一区二区在线播放| 久久久久这里只有精品| 38少妇精品导航| 欧美日韩国产精品一区| 成人国内精品久久久久一区| 欧美色视频日本版| 91在线视频成人| 九九久久久久99精品| 成人黄色片在线| 欧美中文字幕精品| 欧美一级高清免费播放| 国产精品视频xxxx| 国产一区二区欧美日韩| 国产91精品视频在线观看| 国产亚洲精品激情久久| 欧美大肥婆大肥bbbbb| 欧美刺激性大交免费视频| 亚洲福利视频在线| 国产成人鲁鲁免费视频a| 亚洲精品乱码久久久久久按摩观| 96pao国产成视频永久免费| 人人爽久久涩噜噜噜网站| 国产精品久久久久久久久借妻| 91成人国产在线观看| 久久久久北条麻妃免费看| 最近2019年手机中文字幕| 自拍偷拍免费精品| 欧美在线观看一区二区三区| 欧美国产亚洲视频| 日日狠狠久久偷偷四色综合免费| 大桥未久av一区二区三区| 91人人爽人人爽人人精88v| 国产精品久久久久久久久久久久久| 国产一区二区香蕉| 亚洲视频电影图片偷拍一区| 成人激情视频小说免费下载| 亚洲自拍欧美色图| 久久精品99国产精品酒店日本| 午夜精品国产精品大乳美女| 日韩成人免费视频| 亚洲 日韩 国产第一| 亚洲跨种族黑人xxx| 国产有码在线一区二区视频| 亚洲综合av影视| 亚洲深夜福利视频| 国产精品久久久久久久久影视| 96sao精品视频在线观看| 中文字幕亚洲一区二区三区五十路| 亚洲免费福利视频| 综合网中文字幕| 欧美黄色片在线观看| 色视频www在线播放国产成人| 欧美日韩亚洲一区二区| 国产精品一区二区av影院萌芽| 日本一欧美一欧美一亚洲视频| 久久久久国产一区二区三区| 日韩av有码在线| 久久天天躁日日躁| 日韩福利伦理影院免费| 欧美华人在线视频| 主播福利视频一区| 亚洲国产精品成人va在线观看| 国产精品高清网站| 亚洲石原莉奈一区二区在线观看|