每日思考(2020/01/03)

题目概览

  • 对影子(Shadow)DOM的了解
  • 怎样修改自动填充表单的黄色背景?
  • 对arguments的理解

题目解答

对影子(Shadow)DOM的了解

  • 概念:是浏览器的一种能力,它允许在浏览器渲染文档(document)的时候向其中的 Dom 结构中插入一棵 DOM 元素子树,但是特殊的是,这棵子树(shadow-dom)并不在主 DOM 树中。可以想象成我们在 Vue 或者 React 中使用的一个个组件,是一种将 HTML 结构、Style 封装起来的结构。

    <!--> 浏览器开发者设置里打开shodow DOM ,可以查看到video的shodow DOM<-->
    <video src="test"></video> 

  • 结构

    • document:就是我们的正常文档 document
    • shadow host:对于一个内部有 shadow-dom 的元素而言,它必然需要一个宿主元素,对于上面的例子而言, video 标签,就是 shadow-dom 的宿主元素
    • shadow-root:通过 createShadowRoot(下文会提及) 返回的文档片段被称为 shadow-root 。它和它的后代元素,都将对用户隐藏,但是它们是实际存在的,在 chrome 中,我们可以通常审查元素去查看它们的具体 DOM 实现。在 video 中,例如暂停,播放,音量控制,全屏按钮,进度条等都是 shadow-root 的后代。它们工作时会显示在屏幕上,但他们的 DOM 结构对用户是不可见的。
    • contents:就是上述所说的 `` 中各子组件的 DOM 的具体实现
  • 目的:Shadow-dom 是游离在 DOM 树之外的节点树,但是他的创建基于普通 DOM 元素(非 document),并且创建后的 Shadow-dom 节点可以从界面上直观的看到。更重要的是,Shadow-dom 具有良好的密封性。这是浏览器提供的一种“封装”功能,提供了一种强大的技术去隐藏一些实现细节。
  • 控制:通过伪元素,我们可以控制 shadow-dom 中 DOM 结构的样式。在 chrome 下,查看 shadow-dom 结构(如果无法看到shadow-dom需要手动打开),可以看到每个结点都加上了一个 pesudo 属性,有了这些属性,我们可以通过伪元素的方式控制
    <div pseudo="-webkit-media-controls-overlay-enclosure">
      <input pseudo="-internal-media-controls-overlay-cast-button" type="button" aria-label="在远程设备上播放" style="display: none;">
    </div>
  • 创建:在线示例
    //定义一个叫做 PopUpInfo的类,它继承自HTMLElement
    class PopUpInfo extends HTMLElement {
      constructor() {
        // 必须首先调用 super方法
        super();
        //创建 shadow root
        var shadow = this.attachShadow({mode: 'open'});
        // 创建 span
        var wrapper = document.createElement('span');
        wrapper.setAttribute('class','wrapper');
        var icon = document.createElement('span');
        icon.setAttribute('class','icon');
        icon.setAttribute('tabindex', 0);
        var info = document.createElement('span');
        info.setAttribute('class','info');
        // 获取属性的内容并将内容添加到 info元素内
        var text = this.getAttribute('text');
        info.textContent = text;
        // 插入 icon
        var imgUrl;
        if(this.hasAttribute('img')) {
          imgUrl = this.getAttribute('img');
        } else {
          imgUrl = 'img/default.png';
        }
        var img = document.createElement('img');
        img.src = imgUrl;
        icon.appendChild(img);
        // 为 shadow dom添加一些 CSS样式
        var style = document.createElement('style');
        style.textContent = '.wrapper {' +
                                   'position: relative;' +
                                '}' +
    
                                 '.info {' +
                                    'font-size: 0.8rem;' +
                                    'width: 200px;' +
                                    'display: inline-block;' +
                                    'border: 1px solid black;' +
                                    'padding: 10px;' +
                                    'background: white;' +
                                    'border-radius: 10px;' +
                                    'opacity: 0;' +
                                    'transition: 0.6s all;' +
                                    'position: absolute;' +
                                    'bottom: 20px;' +
                                    'left: 10px;' +
                                    'z-index: 3;' +
                                  '}' +
    
                                  'img {' +
                                    'width: 1.2rem' +
                                  '}' +
    
                                  '.icon:hover + .info, .icon:focus + .info {' +
                                    'opacity: 1;' +
                                  '}';
        // 将所创建的元素添加到 Shadow DOM上
        shadow.appendChild(style);
        shadow.appendChild(wrapper);
        wrapper.appendChild(icon);
        wrapper.appendChild(info);
      }
    }
    // 定义新的元素
    window.customElements.define('popup-info', PopUpInfo)

