原文链接: Step 2: Your own element
翻译日期: 2014年7月6日
翻译人员: 铁锚

通过上一节的学习和实践, 您已经完成了一个基本的应用程序结构(application structure),从现在开始可以构建一个标签页(card element,卡片元素)来显示名片(post)。完成后的标签页包括个人头像,名字,红心按钮,以及内容区域:

图片 有点水(平?)的皮冻

在本节中,你将会创建一个 <post-card> 元素,用来控制他的子元素布局和样式, 完成后就可以像前面使用过的其他标签那样使用啦,调用的代码看起来像下面一样:

  1. <post-card>
  2. <img src="http://avatar.csdn.net/4/9/C/1_renfufei.jpg">
  3. <h2>铁锚</h2>
  4. <h3>K神是我们的榜样!皮冻你要好好努力!.</h3>
  5. </post-card>

通过本节的学习,您将:

  • 学会在Polymer中如何创建自定义元素
  • 对Shadow DOM(影子DOM)有一定的了解.

了解更多
Shadow DOM 技术允许你将一棵局部的(local,本地的)DOM树添加到某个DOM元素中, 而这个局部DOM的样式和标签 跟全局web页面是相互独立的(不会污染,也不会受到影响,原文叫解耦,decoupled). 关于Shadow DOM的更多信息,请参考: Shadow DOM polyfill docs. 也可以参考这篇中文文档: 使用Shadow DOM创建Web组件

编辑 post-card.html 文件
进入根目录下面的 starter 目录, 用编辑器打开 post-card.html 文件,该文件包含一个自定义元素的基本骨架(skeleton),在文件开头通过import引入其他的2个组件:

  1. <link rel="import"
  2. href="../components/polymer/polymer.html">
  3. <link rel="import"
  4. href="../components/core-icon-button/core-icon-button.html">

说明:

  • 和上一节所讲的类似, 这里的 <link rel="import"> 用来引入 post-card 需要的其他元素.

紧接着是元素自身的定义:

  1. <polymer-element name="post-card">
  2. <template>
  3. <style>
  4. :host {
  5. display: block;
  6. position: relative;
  7. background-color: white;
  8. padding: 20px;
  9. width: 100%;
  10. font-size: 1.2rem;
  11. font-weight: 300;
  12. }
  13. .card-header {
  14. margin-bottom: 10px;
  15. }
  16. </style>
  17.  
  18. <!-- CARD CONTENTS GO HERE -->
  19. <!-- 卡片的内容要放到这儿 -->
  20. </template>
  21. ...

说明:

  • <polymer-element>元素是Polymer中自定义新元素的方式。在这里,你创建的元素叫做 "post-card".
  • <template>定义了元素的内部DOM结构,或者是影子(shadow)DOM。这里就是添加自定义元素标签(markup)的地方。
  • :host 伪类被用于shadow DOM tree中, 匹配挂载shadow DOM树的那个宿主元素(host有宿主的意思). 在这里,它匹配的就是 <post-card> 元素。
  • 在shadow DOM中,普通的CSS选择器作用域范围只在shadow DOM内部;  这里的 .card-header 就只会匹配到此元素的shadow DOM内部.

<polymer-element> 标签只能在直接子元素这一级包含1个 <template> 标签. <template>标签定义了元素的shadow DOM. 在<template>内部,允许嵌套其他的 <template> 标签。

  1. <script>
  2. Polymer({});
  3. </script>

说明:

  • 在文件末尾处的 Polymer 方法调用会将此元素注册给浏览器,使浏览器记住它。在后面的小节中你还会和这个函数打很多交道。

了解更多:
创建 <post-card> 实例时,其shadow DOM <template> 中的内容会被插入成为元素的 shadow root。这些元素会在浏览器中(rendered,渲染)显示,但并不包含在宿主元素的 children 集合中。
如果没有其他设置,所有用户添加的子元素都不会被渲染/显示(render)。例如:

  1. <post-card><h3>如果没定义放在哪个地方,就没有地方来显示这个内容!</h3></post-card>

这里创建了一个含有单个<h3>元素作为子节点的 <post-card> . 如果要显示 <post-card> 内的 <h3> ,您需要添加一个插入点(nsertion point),告诉浏览器将这个子元素渲染到 shadow DOM树的哪个地方。

-------------------------------------------------------------------------------------

