技术干货:前端图形化技术简介(上)
技术 2019-05-20 17:30:02 字数:3418

原标题:技术干货:前端图形化技术简介(上)

Canvas与SVG

前端图形化技术,主要包括Canvas绘图和SVG绘图两类。

Canvas早在十几年前就被火狐浏览器引入。Canvas通过Canvas.getContext(2d/3d)获得绘图上下文,采用绘制路径、填充路径、描边路径等操作绘制像素图片,并带有一定的矩阵旋转和偏移功能,总体与传统绘图流程一致。经过几年的发展,Canvas具备了3D上下文接口,其背后的WebGL,实际是OpenGL-ES的一个子集,可使用GPU渲染内容。实际上,通过改变视觉场的perspective,我们可以在3D的场景中获得一个伪2D的视角,实现2D的图形绘制的GPU加速。前几年这种方式甚为流行,但是苦于兼容性的问题,未被大量推广。

SVG图像是一种矢量图,采用XML方式标记和绘制。由于SVG是一种ML,所以操作、调试都非常容易,并且可以直接交互。与Canvas相比,SVG的最大不同在于:它不但是View,而且也是Model,算是一个真正的ViewModel。所以,SVG的体积与数据量级有直接关系,而Canvas所形成的图片体积只与尺寸有关,是一个恒定值。所以当我们面临一个未知场景的时候,使用SVG或Canvas,或者是SVG+Canvas,需要谨慎权衡。

总体来讲,无论是Canvas还是SVG,不管间接或者直接,它们能做的事情都差不多。

数据模型与图形交互

我们所熟悉的前端交互方式,比如click事件,实际是对一个DOM节点的操作,背后是浏览器DOM树接口提供的支持。

以Canvas为例,如果我们要在Canvas中实现数据展示和交互,应该如何去做?

上面我们提到了,Canvas会形成一张图片,但是一张“合并层”图片的所有像素是无差别的,所以Canvas本身并不能为我们提供图形交互的任何帮助。

所以我们应当把Canvas视为一个View的窗口,构造虚拟图层的树结构模型,再将Canvas相关事件映射模型中,驱动虚拟图层变化和重绘。

一个虚拟图层应包含的基本信息有:

· 矩阵信息(left|top|width|height|rotate)

· 样式信息(color|bgColor|opacity)

· 父节点、子节点(parent|children)

· 层排序(index)

在这个模型中,矩阵信息和样式信息都是可视信息,都可以成为数据表达的出口。

交互系统应具备:

· 事件系统(events|propagation)

· 节点查询(query)

· 动画系统(如果你有时间的话)

当Canvas的事件的发生位置映射到模型中时,应当根据矩阵信息进行虚拟图层捕捉查询(query),所以在模型设计中,将矩阵信息单独列出。

渲染工厂应做的事情:

· 调用Canvas渲染器,将模型绘制到

Canvas。

· 将Canvas的DOM层事件映射到虚拟模型,模拟事件捕获、冒泡等传递方式。

这样,你就可以有一个舞台对数据做可视化展示,并与数据进行互动。

需要注意的坑:

1. 当模型样式或者矩阵改变时,应当全图重绘。不要妄想局部重绘,那种计算开销或者研发时间开销性价比太低。

2. 事件系统真的没有捷径,要认真对待。

3. 如果你的模型中含有多边形节点(尤其是凹的),捕捉多边形有两条路:外包盒,或者,去看看图形学的书。如果你选择后者,做好了请给我发简历。

0人参与回答
  • 未添加任何数据~~


提示信息

