H5項目開發分享——用Canvas合成文字

以前曾用Canvas合成、裁剪、圖片等《用H5中的Canvas等技術制作海報》。這次用Canvas來畫文字。

下圖中“老王考到駕照后”這幾個字是畫在Canvas上的,與在PS中打入的字非常接近,毫無違和感。

前面一段時間也在研讀JavaScript設計模式相關的知識,這次正好小小的實踐一下,但對設計模式的理解還不是很深。

?

一、項目總覽

??

總共就兩張頁面,第一張是選擇性別,輸入名字,第二張頁面是合成文字,并展示出來。

雖然頁面很簡單,但在做這個項目的時候,涉及到了很多方面,自定義字體、CSS3動畫、Canvas、CSS3選擇器、本地緩存、構建工具等。

下圖是工程文件總覽:

?

二、構建工具

目前開發采用的是自動化構建工具“gulp”,“config.js”和“gulpfile.js”都是配置文件。

關于這個工具,以前曾寫過介紹《前端自動化構建工具gulp記錄

有了構建工具后,就能方便的壓縮圖片、壓縮CSS、壓縮JS、編譯Sass文件、編譯Jade文件、搭建本地服務器等。

網上有個很時髦的工具“webpack”,在構建工具也引用了,目前就僅僅用來合并JS。

?

三、HTML

1)Jade

不同于以前編寫html,這里我使用了Jade,一個模版引擎。

通過使用Jade,可以將html中通用的抽象出來,還可以使用循環、條件、繼承等特性,減少代碼,代碼也更可讀。

Jade代碼如下,下面是一個模版layout中的代碼,其他頁面可以繼承他,這樣很多通用的代碼就不用再寫了。

?

2)flexible.js

這段腳本是用來解決H5頁面終端適配的。具體的使用方法可以參考這里

在腳本中會做兩個操作,

一個是放大,如果是IOS系統,那么會根據當前的設備像素比來做頁面的放大操作,如果是Android就還是默認的。

例如Iphone6中設備像素比是2,那么就設置為0.5,也就是1/2。

<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

另外一個就是計算rem的基準值,獲取到“document.documentElement”的寬度,再除以10,作為一個基準值。

var width = docEl.getBoundingClientRect().width;
var rem = width / 10;

具體可以參考《移動開發屏幕適配分析

?

三、CSS

1)Sass

目前開發CSS,會使用Sass預編譯工具,它允許你使用變量、嵌套規則、 mixins、導入等眾多功能,并且完全兼容 CSS 語法。

Sass 有助于保持大型樣式表結構良好,同時也讓你能夠快速開始小型項目。

通過Sass,可以將CSS模塊化、代碼更清晰、并且能將通用的代碼抽象出來復用。

下面的代碼是引用了自己寫的一個庫“PrimusUI”中的部分模塊:

移動端開發,由于屏幕尺寸很多,所以用彈性布局,會比較方便,專門封裝了一段操作彈性布局各個屬性的代碼“grid”。

傳統的浮動布局,很容易出現各種問題,尤其是字體間的對齊,非常頭疼,具體可以參考《CSS3伸縮盒Flexible Box

?

2)自定義字體圖標

上圖中的“icon”,封裝了自定義字體的CSS代碼。

自定義字體圖標相對于圖片,有可控制大小、顏色、對齊更簡單等優勢。

并且現在移動端都能支持,適當的使用自定義字體可以提升頁面性能。

國外有“Font Awesome”,國內有“iconfont”,iconfont中有豐富的圖標,基本能滿足你日常的開發需求,如果沒有還可以自己制作矢量圖,上傳到網上自動轉換。

我將用到的圖標放到了一個項目中,以便重復使用。

?

3)CSS3

CSS3擴展了很多屬性,下圖中的選中的勾就是通過偽類實現的。

input[type=radio]:checked {background: url(../img/checked.png) no-repeat 32px 5px;background-size: 40px 40px;
}

還經常會用到偽對象選擇符“::after”或“::before”,有了這兩個就相當于多了兩個標簽。

上圖中的長按保存這張圖片就設置在偽對象中。

&::after {position: absolute;content: "";background: url(../img/prompt.png) no-repeat;width: 350px;top: 40px;left: 50%;margin-left: -175px;height: 70px;background-size: 100% 100%;
}

還會做一些小動畫,脈沖,上下位移,漸變等,更多動畫屬性可以參考《CSS3中的動畫效果記錄

?

四、JavaScript

1)通用模塊

JS與CSS一樣,也整理了一些通用的模塊,在實際項目中,直接引用即可。

上面的模塊一個封裝了緩存,一個封裝了平時需要操作DOM的相關方法。

DOM中有個方法是用于圖片預加載的,主要是為了圖片阻塞頁面加載CSS、JS、HTML資源,提升頁面性能,關于預加載可以參考《圖片預加載與懶加載

/*** 圖片預加載*/
$("img[data-src]").each(function() {var $this = $(this);var src = $this.data('src');dom.preImage(src, function() {$this.attr('src', src);});
});