创建卡片结构(card structure)

找到 <template> 结尾处有注释的地方,添加下面的 <div><content> 标签到代码中.

  1. <!-- CARD CONTENTS GO HERE -->
  2. <div class="card-header" layout horizontal center>
  3. <content select="img"></content>
  4. <content select="h2"></content>
  5. </div>
  6. <content></content>

说明

  • layout horizontal center 属性是 Polymer 中创建一个flexbox(伸缩)布局的快速方式。
  • 3个 <content> 元素创建了一些插入点(insertion points), shadow DOM 规范称(call)这个匹配节点的过程为派发(distribution).
  • 所有的 <img> 子元素都会匹配到第一个 <content> 标记, 并被插入到那里。
  • 第二个 <content> 标记选择所有的 h2 子元素。
  • 最后一个 <content> 标记,没有指定 select 属性, 会选择所有还未被插入的节点。(这应该是<content>元素最通用的格式)。

-------------------------------------------------------------------------------------

给引入的内容设置样式

可以使用很多新的CSS选择器. post-card.html 文件已经包含 :host 选择器,用于对顶层的 <post-card> 元素设置样式。
要设置使用 <content> 添加的子元素的风格,可以在 <style> 标签中加上下面的CSS样式:

  1. polyfill-next-selector { content: '.card-header h2'; }
  2. .card-header ::content h2 {
  3. margin: 0;
  4. font-size: 1.8rem;
  5. font-weight: 300;
  6. }
  7. polyfill-next-selector { content: '.card-header img'; }
  8. .card-header ::content img {
  9. width: 70px;
  10. border-radius: 50%;
  11. margin: 10px;
  12. }

说明:

  • 伪类 ::content 选择一个(根据 <content> 标签创建的)插入点. 在这里, ::content h2 匹配所有通过插入点派发的 h2 元素。
  • 对于不支持shadow DOM的浏览器, polyfill-next-selector 规则告诉 shadow DOM polyfill 如何将 ::content 规则转换为non-shadow DOM规则。例如,在不支持shadow DOM时, post-card h2 匹配卡片中的所有 <h2> 标签。

注意:你不能对插入点自身设置样式, 所以使用 ::content  时必须伴随着后代选择器。

编辑 index.html 文件

将新元素引入 index.html


保存 post-card.html, 并打开 index.html, 在已有的 imports 语句后加上下面的import语句:

  1. <link rel="import" href="post-card.html">

说明:

  • index.html 中引入后就可以使用 <post-card> 元素。

-------------------------------------------------------------------------------------

index.html 文件中, <core-toolbar> 元素的后面直接加上一个 <post-card> 元素:

  1. ...
  2. </core-toolbar>
  3. <div class="container" layout vertical center>
  4. <post-card>
  5. <img width="70" height="70"
  6. src="http://www.iteye.com/upload/logo/user/156996/59e4f109-2a2d-300f-b144-c62994e798e6.jpg">
  7. <h2>大漠穷秋</h2>
  8. <h3>脚本娃娃是一个有爱的程序员社区!</h3>
  9. </post-card>
  10. </div>
  11. ...

说明:
这里指定的子元素将被分发(distributed)到 <post-card>元素的各个插入点。

检验成果

保存(建议编辑过程中随时保存,这是好的编码习惯)文件,部署,然后用chrome打开链接或刷新页面, 比如:
http://localhost:8080/polymer-tutorial-master/starter/index.html
则显示效果如下所示:

图 Step2完成后的效果.

虽然还缺少一个关注按钮(favorite button),但至少看起来有点样子了。

如果发生错误或不显示,可以和 step-2 目录下的 index.html, post-card.html 文件对比,当然,你也可以直接访问这两个文件试试效果。

如果,你的页面看起来tab的宽度不够,请自己调整一下style中的width相关属性,有可能是 media选择器里面的部分。

动手实践:  
建议你折腾一下插入点,体会它们是如何工作的。 如果在 index.html 中改变了 <post-card> 子元素的顺序,会有什么不同吗? 如果包括多个图片,或添加纯文本呢? 你还可以试着交换 post-card.html 文件中的两个 select= 属性。

下一节
第一个Polymer应用 - (3)使用数据绑定

