《從案例中學(xué)習(xí)JavaScript》之實(shí)現(xiàn)對話效果(2)-- 附超簡單函數(shù)封裝技巧

說實(shí)話我有點(diǎn)吃驚,用js寫的對話效果在當(dāng)天都就被多個專題收錄,而且直接被推薦到首頁。我怎么也沒有想到隨便寫的一個小例子會這么受關(guān)注,莫非是因為貼圖的關(guān)系?

4f98a0a1cd11728b50834c3ecbfcc3cec2fd2c9c.jpg

嘛,無所謂這些小細(xì)節(jié)了。

既然如此,我們就把這個對話效果做得完善一些吧。上一節(jié)《從案例中學(xué)習(xí)JavaScript》之實(shí)現(xiàn)對話效果 中,我們主要通過 setInterval 方法做了一個輪詢,從而實(shí)現(xiàn)了字符串的動畫打印效果。但是,還不夠完善,比如,一旦字符長度超過了div的邊界,文字就會溢出。當(dāng)然,你可以給div加上一個 overflow:hidden 的樣式,可是這樣的話,就無法完整地顯示出對話了。

我們開始逐步解決這個問題,最終實(shí)現(xiàn)的效果就是,文字填滿對話框的時候,自動停住,需要用戶手動去點(diǎn)擊一下,然后進(jìn)行下一段對話。

本章主要講函數(shù)的封裝。

本節(jié)涉及的知識點(diǎn):

  • 函數(shù)的封裝技巧

下節(jié)涉及的知識點(diǎn):

  • div元素的 scrollHeight 和 clientHeight
  • 開關(guān)變量的使用技巧

有朋友反應(yīng)說案例文章太長,因此我決定多分幾章來寫,爭取每一篇都能把東西徹底講清楚,而又不至于看起來太累。

追求精煉和簡潔。

我希望通過本文,讓那些剛踏入 js 巨坑的朋友們徹底明白如何快速,有效地封裝一個方法。當(dāng)然,等你熟練了以后就無所謂了,愛怎么寫怎么寫。

好了,開始吧。

1. 頁面重構(gòu)

本期我對之前的頁面進(jìn)行了一次重構(gòu),我在原先的innerBox里面又嵌套了一個div,目的是為了讓文字區(qū)域的定位顯得更加靈活。不像之前那樣緊挨著邊框,不是太美觀。

現(xiàn)在的效果:

Paste_Image.png

對了,目錄結(jié)構(gòu)也做了一些調(diào)整:

Paste_Image.png

代碼如下:
css

body {
    background: url(../img/bg.jpg) no-repeat;
    background-size: 100%; 
}
.dialog {
    width:100%;
    height:100px;
    background:rgba(136,180,251,0.5);
    position:absolute;
    bottom: 0;
    
}
.dialog .pic {
    width:60px;
    height:60px;
    background:url(../img/1.png) no-repeat;
    background-size: 100%;
    display:inline-block;
    position: absolute;
    top:16px;
    left:16px;
    border-radius: 5px;
}

.dialog .innerBox{
    width:90%;
    height:80px;
    border:2px solid #dcc0a5;
    opacity: 0.8;
    left:85px;
    top:10px;
    position: absolute;
    border-radius: 5px;
    font-family: 微軟雅黑;
    color:#fff;
    text-shadow: 1px -1px 1px #333;
    padding:2px;
}
.dialog .innerBox #content {
    background: #E10482;
    margin:2px 10px 10px 10px;
    width:95%;
    height:99%;
    ine-height:25px;
    overflow: hidden;
    font-size: 20px;
}

html:

<body>
    <div  class='dialog'>
        <span class='pic'></span>
        <div id = 'innerBox' class='innerBox'>
            <div id='content'></div>
        </div>
    </div>
</body>

這樣就可以靈活地控制文字區(qū)域了,我們的文字就在content區(qū)域顯示出來,定位好后,別忘了將背景色給去掉。

.dialog .innerBox #content {
    /*background: #E10482;*/
    margin:2px 10px 10px 10px;
    width:95%;
    height:99%;
    ine-height:25px;
    overflow: hidden;
    font-size: 20px;
}

去掉背景色之后:


Paste_Image.png

對于初學(xué)者,我建議畫圖層的時候先加個背景色,這樣會清晰很多,確定沒問題之后,再把背景色給去掉。當(dāng)然,css高端玩家就忽略我說的話吧。

2. 方法的封裝

讓我們找到上一節(jié)的代碼,開始進(jìn)行方法封裝。

var innerBox = document.getElementsByClassName('innerBox')[0];
var text = 'JavaScript一種直譯式腳本語言,是一種動態(tài)類型、弱類型、基于原型的語言,內(nèi)置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,最早是在HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個應(yīng)用)網(wǎng)頁上使用,用來給HTML網(wǎng)頁增加動態(tài)功能。天空,你也要好好學(xué)習(xí)呀!';
var len = text.length;
var timer = null;
var index = 0;

