欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

arctext.js實(shí)現(xiàn)文字平滑彎曲弧形效果的插件

 更新時間:2019年05月13日 15:36:44   作者:菜菜___  
這篇文章主要介紹了arctext.js實(shí)現(xiàn)文字平滑彎曲弧形效果的插件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

扇形的文字

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

嘗試自己使用canvas畫和css3的rotate旋轉(zhuǎn)div,兩種方法都是計(jì)算旋轉(zhuǎn)角度的時候很麻煩,因?yàn)榭赡?個字10個字,但是得均勻地呈拱形分布,要知道讓每個文字都沿著彎曲路徑排布相當(dāng)?shù)膹?fù)雜,于是便發(fā)現(xiàn)了這個好用的插件---arctext.js

它能夠自動計(jì)算每個文字正確的旋轉(zhuǎn)角度,并且生成對應(yīng)的CSS ,其實(shí)就是基于css3和jquery,使用起來也很方便。

1.創(chuàng)建一個容器裝文字

<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.調(diào)用arctext的方法:

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

arctext參數(shù)說明:

  • radius:彎曲度數(shù),最小的值是文字長度,如果設(shè)置為-1,則顯示直線。
  • rotate:默認(rèn)true,為false則不旋轉(zhuǎn)文字
  • dir:默認(rèn)1 (1:向下彎曲 非1(-1,0,2等):向上彎曲 )
  • fitText:默認(rèn)false,如果你想嘗試使用fitText插件,設(shè)置為true,記住包裝的標(biāo)簽需要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 &nbsp; 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='&nbsp;';
        }  
        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 );

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • 13 個JavaScript 性能提升技巧分享

    13 個JavaScript 性能提升技巧分享

    13個簡單的代碼優(yōu)化方法,可以讓你的代碼在 Chrome 的 V8 JavaScript 引擎編譯/運(yùn)行你的 JavaScript 代碼更加快速
    2012-07-07
  • javascript中substring()、substr()、slice()的區(qū)別

    javascript中substring()、substr()、slice()的區(qū)別

    在js中字符截取函數(shù)有常用的三個slice()、substring()、substr()了,下面我來給大家介紹slice()、substring()、substr()函數(shù)在字符截取時的一些用法與區(qū)別吧。
    2015-08-08
  • js+CSS簡單實(shí)現(xiàn)瀑布流布局

    js+CSS簡單實(shí)現(xiàn)瀑布流布局

    瀑布流布局,是一種視覺表現(xiàn)為參差不齊的多欄布局,常用于內(nèi)容以圖片為主的頁面展示,本文將使用css和js兩種方式來實(shí)現(xiàn)瀑布流布局,需要的可以參考下
    2023-11-11
  • JS圖片定時翻滾效果實(shí)現(xiàn)方法

    JS圖片定時翻滾效果實(shí)現(xiàn)方法

    這篇文章主要介紹了JS圖片定時翻滾效果實(shí)現(xiàn)方法,涉及javascript結(jié)合時間函數(shù)實(shí)現(xiàn)頁面元素動態(tài)切換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • JS電梯導(dǎo)航的實(shí)現(xiàn)示例

    JS電梯導(dǎo)航的實(shí)現(xiàn)示例

    本文主要介紹了JS電梯導(dǎo)航的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 小程序中實(shí)現(xiàn)自定義頭部導(dǎo)航組件的詳細(xì)過程

    小程序中實(shí)現(xiàn)自定義頭部導(dǎo)航組件的詳細(xì)過程

    這篇文章主要介紹了小程序中實(shí)現(xiàn)自定義頭部導(dǎo)航組件的詳細(xì)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • js簡單實(shí)現(xiàn)豎向tab選項(xiàng)卡的方法

    js簡單實(shí)現(xiàn)豎向tab選項(xiàng)卡的方法

    這篇文章主要介紹了js簡單實(shí)現(xiàn)豎向tab選項(xiàng)卡的方法,涉及javascript實(shí)現(xiàn)tab切換效果的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-05-05
  • Js中async/await的執(zhí)行順序詳解

    Js中async/await的執(zhí)行順序詳解

    隨著async/await正式納入ES7標(biāo)準(zhǔn),越來越多的人開始研究據(jù)說是異步編程終級解決方案的 async/await。下面這篇文章主要給大家介紹了關(guān)于Js中async/await執(zhí)行順序的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • 手機(jī)端轉(zhuǎn)盤抽獎代碼分享

    手機(jī)端轉(zhuǎn)盤抽獎代碼分享

    轉(zhuǎn)盤,也有一種說法叫抽獎轉(zhuǎn)盤,大體上是由一塊圓形的面板上面有很多的獎項(xiàng)設(shè)置,在圓形面板的前面,還有一根指針是固定的,下面,小編給大家分享手機(jī)端轉(zhuǎn)盤抽獎,需要的朋友可以參考下
    2015-09-09
  • javascript消除window.close()的提示窗口

    javascript消除window.close()的提示窗口

    有人問起,怎么去掉js調(diào)用window.close()時怎么去掉那可惡的提示,咋一看好像還真不好弄,IE的安全機(jī)制好像就不允許通過腳本關(guān)閉本頁面,但是IE好像可以允許js關(guān)閉彈出窗口,那我們是不是可以通過一定的技巧欺騙一下IE,繞過去呢。鼓搗了幾下,似乎還真可以做到
    2015-05-05

最新評論