怎样修改自动填充表单的黄色背景

  • 现象:当浏览器遇到type="text"与type="password"的input标签紧邻时,会触发浏览器自动填充行为。默认为黄色背景
  • 使用-webkit-autofill属性
    input:-webkit-autofill {
      -webkit-box-shadow: 0 0 3px 100px #eee inset; //改变填充背景色
    }
  • 关闭浏览器自带填充表单功能
    <!-- 对整个表单设置 -->
    <form autocomplete="off" method=".." action="..">
    <!-- 或对单一元素设置 -->
    <input type="text" name="textboxname" autocomplete="off">

对arguments的理解

  • 定义:是一个对应于传递给函数的参数的类数组对象。是所有(非箭头)函数中都可用的局部变量。可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处

    //如果一个函数传递了三个参数,可以以如下方式引用他们
    arguments[0]
    arguments[1]
    arguments[2]
    //参数也可以被设置
    arguments[1] = 'new value';
  • 属性:如果调用的参数多于正式声明接受的参数,则可以使用arguments对象。这种技术对于可以传递可变数量的参数的函数很有用。使用 arguments.length来确定传递给函数参数的个数,然后使用arguments对象来处理每个参数。要确定函数签名中(输入)参数的数量,请使用Function.length属性
    // arguments.callee:指向当前执行的函数
    //arguments.caller :指向调用当前函数的函数。
    // arguments.length:指向传递给当前函数的参数数量。
    // arguments[@@iterator]:返回一个新的Array迭代器对象,该对象包含参数中每个索引的值
    function test(x,y,z){
        console.log(arguments.callee); //[Function: test]
        console.log(arguments.caller); //undefined
        console.log(arguments.length);//2
      console.log(Function.length);//1
        console.log(arguments[0], arguments[1], arguments[3]); // 1 2 undefined
    }
    test(1,2)
  • arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。可以将参数转换为真实数组。
    var args = Array.prototype.slice.call(arguments);
    var args = [].slice.call(arguments);
    
    // ES2015
    const args = Array.from(arguments);
    const args = [...arguments];
  • 对参数使用 typeof
    console.log(typeof arguments);    // 'object'
    // arguments 对象只能在函数内使用
    function test(a){
        console.log(a,Object.prototype.toString.call(arguments));
        console.log(arguments[0],arguments[1]);
        console.log(typeof arguments[0]);
    }
    test(1);
    /*
    1 "[object Arguments]"
    1 undefined
    number
    */

原文地址:https://www.cnblogs.com/EricZLin/p/12150794.html

时间: 2024-10-31 13:00:11

每日思考(2020/01/03)的相关文章

[記事]2020/01 計畫

咕咕,產出文章真的好難 在此提醒 現在時間: 2020/01/11 12:50 2020 的第 1 個月已經過去快要一半啦 2020/01 月規劃 & 展望 邊做邊補充,希望 2 月來看可以打很多勾 3 FOCUS [ ] 最後一周的複習,堅持下去 [ ] 提高組 3 sessions [ ] 專注把其他小小.生活.細節處做好 Todo General [ ] 2019 檢討與檢視與整理 [ ] 2020 New Year resolutions Algos [ ] 線段樹入門 [ ] BIT

Bentley.STAAD.RCDC.V8i.04.01.01.03 1CD

1.Bentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CDBentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CD Multiframe的分析和设计工具给你一个非常强大和灵活的创建.分析和研究结果的结构的手段.Multiframe唯一的一款功能之间使用VBA自动化的结构分析程序.使用自动化,你可... 2.Bentley Utilities Designer V8i