?

2)命令模式封裝的Canvas

命令模式是將請求與實現解耦并封裝成獨立對象,根據不同參數,執行不同功能。

這里將canvas畫文本與合成圖片封裝了起來:

var CanvasCommand = (function() {var canvas = document.createElement('canvas');var ctx = canvas.getContext('2d');canvas.width = 520;canvas.height = 500;var $compose = $('#compose');var Action = {fillText: function(font) {var canvas2 = document.createElement('canvas');var sizes = [], width=0;$.each(font, function(key, value) {sizes.push(value['size']);width += value['size'] * value['txt'].length + 5;});canvas2.width = width - 5;//畫布寬度var max = Math.max.apply(this, sizes);canvas2.height = max * 1.5;//畫布高度var ctx2 = canvas2.getContext('2d');ctx2.fillStyle = "#ffed03";ctx2.fillRect(0, 0, canvas2.width, canvas2.height);var x = 0;$.each(font, function(key, value) {ctx2.font = (value['bold'] || '')+" "+value['size']+"px serif";ctx2.fillStyle = "black";ctx2.fillText(value['txt'], x, max);x += value['size'] * value['txt'].length + 5;});return canvas2;},fillImage: function(num, txts) {var qrcode = new Image();qrcode.src = 'img/qrcode.png';qrcode.onload = function() {var image = new Image();image.src = 'img/story/'+num+'.png';image.onload = function() {ctx.drawImage(image, 0, 0, canvas.width, canvas.height);ctx.drawImage(qrcode, 20, 400, 80, 80);$.each(txts, function(key, value) {ctx.drawImage(value, value.left, value.top, value.width, value.height);});var base64 = canvas.toDataURL("image/jpeg", 0.6);$compose.attr('src', base64);};};}};return {/*** 命令格式 command,params* @param param*/execute: function(param) {return Action[param.command].apply(Action, param.params);//執行命令
        }}
})();

1.這里使用了canvas中的fillText來渲染文本,在渲染的時候還通過font設置了字體,fillStyle設置了顏色,MDN上有篇canvas的基礎教程

2.canvas中的drawImage就是用來嵌入圖片的,設置好起始坐標和圖片大小后就能將圖片展示在一起。

3.上面的操作就是:在一張預先寫好文案的圖片上寫上動態輸入的名字,再配上自定義文案和二維碼圖片。

??

?

源碼地址:

https://github.com/pwstrick/road

轉載于:https://www.cnblogs.com/strick/p/6158320.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253690.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQLServer約束介紹

約束定義 對于數據庫來說&#xff0c;基本表的完整性約束分為列級約束條件和表級約束條件&#xff1a; 列級約束條件 列級約束條件是對某一個特定列的約束&#xff0c;包含在列定義中&#xff0c;可以直接跟在該列的其他定義之后&#xff0c;用空格分隔&#xff0c;不用指定列名…

CMOS圖像傳感器——SNR計算

圖像質量評價在計算機視覺,人工智能,高清視頻傳輸上面有很廣泛的應用。目前,圖像質量評價主要分為三個方向,有參考圖像的質量評價,半參考的圖像質量評價,以及無參考的圖像質量評價。許多時候,我們利用CIS采集的RAW DATA本身就是含噪信號,因為我們往往不知道感興趣的像素…

Java this 關鍵字的用法

this 關鍵字的用法 this 在類中就是代表當前對象&#xff0c;可以通過 this 關鍵字完成當前 對象的成員屬性、成員方法和構造方法的調用。 那么何時用 this? 當在定義類中的方法時&#xff0c;如果需要調用該類對象&#xff0c;就可以用 this 來表示這個對象。也就是說&#x…

TMDS——最小化傳輸差分信號及其協議

過渡調制差分信號&#xff0c;也被稱為最小化傳輸差分信號&#xff0c;是指通過異或及異或非等邏輯算法將原始信號數據轉換成10位&#xff0c;前8為數據由原始信號經運算后獲得&#xff0c;第9位指示運算的方式&#xff0c;第10位用來對應直流平衡&#xff08;DC-balanced&…

順大勢逆小勢策略之代碼實現及可行性分析

閱讀原文&#xff1a;quant.la/Article/Vie… 前言 資產配置多元化是投資的唯一免費午餐 —— 馬克維茨。 在市場中有兩種策略&#xff1a;趨勢策略和震蕩策略。趨勢追蹤策略的特點在大行情的波動段找到有效的交易信號。而震蕩策略則是一種反趨勢策略&#xff0c;一波大幅上漲后…

數字圖像處理——中值濾波及其改進算法

一、算法介紹 中值濾波器是非線性濾波器的一個例子&#xff0c;它在保留圖像特征方面非常有效。 但是&#xff0c;濾波器的窗口大小直接影響中值濾波器的性能。 較小的窗口保留了特征&#xff0c;但會導致噪聲抑制的減少。 在較大窗口的情況下&#xff0c;噪聲抑制很高&#xf…

