金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > web前端 > Components构建单页面应用,CSS3弹性伸缩布局

Components构建单页面应用,CSS3弹性伸缩布局

发布时间:2019-11-01 17:35编辑:web前端浏览(168)

    用Web Components构建单页面应用

    2015/01/19 · JavaScript · Web Components

    本文由 伯乐在线 - 周进林 翻译,Mxt 校稿。未经许可,禁止转载!
    英文出处:www.polymer-project.org。欢迎加入翻译组。

    你是如何使用Polymer构建一个单页应用的?这个问题我们在Polymer团队里已经问过很多遍了。我们的答案(一如既往地)是“使用组件(component)!”。然而,使用新技术去解决现有的问题往往不会马上得到显著的效果。如何把一堆模块化组件组合到一个大型的实用的应用中去?

    在本教程,我将会给你展示如何去构建一个功能完整的单页应用:

    图片 1

    • 完全使用Polymer的核心元素构建
    • 使用响应式设计
    • 使用数据绑定特性过渡视图
    • 使用URL路由和深层链接特性
    • 可访问键盘
    • 按需动态载入内容(可选)

     打开演示

    关于 bind 你可能需要了解的知识点以及使用场景

    2016/08/18 · JavaScript · bind

    本文作者: 伯乐在线 - 韩子迟 。未经作者许可,禁止转载!
    欢迎加入伯乐在线 专栏作者。

    不看不知道,一看吓一跳,已经整整一个月没有更新 underscore 源码解读系列文章了。前面我们已经完成了 Object ,Array,Collection 上的扩展方法的源码剖析,本文开始来解读 Function 上的扩展方法。

    完整的 underscore 源码解读系列文章请移步 ,觉得还阔以的话,给个 star 鼓励下楼主呗 ^_^

    CSS3弹性伸缩布局(二)——flex布局

    2015/09/02 · CSS · CSS3

    原文出处: 郭锦荣   

    上一篇博客《CSS3弹性伸缩布局(一)——box布局》介绍了旧版本的box布局,而这篇博客将主要介绍最新版本的flex布局的基础知识。

    新版本简介

    新版本的Flexbox模型是2012年9月提出的工作草案,这个草案是由W3C 推出的最新语法。这个版本立志于指定标准,让新式的浏览器全面兼容,在未来浏览器的更新换代中实现统一。

    应用架构

    设计布局是开始一个项目的首要任务之一。作为核心元素集合的一部分,Polymer通过几个布局元素 来支撑应用程序的构架(<core-header-panel>, <core-drawer-panel>, <core-toolbar>)。这些组件本身就很好用,但是为了更快地开始项目,我们打算着重于<core-scaffold>。有了它你可以通过组装几个基本的元素就能做出一个响应式的移动端布局。

    <core-scaffold>的子元素可以是指定特定的元素或使用特定的标签(或两者一起使用)。举个例子,使用<nav>元素创建应用抽屉菜单。你可以在任意的元素里使用navigation属性(e.g <core-header-panel navigation>)。工具栏通过工具属性标识。它的所有其他子元素都定义在主要内容区域里。

    bind 简介

    Ok,今天要讲的正是 bind。关于 bind,可以先移步楼主以前写的文章 ECMAScript 5(ES5) 中 bind 方法简介备忘,有个基本的概念。

    bind() 方法会创建一个新函数,当这个新函数被调用时,它的 this 值是传递给 bind() 的第一个参数, 它的参数是 bind() 的其他参数和其原本的参数。

    语法是这样样子的:

    fun.bind(thisArg[, arg1[, arg2[, ...]]])

    1
    fun.bind(thisArg[, arg1[, arg2[, ...]]])
    • thisArg 当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用 new 操作符调用绑定函数时,该参数无效。
    • arg1, arg2, … (可选)当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。

    这里我们还是继续上一篇博客中的例子,使用最新版本的flex布局来实现相同的效果。

    html代码:

    XHTML

    <div> <p>发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划哈萨克的骨灰撒块光辉卡萨很干净啊是高科技傻空给发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划哈萨克的骨灰撒块光辉卡萨很干净啊是高科技傻空给</p> <p>发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划哈萨克的骨灰撒块光辉卡萨很干净啊是高科技傻空给</p> <p>发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划</p> </div>

    1
    2
    3
    4
    5
    <div>
        <p>发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划哈萨克的骨灰撒块光辉卡萨很干净啊是高科技傻空给发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划哈萨克的骨灰撒块光辉卡萨很干净啊是高科技傻空给</p>
        <p>发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划哈萨克的骨灰撒块光辉卡萨很干净啊是高科技傻空给</p>
        <p>发生过的空间还是看价格哈健康啊水果和卡刷卡更何况规划</p>
    </div>

    基础的css代码:

    CSS

    p{ width:150px; border:3px solid lightblue; background:lightgreen; padding:5px; margin:5px; }

    1
    2
    3
    4
    5
    6
    7
    p{
        width:150px;
        border:3px solid lightblue;
        background:lightgreen;
        padding:5px;
        margin:5px;
    }

    此时我们给div元素设置display属性为flex :

    CSS

    div{ display:flex; }

    1
    2
    3
    div{
        display:flex;
    }

    刷新浏览器后的效果是:

    图片 2

    可以看到效果跟旧版本的-webkit-box是一样的。

    在新版本中设置为弹性伸缩盒的display属性值有两个:

    • flex : 将容器盒模型作为块级弹性伸缩盒显示
    • inline-flex : 将容器盒模型作为内联级弹性伸缩盒显示

    看一下新版本的flex布局的浏览器兼容情况:

    图片 3

    PS:可以看到,在一些比较旧的webkit内核的浏览器(Chrome,Safari)中,我们需要使用-webkit-flex来做兼容,但是这里我就省略了。

    下面将逐一介绍flex布局的各个属性的基础用法:

    例子

    XHTML

    <body unresolved fullbleed> <core-scaffold id="scaffold"> <nav>Left drawer</nav> <core-toolbar tool>Application</core-toolbar> <div>Main content</div> </core-scaffold> </body>

    1
    2
    3
    4
    5
    6
    7
    <body unresolved fullbleed>
      <core-scaffold id="scaffold">
        <nav>Left drawer</nav>
        <core-toolbar tool>Application</core-toolbar>
        <div>Main content</div>
      </core-scaffold>
    </body>

    让我们一起来深入这些内容的每一部分

    参数

    bind 的第一个参数会作为原函数运行时的 this 指向,不多说;而第二个开始的参数是可选的,当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。怎么理解?

    function fn(a, b, c) { return a + b + c; } var _fn = fn.bind(null, 10); var ans = _fn(20, 30); // 60

    1
    2
    3
    4
    5
    6
    function fn(a, b, c) {
      return a + b + c;
    }
     
    var _fn = fn.bind(null, 10);
    var ans = _fn(20, 30); // 60

    fn 函数需要三个参数,_fn 函数将 10 作为默认的第一个参数,所以只需要传入两个参数即可,如果你不小心传入了三个参数,放心,也只会取前两个。

    function fn(a, b, c) { return a + b + c; } var _fn = fn.bind(null, 10); var ans = _fn(20, 30, 40); // 60

    1
    2
    3
    4
    5
    6
    function fn(a, b, c) {
      return a + b + c;
    }
     
    var _fn = fn.bind(null, 10);
    var ans = _fn(20, 30, 40); // 60

    这有啥用呢?如果某些函数,前几个参数已经 “内定” 了,我们便可以用 bind 返回一个新的函数。也就是说,bind() 能使一个函数拥有预设的初始参数。这些参数(如果有的话)作为 bind() 的第二个参数跟在 this 后面,之后它们会被插入到目标函数的参数列表的开始位置,传递给绑定函数的参数会跟在它们的后面。

    function list() { return Array.prototype.slice.call(arguments); } var list1 = list(1, 2, 3); // [1, 2, 3] // Create a function with a preset leading argument var leadingThirtysevenList = list.bind(undefined, 37); var list2 = leadingThirtysevenList(); // [37] var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function list() {
      return Array.prototype.slice.call(arguments);
    }
     
    var list1 = list(1, 2, 3); // [1, 2, 3]
     
    // Create a function with a preset leading argument
    var leadingThirtysevenList = list.bind(undefined, 37);
     
    var list2 = leadingThirtysevenList(); // [37]
    var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]

    flex-direction属性

    flex-direction属性用于设置伸缩项目的排列方式。

    CSS

    div{ display:flex; flex-direction:column; }

    1
    2
    3
    4
    div{
        display:flex;
        flex-direction:column;
    }

    效果如下:

    图片 4

    结果就是容器内的所有项目按照从上到下排列的。

    当你设置为row-reverse时,效果就是:

    图片 5

    这个是从浏览器的右边往左边排列的。

    此属性的属性值有:

    • row : 设置从左到右排列
    • row-reverse : 设置从右到左排列
    • column : 设置从上到下排列
    • column-reverse : 设置从下到上排列

    大家不妨都试一下,看看每一个的效果如何。

    抽屉菜单

    你放在导航元素里的标记都定义在滑走的应用抽屉菜单里。为了我们的目标 ,我坚持使用标题(<core-toolbar>)和导航链接 (<core-menu>):

    XHTML

    <nav> <core-toolbar><span>Single Page Polymer</span></core-toolbar> <core-menu selected="0"> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#one">Single</a> </paper-item> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#two">page</a> </paper-item> ... </core-menu> </nav>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <nav>
      <core-toolbar><span>Single Page Polymer</span></core-toolbar>
      <core-menu selected="0">
        <paper-item noink>
          <core-icon icon="label-outline"></core-icon>
          <a href="#one">Single</a>
        </paper-item>
        <paper-item noink>
          <core-icon icon="label-outline"></core-icon>
          <a href="#two">page</a>
        </paper-item>
        ...
      </core-menu>
    </nav>

    注意,现在<core-menu selected=”0″>被硬编码为选择第一个条目。我们以后会把它改为动态的。

    new

    使用 bind 返回的结果还是个 function,是个 function 就可以被 new 运算符调用,那么结果呢?规范中说的很清楚了,当使用 new 操作符调用绑定函数时,bind 的第一个参数无效。

    function Person(name, age) { this.name = name; this.age = age; } var _Person = Person.bind({}); var p = new _Person('hanzichi', 30); // Person {name: "hanzichi", age: 30}

    1
    2
    3
    4
    5
    6
    7
    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
     
    var _Person = Person.bind({});
    var p = new _Person('hanzichi', 30); // Person {name: "hanzichi", age: 30}

    一般我们不会去这么用,但是如果要写个 bind 的 polyfill(),还是需要考虑用 new 调用的情况。

    我们也可以设置默认值(参考上一小节),原先提供的那些参数仍然会被前置到构造函数调用的前面。

    function Person(name, age) { this.name = name; this.age = age; } var _Person = Person.bind(null, 'hanzichi'); var p = new _Person(30); // Person {name: "hanzichi", age: 30}

    1
    2
    3
    4
    5
    6
    7
    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
     
    var _Person = Person.bind(null, 'hanzichi');
    var p = new _Person(30); // Person {name: "hanzichi", age: 30}

    flex-wrap属性

    flex-wrap属性设置项目的换行方式(当容器宽度不足以容纳所有子项目时)。

    CSS

    div{ display:flex; flex-wrap:wrap; }

    1
    2
    3
    4
    div{
        display:flex;
        flex-wrap:wrap;
    }

    此时结果如下:

    图片 6

    可以看到,当我把浏览器窗口缩小时,第三个p元素因为容纳不下而被挤下来了。

    此属性的属性值有:

    • nowrap : 默认值,都在一行或者一列中显示
    • wrap : 伸缩项目无法容纳时,自动换行
    • wrap-reverse : 伸缩项目无法容纳时,自动换行,方向和wrap相反

    当我将flex-wrap属性设置为wrap-reverse时,运行后的效果就是变成这样:

    图片 7

    工具栏

    工具栏横跨了页面顶部并包含了功能按钮图标。满足这种功能的完美元素是<core-toolbar>:

    XHTML

    <!-- flex makes the bar span across the top of the main content area --> <core-toolbar tool flex> <!-- flex spaces this element and jusifies the icons to the right-side --> <div flex>Application</div> <core-icon-button icon="refresh"></core-icon-button> <core-icon-button icon="add"></core-icon-button> </core-toolbar>

    1
    2
    3
    4
    5
    6
    7
    <!-- flex makes the bar span across the top of the main content area -->
    <core-toolbar tool flex>
      <!-- flex spaces this element and jusifies the icons to the right-side -->
      <div flex>Application</div>
      <core-icon-button icon="refresh"></core-icon-button>
      <core-icon-button icon="add"></core-icon-button>
    </core-toolbar>

    配合 setTimeout

    什么时候容易丢失 this 指向?恩,setTimeout 是一个场景,很容易把 this 指向 window,当然,setInterval 也是一样。当使用对象的方法时,需要 this 引用对象,你可能需要显式地把 this 绑定到回调函数以便继续使用对象。

    var canvas = { render: function() { this.update(); this.draw(); }, update: function() { // ... }, draw: function() { // ... } }; window.setInterval(canvas.render, 1000 / 60);

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var canvas = {
      render: function() {
        this.update();
        this.draw();
      },
     
      update: function() {
        // ...
      },
     
      draw: function() {
        // ...
      }
    };
     
    window.setInterval(canvas.render, 1000 / 60);

    用 canvas 写特效或者做游戏时经常会碰到类似的问题。上面的代码是有问题的,render 方法中的 this 其实被指向了 window!我们可以用 bind,显式地把 this 绑定到回调函数以便继续使用该对象。

    window.setInterval(canvas.render.bind(canvas), 1000);

    1
    window.setInterval(canvas.render.bind(canvas), 1000);

    类似的情况还有 dom 的事件监听,一不小心可能 this 就被指向了 dom 元素。可以参考下以前做 bigrender 时写的这部分代码 。

    flex-flow属性

    flex-flow 属性是 flex-direction 和 flex-wrap 属性的速记属性。

    CSS

    div{ display:flex; flex-flow:row wrap; }

    1
    2
    3
    4
    div{
        display:flex;
        flex-flow:row wrap;
    }

    上面这个例子就相当于设置了flex-direction为row,flex-wrap为wrap。效果就是这样的:

    图片 8

    主要内容

    最后一部分是为你的内容而留的。它可以是任何的元素。<div>是一个很好的选择:

    XHTML

    <div layout horizontal center-center fit> <!-- fill with pages --> </div>

    1
    2
    3
    <div layout horizontal center-center fit>
      <!-- fill with pages -->
    </div>

    fit属性表示主要区域的内容会布满父元素的宽带和高度,layout horizontal center-center属性表示使用弹性框(flexbox)来使内容居中和垂直居中。

    tip

    bind 还能做一些有意思的事情。

    通常来说,将一个类数组转为数组,我们会用 slice(ie9- 不支持)。参考

    var slice = Array.prototype.slice; // slice.apply(arguments); // slice(arguments, 1);

    1
    2
    3
    4
    var slice = Array.prototype.slice;
     
    // slice.apply(arguments);
    // slice(arguments, 1);

    bind 能让调用变的更加简单。

    // same as "slice" in the previous example var unboundSlice = Array.prototype.slice; var slice = Function.prototype.call.bind(unboundSlice); // ... slice(arguments); // slice(arguments, 1);

    1
    2
    3
    4
    5
    6
    7
    8
    // same as "slice" in the previous example
    var unboundSlice = Array.prototype.slice;
    var slice = Function.prototype.call.bind(unboundSlice);
     
    // ...
     
    slice(arguments);
    // slice(arguments, 1);

    再举个类似的例子,比如说我们要添加事件到多个节点,for 循环当然没有任何问题,我们还可以 “剽窃” forEach 方法:

    Array.prototype.forEach.call(document.querySelectorAll('input[type="button"]'), function(el){ el.addEventListener('click', fn); });

    1
    2
    3
    Array.prototype.forEach.call(document.querySelectorAll('input[type="button"]'), function(el){
      el.addEventListener('click', fn);
    });

    更进一步,我们可以用 bind 将函数封装的更好:

    var unboundForEach = Array.prototype.forEach , forEach = Function.prototype.call.bind(unboundForEach); forEach(document.querySelectorAll('input[type="button"]'), function (el) { el.addEventListener('click', fn); });

    1
    2
    3
    4
    5
    6
    var unboundForEach = Array.prototype.forEach
      , forEach = Function.prototype.call.bind(unboundForEach);
     
    forEach(document.querySelectorAll('input[type="button"]'), function (el) {
      el.addEventListener('click', fn);
    });

    同样类似的,我们可以将 x.y(z) 变成 y(x,z) 的形式:

    var obj = { num: 10, getCount: function() { return this.num; } }; var unboundBind = Function.prototype.bind , bind = Function.prototype.call.bind(unboundBind); var getCount = bind(obj.getCount, obj); console.log(getCount()); // 10

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var obj = {
      num: 10,
      getCount: function() {
        return this.num;
      }
    };
     
    var unboundBind = Function.prototype.bind
      , bind = Function.prototype.call.bind(unboundBind);
     
    var getCount = bind(obj.getCount, obj);
    console.log(getCount());  // 10

    再举个栗子。每隔一秒在控制台打印 1-5,看起来是道考察闭包的经典题目。

    for(var i = 1; i <= 5; i++) { !function(i) { setTimeout(function() { console.log(i); }, i * 1000); }(i); }

    1
    2
    3
    4
    5
    6
    7
    for(var i = 1; i <= 5; i++) {
      !function(i) {
        setTimeout(function() {
          console.log(i);
        }, i * 1000);
      }(i);
    }

    ES6 下能用 let

    for(let i = 1; i <= 5; i++) { setTimeout(function() { console.log(i); }, i * 1000); }

    1
    2
    3
    4
    5
    for(let i = 1; i <= 5; i++) {
      setTimeout(function() {
        console.log(i);
      }, i * 1000);
    }

    也可以用 bind,瞬间逼格提升:

    for(var i = 1; i <= 5; i++) { setTimeout(console.log.bind(console, i), i * 1000); }

    1
    2
    3
    for(var i = 1; i <= 5; i++) {
      setTimeout(console.log.bind(console, i), i * 1000);
    }

    justify-content属性

    justify-content 在当灵活容器内的各项没有占用主轴上所有可用的空间时对齐容器内的各项(水平)。

    CSS

    div{ display:flex; justify-content:space-around; }

    1
    2
    3
    4
    div{
        display:flex;
        justify-content:space-around;
    }

    效果如下:

    图片 9

    可以看到所有项目平均分布,而且两端也有保留一半的空间。

    此属性的属性值有:

    • flex-start : 伸缩项目以起始点靠齐
    • flex-end : 伸缩项目以结束点靠齐
    • center : 伸缩项目以中心点靠齐
    • space-between : 伸缩项目平均分布
    • space-around : 伸缩项目平均分布,但两端保留一半的空间

    因为这些效果还是很容易就理解了,这里我就不一一演示了。

    本文由金沙国际官网发布于web前端,转载请注明出处:Components构建单页面应用,CSS3弹性伸缩布局

    关键词: