zoukankan      html  css  js  c++  java
  • xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

    AMP ⚡

    https://amp.dev/zh_cn/

    PWA

    AMP Playground

    https://playground.amp.dev/?runtime=amp4email

    <!doctype html>
    <html ⚡4email>
    <head>
      <meta charset="utf-8">
      <script async src="https://cdn.ampproject.org/v0.js"></script>
      <style amp4email-boilerplate>body{visibility:hidden}</style>
      <style amp-custom>
        h1 {
          margin: 1rem;
        }
      </style>
    </head>
    <body>
      <h1>Hello, I am an AMP EMAIL!</h1>
    </body>
    </html>
    
    

    custom-element

    https://github.com/ampproject

    <!doctype html>
    <html amp lang="en">
      <head>
        <meta charset="utf-8">
        <script async src="https://cdn.ampproject.org/v0.js"></script>
        <title>Hello, AMPs</title>
        <link rel="canonical" href="https://amp.dev/zh_cn/documentation/guides-and-tutorials/start/create/basic_markup/">
        <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
        <script type="application/ld+json">
          {
            "@context": "http://schema.org",
            "@type": "NewsArticle",
            "headline": "Open-source framework for publishing content",
            "datePublished": "2015-10-07T12:02:41Z",
            "image": [
              "logo.jpg"
            ]
          }
        </script>
        <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
      </head>
      <body>
        <h1>Welcome to the mobile web</h1>
      </body>
    </html>
    
    

    Chrome Devtools

    https://developers.google.com/web/updates/2020/03/devtools

    Grid Layout


    
    /**
     * Copyright 2017 The AMP HTML Authors. All Rights Reserved.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS-IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    import {ElementStub, stubbedElements} from '../element-stub';
    import {createCustomElementClass} from '../custom-element';
    import {extensionScriptsInNode} from '../element-service';
    import {reportError} from '../error';
    import {userAssert} from '../log';
    
    /**
     * @param {!Window} win
     * @return {!Object<string, typeof ../base-element.BaseElement>}
     */
    function getExtendedElements(win) {
      if (!win.__AMP_EXTENDED_ELEMENTS) {
        win.__AMP_EXTENDED_ELEMENTS = {};
      }
      return win.__AMP_EXTENDED_ELEMENTS;
    }
    
    /**
     * Registers an element. Upgrades it if has previously been stubbed.
     * @param {!Window} win
     * @param {string} name
     * @param {typeof ../base-element.BaseElement} toClass
     */
    export function upgradeOrRegisterElement(win, name, toClass) {
      const knownElements = getExtendedElements(win);
      if (!knownElements[name]) {
        registerElement(win, name, toClass);
        return;
      }
      if (knownElements[name] == toClass) {
        // Already registered this instance.
        return;
      }
      userAssert(
        knownElements[name] == ElementStub,
        '%s is already registered. The script tag for ' +
          '%s is likely included twice in the page.',
        name,
        name
      );
      knownElements[name] = toClass;
      for (let i = 0; i < stubbedElements.length; i++) {
        const stub = stubbedElements[i];
        // There are 3 possible states here:
        // 1. We never made the stub because the extended impl. loaded first.
        //    In that case the element won't be in the array.
        // 2. We made a stub but the browser didn't attach it yet. In
        //    that case we don't need to upgrade but simply switch to the new
        //    implementation.
        // 3. A stub was attached. We upgrade which means we replay the
        //    implementation.
        const {element} = stub;
        if (
          element.tagName.toLowerCase() == name &&
          element.ownerDocument.defaultView == win
        ) {
          tryUpgradeElement_(element, toClass);
          // Remove element from array.
          stubbedElements.splice(i--, 1);
        }
      }
    }
    
    /**
     * This method should not be inlined to prevent TryCatch deoptimization.
     * @param {Element} element
     * @param {typeof ../base-element.BaseElement} toClass
     * @private
     * @noinline
     */
    function tryUpgradeElement_(element, toClass) {
      try {
        element.upgrade(toClass);
      } catch (e) {
        reportError(e, element);
      }
    }
    
    /**
     * Stub extended elements missing an implementation. It can be called multiple
     * times and on partial document in order to start stubbing as early as
     * possible.
     * @param {!./ampdoc-impl.AmpDoc} ampdoc
     */
    export function stubElementsForDoc(ampdoc) {
      const extensions = extensionScriptsInNode(ampdoc.getHeadNode());
      extensions.forEach((name) => {
        ampdoc.declareExtension(name);
        stubElementIfNotKnown(ampdoc.win, name);
      });
    }
    
    /**
     * Stub element if not yet known.
     * @param {!Window} win
     * @param {string} name
     */
    export function stubElementIfNotKnown(win, name) {
      const knownElements = getExtendedElements(win);
      if (!knownElements[name]) {
        registerElement(win, name, ElementStub);
      }
    }
    
    /**
     * Copies the specified element to child window (friendly iframe). This way
     * all implementations of the AMP elements are shared between all friendly
     * frames.
     * @param {!Window} parentWin
     * @param {!Window} childWin
     * @param {string} name
     */
    export function copyElementToChildWindow(parentWin, childWin, name) {
      const toClass = getExtendedElements(parentWin)[name];
      registerElement(childWin, name, toClass || ElementStub);
    }
    
    /**
     * Registers a new custom element with its implementation class.
     * @param {!Window} win The window in which to register the elements.
     * @param {string} name Name of the custom element
     * @param {typeof ../base-element.BaseElement} implementationClass
     */
    export function registerElement(win, name, implementationClass) {
      const knownElements = getExtendedElements(win);
      knownElements[name] = implementationClass;
      const klass = createCustomElementClass(win);
      win['customElements'].define(name, klass);
    }
    
    /**
     * In order to provide better error messages we only allow to retrieve
     * services from other elements if those elements are loaded in the page.
     * This makes it possible to mark an element as loaded in a test.
     * @param {!Window} win
     * @param {string} elementName Name of an extended custom element.
     * @visibleForTesting
     */
    export function markElementScheduledForTesting(win, elementName) {
      const knownElements = getExtendedElements(win);
      if (!knownElements[elementName]) {
        knownElements[elementName] = ElementStub;
      }
    }
    
    /**
     * Resets our scheduled elements.
     * @param {!Window} win
     * @param {string} elementName Name of an extended custom element.
     * @visibleForTesting
     */
    export function resetScheduledElementForTesting(win, elementName) {
      if (win.__AMP_EXTENDED_ELEMENTS) {
        delete win.__AMP_EXTENDED_ELEMENTS[elementName];
      }
    }
    
    /**
     * Returns a currently registered element class.
     * @param {!Window} win
     * @param {string} elementName Name of an extended custom element.
     * @return {?function()}
     * @visibleForTesting
     */
    export function getElementClassForTesting(win, elementName) {
      const knownElements = win.__AMP_EXTENDED_ELEMENTS;
      return (knownElements && knownElements[elementName]) || null;
    }
    
    
    

    refs



    ©xgqfrms 2012-2020

    www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/xgqfrms/p/12762109.html
Copyright © 2011-2022 走看看