timer = setInterval(function(){
    if(index == len){
        clearInterval(timer);
    }
    innerBox.innerHTML += text.charAt(index++);
},50);

封裝方法我認(rèn)為可以分為以下幾個步驟:

  • 零散地寫代碼,先把功能實(shí)現(xiàn)了再說。
  • 找不同,就是看哪些地方是不一定的。
  • 復(fù)制
  • 粘貼

這是我自己總結(jié)出來的,理論我們不多說,我直接上代碼,把我的做法和思路寫出來,你一看就懂了。

2.1 零散地寫代碼,先把功能實(shí)現(xiàn)了再說。

這一步,我們在上一個章節(jié)已經(jīng)實(shí)現(xiàn)。

2.2 找不同,就是看那些地方是不一定的。

這個太簡單了,就是你看一看自己寫的代碼中,哪些東西有可能是動態(tài)的。

讓我們仔細(xì)觀察上面的代碼,最起碼有以下三個地方是不確定的。

Paste_Image.png

首先,獲取的dom元素不確定。我們完全可以傳入一個id,然后再函數(shù)里面用document.getElementById 來包裹一下。其次,需要顯示的文本內(nèi)容不確定。最后,對話的速度也不確定,也就是輪詢的時間間隔,數(shù)值越小,速度越快。

這些不確定的地方 就是 函數(shù)需要傳入的參數(shù)。

所以,一個函數(shù)的模型就出來了。

/**
 * 游戲?qū)υ? * @param {string} id     對話框的id
 * @param {string} text    對話文本
 * @param {number} speed   速度
 */
var gameDialog = function(id,text,speed){

}

2.3 復(fù)制

現(xiàn)在,我們原封不動地將之前的代碼拷貝到函數(shù)里。為了看起來更直觀,我們采用 document.getElementById 的方式來獲取dom元素。源代碼在這里改動一下。

var gameDialog = function(id,text,speed){
    var innerBox = document.getElementById('content');
    var text = '文本內(nèi)容';
    var len = text.length;
    var timer = null;
    var index = 0;
    
    timer = setInterval(function(){
        if(index == len){
            clearInterval(timer);
        }
        innerBox.innerHTML += text.charAt(index++);
    },50);
}

是的,原封不懂地復(fù)制。

2.4 粘貼

最后一步就是填空題,小學(xué)題目了,把參數(shù)對好了一個個填進(jìn)去。

Paste_Image.png

ctrl + c , ctrl + v
ctrl + c , ctrl + v
ctrl + c , ctrl + v

var gameDialog = function(id,text,speed){
    var innerBox = document.getElementById(id);
    var text = text;
    var len = text.length;
    var timer = null;
    var index = 0;
    
    timer = setInterval(function(){
        if(index == len){
            clearInterval(timer);
        }
        innerBox.innerHTML += text.charAt(index++);
    },speed);
}

OK,完成!

就這么輕松加隨意。

當(dāng)然,可能有人會問,如果不確定的地方很多咋辦,我總不可能寫上十幾個參數(shù)吧。先賣個關(guān)子,以后會詳細(xì)說到。

測試

gameDialog('content',
    " 簡書客戶端中包含雜文時政、小說詩歌、電影評論、科技新聞,無論你的興趣如何構(gòu)成,總能在這里找到志趣相投的作者與內(nèi)容。"+
    " 簡書始終致力于做中文世界最好的寫作與閱讀平臺,集結(jié)最優(yōu)秀的創(chuàng)作者與文字愛好者,在嘈雜喧囂的網(wǎng)絡(luò)時代,重新沉淀并喚醒文字的力量。"
,38);
Paste_Image.png

封裝的好處不言而喻,我們只需要傳入?yún)?shù),打個括號就可以直接調(diào)用方法了,不再需要每次都把實(shí)現(xiàn)代碼寫一遍,這樣極大程度上實(shí)現(xiàn)了代碼的復(fù)用。

本章結(jié)束 ...

剽悍一小兔,電氣自動化畢業(yè)。
參加工作后對計算機(jī)感興趣,深知初學(xué)編程之艱辛。
希望將自己所學(xué)記錄下來,給初學(xué)者一點(diǎn)幫助。

免責(zé)聲明: 博客中所有的圖片素材均來自百度搜索,僅供學(xué)習(xí)交流,如有問題請聯(lián)系我,侵立刪,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,111評論 25 709
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,131評論 2 17
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,408評論 4 61
  • 一個人的消失 他曾經(jīng)是本市一家大型國有冶金企業(yè)的職工,有過“春風(fēng)得意馬蹄疾”時代。 進(jìn)廠不久,因為人長得精干,又能...
    邊緣孤俠閱讀 574評論 0 1
  • 2022年9月20日 或者歲月也不過如此 8年的時間,他們在一起,一天一天,一月一月 要不是到了這一天想要紀(jì)念,都...
    云在閱讀 403評論 0 1

友情鏈接更多精彩內(nèi)容