联系电话:
1585150508*
QQ交谈:
小编
站长微信:
站长邮箱: service@qingjiuzhubei.com
261.82msRequest Duration2MBMemory UsageGET zixun/detail/{id?}.htmlRouteAuth status
    • Booting (8.64ms)
    • Application (255.04ms)
      6 templates were rendered
      • site.zixun.detail (resources/views/site/zixun/detail.blade.php)8blade
        Params
        0
        prevArticle
        1
        nextArticle
        2
        newDetail
        3
        comment
        4
        hotnews
        5
        t
        6
        d
        7
        k
      • layouts.site.layout (resources/views/layouts/site/layout.blade.php)18blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        device
        4
        isMobile
        5
        errors
        6
        prevArticle
        7
        nextArticle
        8
        newDetail
        9
        comment
        10
        hotnews
        11
        t
        12
        d
        13
        k
        14
        __empty_1
        15
        __currentLoopData
        16
        loop
        17
        hotnewsVal
      • layouts.site.top (resources/views/layouts/site/top.blade.php)18blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        device
        4
        isMobile
        5
        errors
        6
        prevArticle
        7
        nextArticle
        8
        newDetail
        9
        comment
        10
        hotnews
        11
        t
        12
        d
        13
        k
        14
        __empty_1
        15
        __currentLoopData
        16
        loop
        17
        hotnewsVal
      • layouts.site.bottom (resources/views/layouts/site/bottom.blade.php)18blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        device
        4
        isMobile
        5
        errors
        6
        prevArticle
        7
        nextArticle
        8
        newDetail
        9
        comment
        10
        hotnews
        11
        t
        12
        d
        13
        k
        14
        __empty_1
        15
        __currentLoopData
        16
        loop
        17
        hotnewsVal
      • common.upgrade_vip (resources/views/common/upgrade_vip.blade.php)18blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        device
        4
        isMobile
        5
        errors
        6
        prevArticle
        7
        nextArticle
        8
        newDetail
        9
        comment
        10
        hotnews
        11
        t
        12
        d
        13
        k
        14
        __empty_1
        15
        __currentLoopData
        16
        loop
        17
        hotnewsVal
      • kefu.kefu (resources/views/kefu/kefu.blade.php)18blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        device
        4
        isMobile
        5
        errors
        6
        prevArticle
        7
        nextArticle
        8
        newDetail
        9
        comment
        10
        hotnews
        11
        t
        12
        d
        13
        k
        14
        __empty_1
        15
        __currentLoopData
        16
        loop
        17
        hotnewsVal
      uri
      GET zixun/detail/{id?}.html
      middleware
      web
      controller
      App\Http\Controllers\Site\ZixunController@detail
      namespace
      App\Http\Controllers
      prefix
      /zixun
      where
      as
      zixunDetail
      file
      app/Http/Controllers/Site/ZixunController.php:105-132
      7 statements were executed239.84ms
      • select * from `news` where `news`.`id` = '41753' and `news`.`deleted_at` is null limit 11.43ms/app/Http/Controllers/Site/ZixunController.php:109zzshuju
        Metadata
        Bindings
        • 0. 41753
        Hints
        • Use SELECT * only if you need all columns from table
        • LIMIT without ORDER BY causes non-deterministic results, depending on the query execution plan
        Backtrace
        • 14. /app/Http/Controllers/Site/ZixunController.php:109
        • 22. /vendor/silber/page-cache/src/Middleware/CacheResponse.php:38
        • 56. /public/index.php:53
      • select * from `new_cates` where `new_cates`.`id` in ('52') and `new_cates`.`deleted_at` is null370μs/app/Http/Controllers/Site/ZixunController.php:109zzshuju
        Metadata
        Bindings
        • 0. 52
        Hints
        • Use SELECT * only if you need all columns from table
        Backtrace
        • 19. /app/Http/Controllers/Site/ZixunController.php:109
        • 27. /vendor/silber/page-cache/src/Middleware/CacheResponse.php:38
        • 61. /public/index.php:53
      • select * from `news` where `news`.`deleted_at` is null order by `browse` desc limit 10223.01ms/app/Http/Controllers/Site/ZixunController.php:110zzshuju
        Metadata
        Hints
        • Use SELECT * only if you need all columns from table
        Backtrace
        • 12. /app/Http/Controllers/Site/ZixunController.php:110
        • 20. /vendor/silber/page-cache/src/Middleware/CacheResponse.php:38
        • 54. /public/index.php:53
      • update `news` set `browse` = `browse` + 1, `updated_at` = '2025-05-14 21:26:43' where `id` = '41753' and `news`.`deleted_at` is null5.85ms/app/Http/Model/News/News.php:170zzshuju
        Metadata
        Bindings
        • 0. 2025-05-14 21:26:43
        • 1. 41753
        Backtrace
        • 12. /app/Http/Model/News/News.php:170
        • 13. /app/Http/Controllers/Site/ZixunController.php:111
        • 21. /vendor/silber/page-cache/src/Middleware/CacheResponse.php:38
        • 55. /public/index.php:53
      • select * from `news` where `id` < '41753' and `newscate_id` = '52' and `news`.`deleted_at` is null order by `id` desc limit 18.09ms/app/Http/Controllers/Site/ZixunController.php:115zzshuju
        Metadata
        Bindings
        • 0. 41753
        • 1. 52
        Hints
        • Use SELECT * only if you need all columns from table
        Backtrace
        • 13. /app/Http/Controllers/Site/ZixunController.php:115
        • 21. /vendor/silber/page-cache/src/Middleware/CacheResponse.php:38
        • 55. /public/index.php:53
      • select * from `news` where `id` > '41753' and `newscate_id` = '52' and `news`.`deleted_at` is null order by `id` asc limit 1640μs/app/Http/Controllers/Site/ZixunController.php:116zzshuju
        Metadata
        Bindings
        • 0. 41753
        • 1. 52
        Hints
        • Use SELECT * only if you need all columns from table
        Backtrace
        • 13. /app/Http/Controllers/Site/ZixunController.php:116
        • 21. /vendor/silber/page-cache/src/Middleware/CacheResponse.php:38
        • 55. /public/index.php:53
      • select * from `comments` where `news_id` = '41753'450μs/app/Http/Controllers/Site/ZixunController.php:117zzshuju
        Metadata
        Bindings
        • 0. 41753
        Hints
        • Use SELECT * only if you need all columns from table
        Backtrace
        • 12. /app/Http/Controllers/Site/ZixunController.php:117
        • 20. /vendor/silber/page-cache/src/Middleware/CacheResponse.php:38
        • 54. /public/index.php:53
        web
        array:2 [ "name" => "Guest" "user" => array:1 [ "guest" => true ] ]
        api
        array:2 [ "name" => "Guest" "user" => array:1 [ "guest" => true ] ]
          _token
          Veo5buPia8rltqOZjKyZonizw4RW2iHFmo6ecqMF
          _previous
          array:1 [ "url" => "http://data.winndoo.cn/zixun/detail/41753.html" ]
          PHPDEBUGBAR_STACK_DATA
          []
          format
          html
          content_type
          text/html; charset=UTF-8
          status_text
          OK
          status_code
          200
          request_query
          []
          request_request
          []
          request_headers
          array:10 [ "accept-encoding" => array:1 [ 0 => "gzip, deflate" ] "accept" => array:1 [ ...
          request_server
          array:33 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "HTTP_ACCEPT_ENCODING" => "gzip, de...
          request_cookies
          []
          response_headers
          array:5 [ "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ ...
          path_info
          /zixun/detail/41753.html
          session_attributes
          array:3 [ "_token" => "Veo5buPia8rltqOZjKyZonizw4RW2iHFmo6ecqMF" "_previous" => array:1 [ "u...