01.01教程简介01.02软件的基本工作界面01.03模型设计的一般过程

xue.taoao.com 我的学习记录 01.01教程简介 --- 01.02软件的基本工作界面 - 任务窗口 拖拽到实例中 - 底部显示单位 - 确定当前环境 - 放大缩小 - 鼠标旋转缩放移动 --- 01.03模型设计的一般过程 ----- 原有凸台基础上    插入一个凸台 进入草图环境  选择原有凸台的一个面为基准面   空格  正视于    画一个圆形 - 智能尺寸-标注并且同时设置尺寸 - - 拉伸切 和凸台一样     拉伸切除-选择基准面进入草图   正视于  画圆  给定深

2020/01/10日报

日报内容详情: 日期:2020/01/10 前言: 今天洗漱完,本来是准备走路去上课的,但是走到外面一看,天气阴霾,下起了小雨,让人感觉是很不舒适,计划也赶不上变化啊,只好做公交去上课了.好了,不多说废话,开始今天的学习记录. 学习记录 上午: 开始的时候就下载了两个漏洞扫描软件,NESSUS和Acunetix,这两个软件都是开源的,Nessus使用的是vm镜像版的,这个软件安装时真的慢,感觉电脑都有点卡了,当然这应该是我电脑太破了,已经在暗示我换一台了. 终于安装好了,要开始使用操作了,因为我

人工智能行业每日必读(01&#183;16)

北京地铁正研究「刷脸」安检方案 1 月 16 日消息,北京市人大代表.北京市地铁运营有限公司党委书记.董事长谢正光透露,正在探索基于乘客信用的智慧安检模式,加强乘客信用体系建设,建立地铁『白名单』及快速安检通道制度.」据悉,目前,「刷脸」的快捷安检方案正在研究中,将在客流量较大的车站先行试点. 来源:http://www.egsea.com/news/detail?id=553902 云测数据荣登2019「ToB行业影响力·产品价值榜」 1月14日,2019 ToB行业影响力价值榜单重磅揭晓.云

学习进度2020.02.03

学习进度2020.02.03 https://www.runoob.com/w3cnote/android-tutorial-linearlayout.html https://www.runoob.com/w3cnote/android-tutorial-relativelayout.html 今天学习下Android中的布局,Android中有六大布局,分别是: LinearLayout(线性布局),RelativeLayout(相对布局),TableLayout(表格布局) FrameLa

每日思考(2020/01/04)

题目概览 对<meta>标签的理解 rgba()和opacity这两个的透明效果有什么区别? 为浏览器元素添加一个随机颜色的边框 在浏览器中输入url到页面显示出来的过程发生了什么 题目解答 对<meta>标签的理解 定义:元素可提供相关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词等等.标签位于文档的头部<head></head>标签内,不包含任何内容. 标签的属性定义了与文档相关联的[名称/值对]. HTML

每日思考(2020/01/02)

题目概览 对GBK和UTF-8的理解 对z-index的理解 bind.call.apply的区别? 题目解答 对GBK和UTF-8的理解 含义 GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符"gb2312",这种字符仅能存储简体中文字符 UTF-8编码:它是一种全国家通过的一种编码,如果你的网站涉及到多个国家的语言,那么建议你选择UTF-8编码 区别 UTF8编码格式很强大,支持所有国家的语言,正是因为它的强大,才会导致它占用的空间大小要比GBK

每日思考(2020/01/13)

题目概览 对无障碍web(WAI)的理解 请描述css的权重计算规则 写一个获取数组的最大值.最小值的方法 题目解答 对无障碍web(WAI)的理解 含义:"Accessibility",在 Web 发展的初期,习惯把它翻译成"无障碍",因为它主要考虑如何让残障人士更容易地访问 Web 内容.诸如有行动障碍的人难以完成需要用鼠标进行的精确手部动作,他们更多的需要靠键盘:有视觉障碍的人(低视力.色盲.失明)需要使用屏幕放大镜(物理放大镜.网页的缩放功能.网页设置大字体