第一个Polymer应用 - (2)创建你自己的元素的更多相关文章

  1. 第一个Polymer应用 - (1)创建APP结构

    原文链接: Step 1: Creating the app structure翻译日期: 2014年7月5日翻译人员: 铁锚在本节中,将使用一些预先构建好的Polymer元素来创建基本的应用程序结构 ...

  2. 第一个Polymer应用 - (0)准备工作

    原文链接:  Getting Started - Your first Polymer application翻译时间: 2014年7月5日翻译人员: 铁锚 关于Polymer 的简介,请参考 CSD ...

  3. 第一个Polymer应用 - (3)使用数据绑定

    原文链接: Step 3: Using data binding翻译日期: 2014年7月7日翻译人员: 铁锚我们创建的个人信息卡还算漂亮,但对整个应用来说,只有一张卡片看起来有点空荡荡的感觉.在本节 ...

  4. 编程第一个Apple Watch程序创建项目

    编程第一个Apple Watch程序创建项目 2.4  编程第一个程序 本节将通过编写第一个程序,为开发者讲解如何添加Watch应用对象.运行程序.界面设计.编写代码等内容本文选自Apple Watc ...

  5. HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的

    HTML5 离线缓存-manifest简介 HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(A ...

  6. THEOS的第一个TWeak的成功创建

    THEOS的第一个TWeak的成功创建html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMi ...

  7. java—实现一个监听器HttpServletRequest的创建销毁、在线人数 (56)

    在JavaWeb中的监听器分类 在Javaweb中存在三个被监听对象: HttpServletRequest HttpSessoin ServletContext 监听者 被监听者 监听到事件对象 H ...

  8. MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】

    MySQL如何创建一个好索引?创建索引的5条建议 过滤效率高的放前面 对于一个多列索引,它的存储顺序是先按第一列进行比较,然后是第二列,第三列...这样.查询时,如果第一列能够排除的越多,那么后面列需 ...

  9. 极简!一个注解就能创建Jaeger的Span

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. Dynamics CRM Plugin DLL恢复工具

    本篇接上篇继续介绍XrmToolBox中的某项功能,该工具的下载见上篇博文. 打开XrmToolBox,找到Assembly Recovery Tool,点击进去 如何连接上你的组织继续不表,列表中显 ...

  2. ormlite介绍一

    概述       ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具. 官方网站:http://ormlite.com ...

  3. 15 ActionBar.Tab 以及保存fragment对象 代码案例

    API 21弃用 values 中 string文件源码: <?xml version="1.0" encoding="utf-8"?> <r ...

  4. 详解EBS接口开发之销售订单挑库发放

     1. 对销售订单的有效性验证     1)检查销售订单的行是否被完全传回客户化表     2)验证销售订单的关键字段     3)检查子库存是否启用了货位控制,如果启用了货位控制,没有生成货位, ...

  5. 你不可不知的Eclipse快捷键

    我们都知道Eclipse是一个深受广大程序员喜爱的编译器,其插件机制更是让人拜服.它之所以这么被人喜爱,除了这些,最重要的是它丰富的快捷键.那么今天,我就来分享一下我平时经常使用的一些快捷键. Ctr ...

  6. SSH深度历险(五) 深入浅出-----IOC AND AOP

    IOC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统(容器)来控制实现,而不是在你的类内部控制.这称为控制反转. 本人理解:就是把原本你自 ...

  7. linux 定时任务详解 按秒设定

    实现linux定时任务有:cron.anacron.at等,这里主要介绍cron服务. 名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表. 软件包安装: 要使 ...

  8. Activity与Fragment的生命周期详解

    在安卓中Activity与Fragment是非常相似的两个类,它们各自都拥有自己的生命周期,且都可以用来显示布局文件中的视图.其中Activity是通过setContenView()显示视图,而Fra ...

  9. Web Service进阶(二)如何用Apache TCPMon来截获SOAP消息

    注:以下是关于TCPMon的一些使用常识,如果不需要或是已经熟悉就不用往下看了. 在WebService服务器和客户机之间会传递SOAP消息,有时我们需要得到这些消息以便调试,而Apache的TCPM ...

  10. OLAP工作的基本概念(结合个人工作)

    OLTP和OLAP 传统的数据库系统都是OLTP,只能提供数据原始的操作.不支持分析工作. OLTP系统::执行联机事务和查询处理.一般超市进销存系统,功能:注册,记账,库存和销售记录等等, OLAP ...