Spring整合web開發

正常整合Servlet和Spring沒有問題的 public class UserServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ApplicationContext applicationContext new ClassPathXmlApplica…

環信快速集成,以及實際集成中遇到的坑

一.pod集成遇到的問題 1.直接pod 安裝 pod EaseUI, :git > https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git 在這個過程中&#xff0c;如果你pod已經安裝了sdwebimage&#xff0c;mjrefresh等他自身包含的三方&#xff0c;就需要在你的podfile里面把這個給刪…

PAFF 和MBAFF

PAFF 和MBAFF&#xff1a;當對隔行掃描圖像進行編碼時&#xff0c;每幀包括兩個場&#xff0c;由于兩個場之間存在較大的掃描間隔&#xff0c;這樣&#xff0c;對運動圖像來說&#xff0c;幀中相鄰兩行之間的空間相關性相對于逐行掃描時就會減小&#xff0c;因此這時對兩個場分…

Test435678

2345魚57洋炮456789轉載于:https://www.cnblogs.com/rhxuza1993/p/9534938.html

用NPOI從DataBase到Excel '2

NPOI的C# Helper代碼2 1 public static MemoryStream ExportXls(DataTable dt)2 {3 HSSFWorkbook wk new HSSFWorkbook();4 ISheet sheet null;5 6 string sheetName "Sheet1";7 if (!string.Is…

CMOS圖像傳感器——噪聲模型

由于CMOS圖像傳感噪聲的復雜性和不可控性,學者們一直在尋求一種能對其比較精確表的噪聲模型。在圖像降噪領域,為了降低算法設計的復雜度,人們普遍采用基于信道相關噪聲的模型(即加性噪聲),但其缺點就是不能精確地表示傳感器的噪聲。于是Hirakawa提出了一 種精確CMOS傳感器…

????TCp傳輸粘包問題

解決TCP網絡傳輸“粘包”問題 當前在網絡傳輸應用中&#xff0c;廣泛采用的是TCP/IP通信協議及其標準的socket應用開發編程接口&#xff08;API&#xff09;。TCP/IP傳輸層有兩個并列的協 議&#xff1a;TCP和UDP。其中TCP&#xff08;transport control protocol&#xff0c;傳…

AtomicIntegerArray和AtomicIntegerFieldUpdater

2019獨角獸企業重金招聘Python工程師標準>>> AtomicIntegerArray 對int數組中元素的操作不是原子性的&#xff0c;所以存在并發操作時&#xff0c;我們應該使用AtomicIntegerArray類來代替int數組。 下面是驗證演示代碼&#xff1a; public class AtomicIntegerArra…

CMOS圖像傳感器——高動態范圍

動態范圍是CMOS 圖像傳感器中很重要的一項評價指標。動態范圍指示了CMOS 圖像傳感器能夠在同一幀圖像中同時探測到的最大光強信號和最小光強信號的范圍。動態范圍通常用dB 形式來表示,其計算公式如下 其中Pmax 和Pmin 分別是最大非飽和光強與最小可探測光強。對于線性…

鍵盤綁定

1.理論: 從擊鍵到內核,前后的執行情況,之間沒有必然關聯 按鍵->csrss.exe->win32!RawInputThread->win32k!OpenDevice->ZwCreateFile->NtCreateFile->ntIopParseDevice->nt!IoGetAttachedDevice ->IoAllocateIrp->nt!ObCreateObject->nt!IopfCal…

《Linux內核設計與實現》讀書筆記(七)- 中斷處理

中斷處理一般不是純軟件來實現的&#xff0c;需要硬件的支持。通過對中斷的學習有助于更深入的了解系統的一些底層原理&#xff0c;特別是驅動程序的開發。 主要內容&#xff1a; 什么是中斷中斷類型中斷相關函數中斷處理機制中斷控制方法總結1. 什么是中斷 為了提高CPU和外圍硬…

入門視頻采集與處理(學會分析YUV數據)

標簽&#xff1a;分析碼流 視頻采集 RGB YUV 原創作品&#xff0c;允許轉載&#xff0c;轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://ticktick.blog.51cto.com/823160/555791做視頻采集與處理&#xff0c;自然少不了要學會分析…

數字后端——時序驗證

時序驗證則是采用時序分析等方法驗證設計是否滿足時序收斂&#xff0c;這些時序檢驗工作包括反向標定(back-annotation)、時序與功耗的檢驗、時序與信號完整性的檢驗和當代低功耗納米先進設計中的“多模式多端角”(MMMC&#xff0c;multi-mode multi-comer)檢驗。 一、反向標定…

Hadoop系列(三)MapReduce Job的幾種提交運行模式

Job執行可以分為本地執行或者集群執行。hadoop集群安裝部署在遠程centos系統中。使用經典的WordCount代碼為例。 1. 本地執行模式&#xff08;本地為MacOS環境&#xff09;&#xff0c;無需啟動遠程的hadoop集群&#xff0c;本地job會提交給本地執行器LocalJobRunner去執行。 1…