@programeggsoup
2017-04-16T16:28:07.000000Z
字数 14060
阅读 1409
计算机
前端
++++++
建立自己的app
添加一个bower.json文件
{
"name": "silmarillion",
"private": true,
"version": "1.0.0",
"homepage": "",
"description": "The Simple Platform of HuijiWiki",
"authors": "programeggsoup",
"license": "TJL",
"dependencies": {
"polymer": "Polymer/polymer#^1.7.1",
"webcomponentsjs": "Polymer/webcomponentsjs#^0.7.23",
"iron-elements": "PolymerElements/iron-elements#^1.0.10",
"paper-elements": "PolymerElements/paper-elements#^1.0.7",
"font-roboto": "PolymerElements/font-roboto-local#^1.0.0",
"app-elements": "PolymerElements/app-elements#^0.10.1",
"neon-elements": "PolymerElements/neon-elements#^1.0.0"
},
"devDependencies": {
"web-component-tester": "^4.0.0"
}
}
添加manifest.json
{
"name": "silmarillion",
"short_name": "silm",
"description": "The Simple Platform of HuijiWiki",
"display": "standalone",
"start_url": "/",
"theme_color": "#5E1911",
"background_color": "#F4F0E7",
"icons": [
{
"src": "images/icons/site_avatar_lotr_l.png",
"sizes": "200x200",
"type": "image/png"
}
]
}
添加polymer.json
{
"entrypoint": "index.html",
"shell": "",
"fragments": [
"build.html"
],
"sources": [
"images/**/*",
"bower.json"
],
"includeDependencies": [
"manifest.json",
"bower_components/webcomponentsjs/webcomponents-lite.min.js"
]
}
根目录下的HTML文件:icon-toggle.html,包含着自定义元素的框架。不想其他大部分的HTML文件,这个icon-toggle.html将不会显示任何东西,它仅仅是用来定义新的元素。演示代码加载了icon-toggle.html文件,因而他能使用ID为icon-toggle的元素。就像你在接下来的步骤中,为元素添加特性那样。
看现有的代码:
代码始于——HTML文件载入
<link rel="import" href="../polymer/polymer.html">
<link rel="import" href="../iron-icon/iron-icon.html">
关键点:
link rel="import"
iron-icon
自定义元素。下一段是定义元素自身:
代码始于——本地DOM模板
<dom-module id="icon-toggle">
<template>
<style>
/* local styles go here */
:host {
display: inline-block;
}
</style>
<!-- local DOM goes here -->
<span>Not much here yet.</span>
</template>
关键点:
- <dom-module>
标签封装了一个元素的本地DOM定义。在这种情况下,跟在<dom-module>
后面的id
属性展示了这个模块包括了本地DOM中、名叫icon-toggle
的元素。
- <template>
事实上定义了元素的本地DOM结构和样式。在这里你可以为你自定义的元素添加标记。
- 在<template>
内部的<style>
元素,让你能定义作用域限制在本地DOM中的样式。这样,它们就不会影响到其他的文档了。
- :host
伪类匹配了你正在定义的自定义元素(在这个例子中,这个自定义元素是<icon-toggle>
)。这个元素包含或托管了本地DOM树。
在元素定义的结尾处,是一些JS代码,用以注册元素。如果元素有一个<dom-module>
,这个脚本通常放置在<dom-module>
内来集成一切。
代码始于——元素注册
<script>
Polymer({
/* this is the element's prototype */
is: 'icon-toggle'
});
</script>
</dom-module>
关键点:
- Polymer
调用注册登记了元素,使得它可以被browser(浏览器)识别到。
- 对Polymer调用的参数,是新元素的样板。在接下来的步骤中,你会遇到更多。
- 在模板上的is
属性,是一个新元素的名字。它需要匹配在<dom-module>
上且包涵了元素模板的id
。
现在你已熟悉元素的基本布局,在本地DOM模板中,添加一些有用的东西吧。
在注释local DOM goes here
下面,找到<span>
标签:
icon-toggle.html—修改前
<!-- local DOM goes here -->
<span>Not much here yet.</span>
</template>
<iron-icon>
标签替换<span>
标签中的内容:
icon-toggle.html—修改后
<!-- local DOM goes here -->
<iron-icon icon="polymer"></iron-icon>
</template>
关键点:
- <iron-icon>
元素是一个自定义元素,用以渲染图标。在这里,使用叫做"polymer"的图标,是一段硬编码。
这儿有许多可以通过本地DOM工作的新CSS选择器。icon-toggle.html
文件已经有了一个:host
选择器——在上文中有提到的、在最上层命名<icon-toggle>
元素。
要命名<iron-icon>
元素,则需要在<style>
标签里添加如下所示的CSS代码:
icon-toggle.html
<style>
/* local styles go here */
:host {
display: inline-block;
}
iron-icon {
fill: rgba(0,0,0,0);
stroke: currentcolor;
}
:host([pressed]) iron-icon {
fill: currentcolor;
}
</style>
关键点:
- <iron-icon>
标签用的是可缩放矢量图形(SVG)。fill
和stroke
属性是SVG特定的CSS属性。它们分别设置了图形的填充颜色和边框颜色。
- 如果括号中的选择器名匹配了主元素,那么:host()
函数匹配主元素。在此情况下,[pressed]
是一个标准CSS属性选择器,所以当icon-toggle
有一个pressed
属性时,这个规则便匹配成功了。
现在,元素的功能还不多。在这一章节里,你将为它添加一个基本的API,使得你能用特性(attribute)从标记处、用属性(property)从JS代码处允许你配置这个图标。
① attribute:特性,是一个类数组的容器,用以存放NameNodeMap。
<div class="box" id="box" gameid="880">hello</div>
var elem = document.getElementById( 'box' );
console.log( elem.attributes[0].name ); // class
console.log( elem.attributes[0].value ); // box
console.log( elem.getAttribute('gameid') ); // 880
attributes是会随着添加或删除attribute节点动态更新的。
② property:属性。若DOM元素是一个普通的Object对象,那么property就是一个以名值对(name=”value”)的形式存放在Object中的属性。
elem.gameid = 880; // 添加
console.log( elem.gameid ) // 获取
delete elem.gameid // 删除
第一步,一些数据绑定。找到<iron-icon>
元素,从polymer
到[[toggleIcon]]
改变icon
特性的值。
icon-toggle.html
<!-- local DOM goes here -->
<iron-icon icon="[[toggleIcon]]">
</iron-icon>
关键点:
- toggleIcon是一个你将用来定义切换按钮元素的属性。它还没有一个默认值。
- icon="[[toggleIcon]]
的任务是完成一个数据绑定。它用<iron-icon>
的icon
属性,连接了元素的toggleIcon
属性。
你现在可以在标记或者JS代码中,使用你的元素并设置toggleIcon
属性了。
下一步,为toggleIcon
属性添加一个声明。
找到脚本标签,将下述属性对象添加在元素模板中。
icon-toggle.html
<script>
Polymer({
/* this is the element's prototype */
is: 'icon-toggle',
properties: {
toggleIcon: String
}
});
</script>
</dom-module>
关键点:
- 如果属性将成为你元素公共API一部分的话,在properties
对象中声明属性是一个不错的主意。
- 如上述代码所示的一个简单的属性声明,仅包含了形式(在这个例子中是String
)。
properties
对象还支持一些其他特征。添加下述代码来实现pressed
属性:
icon-toggle.html
Polymer({
/* this is the element's prototype */
is: 'icon-toggle',
properties: {
toggleIcon: String,
pressed: {
type: Boolean,
value: false,
notify: true,
reflectToAttribute: true
}
}
});
关键点:
- 对这个更复杂的属性,你弄出了一个用一些字段组成的构造对象。
- value
指定了属性的默认值。
- notify
告诉Polymer,当属性值改变时,要调度属性更改事件。这使得其他节点可以观察到这一改变。
- reflectToAttribute
告诉Polymer,当属性改变时,要更新相应特性。这使得你可以用特性选择器,例如icon-toggle[pressed]
来命名元素。
当然了,如果你无法点击一个按钮,那么这个按钮就不能被叫做按钮。为了达到切换按钮的目的,需要添加一个事件监听。为了在主元素上添加事件监听器(如在这个例子中,主元素是icon-toggle
),即在元素的模板中,添加一个listeners
对象:
icon-toggle.html
Polymer({
/* this is the element's prototype */
is: 'icon-toggle',
properties: {
toggleIcon: String,
pressed: {
type: Boolean,
value: false,
notify: true,
reflectToAttribute: true
}
},
listeners: {
'tap': 'toggle'
},
toggle: function() {
this.pressed = !this.pressed;
},
});
关键点:
- listeners object
提供了一种简单方法来设置事件处理程序。它将事件名称映射到处理程序的名字上。
- tap
(点击)事件是当用户用鼠标点击或用手指敲击由Polymer的手势系统产生的。()listeners object
与诸如keydown
和keyup
之类内置时间协同合作)
click与tap都会触发点击事件,但是在手机web端,click会有200-300ms的延迟,所以一般用tap代替click作为点击事件。singleTap
和doubleTap分别代表单次点击和双次点击。
你现在有了一个有着基础功能的按钮。但它在点击和取消点击的状态下都用着固定的文本颜色。怎么才能把它变得更美些呢?
本地DOM防止了用户因意外而修改元素内设。为了让用户设置自己的元件,你可以使用自定义CSS属性。Polymer提供一个从CSS Custom Properties for Cascading Variables得到灵感的自定义CSS属性实现。
你用var函数在你的元素中应用一个自定义属性。
background-color: var(--my-custom-property, defaultValue);
其中--my-custom-property
是一个自定义元素名,通常由--
作为开始。defaultValue
是一个(可选的)CSS值,仅在自定义属性没有设置时使用。
编辑你的元素<style>
标签,用自定义属性替换现有的fill
和stroke
值。
icon-toggle.html
<style>
/* local styles go here */
:host {
display: inline-block;
}
iron-icon {
fill: var(--icon-toggle-color, rgba(0,0,0,0));
stroke: var(--icon-toggle-outline-color, currentcolor);
}
:host([pressed]) iron-icon {
fill: var(--icon-toggle-pressed-color, currentcolor);
}
</style>
因为默认值的缘故,你依然能通过设置color
来改变<icon-toggle>
的样式,但现在你有了别的选择。
打开icon-toggle-demo.html
文件,设置新属性。(如果你下载了起始代码,这份文件在demo
文件夹里)
icon-toggle-demo.html
<style>
:host {
font-family: sans-serif;
--icon-toggle-color: lightgrey;
--icon-toggle-outline-color: black;
--icon-toggle-pressed-color: red;
}
</style>
比如,你常常想在文档层面上设置自定义属性值,来为整个应用建立一个主题。因为自定义属性不是大多数浏览器内置的,你需要用一个特殊的custom-style
标签,在Polymer元素以外,来设置自定义属性值。试着在你的index.html
文件的<head>
标签中添加以下代码:
<style is="custom-style">
/* Define a document-wide default—will not override a :host rule in icon-toggle-demo */
:root {
--icon-toggle-outline-color: red;
}
/* Override the value specified in icon-toggle-demo */
icon-toggle-demo {
--icon-toggle-pressed-color: blue;
}
/* This rule does not work! */
body {
--icon-toggle-color: purple;
}
</style>
关键点:
- :root
选择器是一个标准的CSS选择器,在文件中处于最顶层的元素,所以它通常相当于html
。在custom-style
元素中,你需要用到:root
,而不是html
来指定文档范围的默认值。
- icon-toggle-demo
选择器匹配了icon-toggle-demo
元素,比icon-toggle-demo
文件中的:host
有着更高的优先级,因而icon-toggle-demo
选择器中的属性,覆盖了这些值。
- 自定义属性只能在匹配:root
选择器或者一个Polymer自定义元素的规则集中被设定。
--icon-toggle-color
属性没有被设置,因为它不能被用于body
标签。试着把这个规则移到icon-toggle-demo
中,看看它被应用的效果。
:root
规则集为--icon-toggle-outline-color
创建了一个文档范围的默认值。但这一值被icon-toggle-demo
元素中的相应规则覆盖了。为了让这一默认值显示出来,注释掉icon-toggle-demo.html
中的规则:
icon-toggle-demo.html
<style>
:host {
font-family: sans-serif;
--icon-toggle-color: lightgrey;
/* --icon-toggle-outline-color: black; */
--icon-toggle-pressed-color: red;
}
</style>
为了匹配自定义样式中的选择器,元素必须在文档范围中,例如在index.html
中,而不在另一个元素的本地DOM中。例如,这些规则在自定义样式内不起作用:
iron-icon {
--iron-icon-width: 40px;
--iron-icon-height: 40px;
}
这是因为页面上的iron-icon
元素,是在另一个元素的本地DOM里的。然而,因为自定义属性继承了原有的树,你能在文档层设置这些属性,来定义iron-icon
元素的所有属性值。
:root {
--iron-icon-width: 40px;
--iron-icon-height: 40px;
}
在第一次跑应用的时候,要提前下载插件。在node command里运行这条命令:bower install
。
git init
即可得到如下所示的文件结构:
/
|---index.html
|---src/
|---bower_components/
|---images/
|---test/
index.html 是进入程序的主要入口
添加一些代码:
<link rel="import" href="../bower_components/polymer/polymer.html">
<dom-module id="my-new-view">
<!-- Defines the element's style and local DOM -->
<template>
<style>
:host {
display: block;
padding: 16px;
}
</style>
<h1>New view</h1>
</template>
<!-- Creates the element's prototype and registers it -->
<script>
Polymer({
is: 'my-new-view'
});
</script>
</dom-module>
在src/my-app.html
的<iron-pages>
中加入<my-new-view name="new-view"></my-new-view>
找到<app-drawer>
的代码:
<!-- Drawer content -->
<app-drawer>
<app-toolbar>Menu</app-toolbar>
<iron-selector selected="[[page]]" attr-for-selected="name" class="drawer-list" role="navigation">
<a name="view1" href="/view1">View One</a>
<a name="view2" href="/view2">View Two</a>
<a name="view3" href="/view3">View Three</a>
</iron-selector>
</app-drawer>
添加<a name="new-view" href="/new-view">New View</a>
以得到新的新的导航标签。
将应用程序部署到Web时,您将使用Polymer CLI准备要部署的文件。 Polymer CLI将需要知道任何需求加载的片段,如您刚刚添加的延迟加载视图。
1. 打开polymer.json
2. 把src/my-new-view.html
添加入fragments
列表中。
注意:您只需要添加文件,您将延迟加载或使用async属性导入到片段列表。使用同步标签导入的任何文件不应添加到片段中。
安装3rd-party component(第三方组件)
bower install --save PolymerElements/paper-slider
将元素添加到应用程序
src/my-new-view.html
paper-slider.html
作为附属导入: <link rel="import" href="../bower_components/paper-slider/paper-slider.html">
<paper-slider>
的标签: <paper-slider min="-100" max="100" value="50"></paper-slider>
polymer build
Polymer的应用可以部署至任意服务器。
此模板使用<app-location>
元素启用基于URL的路由,这需要服务器为所有路由提供index.html入口点。
您可以按照以下部分之一将此应用程式部署到Google AppEngine或Firebase Static Hosting,这是部署Polymer应用程序的免费和安全方法。该方法对于其他托管提供商是类似的。
创建一个app.yaml
文件,并指示服务器为没有以文件扩展名结尾的任何URL提供index.html
。将{project name}
替换为您在上一步中选择的名称。
application: {project name}
version: 1
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /bower_components
static_dir: build/bundled/bower_components
secure: always
- url: /images
static_dir: build/bundled/images
secure: always
- url: /src
static_dir: build/bundled/src
secure: always
- url: /service-worker.js
static_files: build/bundled/service-worker.js
upload: build/bundled/service-worker.js
secure: always
- url: /manifest.json
static_files: build/bundled/manifest.json
upload: build/bundled/manifest.json
secure: always
- url: /.*
static_files: build/bundled/index.html
upload: build/bundled/index.html
secure: always
部署:
appcfg.py -A {project name} update app.yaml
简介:是一个单例元素,旨在对屏幕阅读器的按需声明特征添加a11y,简化了对屏幕阅读器的文本发布。为了更好地使用announcer,你最好请求在声明元素中的可用性。
例子:
Polymer({
is: 'x-chatty',
attached: function() {
// This will create the singleton element if it has not
// been created yet:
Polymer.IronA11yAnnouncer.requestAvailability();
}
});
在iron-a11y-announcer
可用后,元素可通过iron-announce
事件做冒泡声明。
例子:
this.fire('iron-announce', {
text: 'This is an announcement!'
}, { bubbles: true });
注意:仅当你有一个可用的屏幕阅读器后,声明才可见。
aria-live
属性的。有效值为:off
, polite
和assertive
。'iron-a11y-keys'提供了一个跨浏览器接口来处理键盘命令。该界面遵循WAI-ARIA最佳实践。它使用表达式语法过滤按键。
下面的示例代码是自定义元素的一部分。目的是当元素paper-input
成为焦点并按下Enter
键时,唤醒onEnter方法。
<iron-a11y-keys id="a11y" target="[[target]]" keys="enter"
on-keys-pressed="onEnter"></iron-a11y-keys>
<paper-input id="input"
placeholder="Type something. Press enter. Check console."
value="{{userInput::input}}"></paper-input>
自定义元素声明了一个绑定到属性名为target
的iron-a11y-keys
元素。target
属性需要评估为paper-input
结点。iron-a11y-keys
使用Polymer的注释事件处理程序语法注册目标节点的事件处理程序。{{userInput :: input}}
将userInput
属性设置至用户的为每次按键输入。
最后一步是链接元素和自定义元素的注册。
...
properties: {
userInput: {
type: String,
notify: true,
},
target: {
type: Object,
value: function() {
return this.$.input;
}
},
},
onEnter: function() {
console.log(this.userInput);
}
...
key
特性'keys'属性表示组合键触发事件。
特性接受由空格分割、加号连接的辅助键键或常用按键的组合。
常用键有:a-z
、0-9
、F1-F12
、Page Up
、Page Down
、上下左右、Home
、End
、Escape
、空格
、回车
。
辅助键有:Shift
、Control
、Alt
、Meta
。
小写和缩写算同一个键。
以下为EBNF语法的keys
特性。
modifier = "shift" | "ctrl" | "alt" | "meta";
ascii = ? /[a-z0-9]/ ? ;
fnkey = ? f1 through f12 ? ;
arrow = "up" | "down" | "left" | "right" ;
key = "tab" | "esc" | "space" | "*" | "pageup" | "pagedown" |
"home" | "end" | arrow | ascii | fnkey;
keycombo = { modifier, "+" }, key ;
keys = keycombo, { " ", keycombo } ;
将下列值赋给keys
:
ctrl+shift+f7 up pagedown esc space alt+m
按下以上键/组合键便会触发事件。
以下是一组实现WAI-ARIA的“滑块”角色最佳实践的示例:
<iron-a11y-keys target="[[target]]" keys="left pagedown down"
on-keys-pressed="decrement"></iron-a11y-keys>
<iron-a11y-keys target="[[target]]" keys="right pageup up"
on-keys-pressed="increment"></iron-a11y-keys>
<iron-a11y-keys target="[[target]]" keys="home"
on-keys-pressed="setMin"></iron-a11y-keys>
<iron-a11y-keys target=""[[target]] keys="end"
on-keys-pressed="setMax"></iron-a11y-keys>
target
属性必须求值到节点。请参见上面的基本用法示例。
on-keys-pressed
的特性的每个值必须评估为方法。increment
方法应该将滑块向最大值移动一个设定量。decrement
应该将滑块向最小值移动一个设定量。 setMin
应将滑块移动到最小值。 setMax
应将滑块移动到最大值。
true
,此属性将实现元素自动停止在任何处理器KeyboardEvents上的传播。active=Polymer.IronA11yKeysBehavior
Polymer.IronA11yKeysBehavior
提供了一个用于处理键盘命令的、基于WAI-ARIA best practices的标准化接口。
KEY+MODIFIER:EVENT": "callback"
("KEY": "callback"
或者"KEY: EVENT": "callback"