您的位置:奥门新浦京网址 > Wed前段 > 一篇文章理解JS继承,浅谈图片宽度自适应解决方

一篇文章理解JS继承,浅谈图片宽度自适应解决方

发布时间:2019-10-20 03:41编辑:Wed前段浏览(193)

    一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends

    2018/08/02 · JavaScript · 继承

    原文出处: 这是你的玩具车吗   

    说实在话,以前我只需要知道“寄生组合继承”是最好的,有个祖传代码模版用就行。最近因为一些事情,几个星期以来一直心心念念想整理出来。本文以《JavaScript高级程序设计》上的内容为骨架,补充了ES6 Class的相关内容,从我认为更容易理解的角度将继承这件事叙述出来,希望大家能有所收获。

    浅谈图片宽度自适应解决方案

    2015/10/19 · CSS, HTML5 · 3 评论 · 自适应

    原文出处: 百码山庄   

    在网页设计中,随着响应式设计的到来,各种响应式设计方案层出不穷。对于图片响应式的问题也有很多前端开发人员在进行研究。比较好的图片响应式设想便是在不同的屏幕分辨率下使用不同实际尺寸的图片,而达到在高速网络环境中使用大或超大高清图片,在低速网络或需要替用户节省流量资源的环境中使用小而清晰的图片,保证用户无论在何种环境下都能有良好的浏览体验。然而这是一个庞大而具有挑战的工作,我这里不做这个讨论,因为我目前还没有这方面很好的实践。这里我是要跟大家讨论下同一张图片在不同宽度的显示区域中的显示问题。

    戏说HTML5

    2015/12/23 · HTML5 · HTML5

    原文出处: 木的树的博客   

    如果有非技术人员问你,HTML5是什么,你会怎么回答?

     

    新的HTML规范。。。

    给浏览器提供了牛逼能力,干以前不能干的事。。。(确切地说应该是给浏览器规定了许多新的接口标准,要求浏览器实现牛逼的功能。。。 这里感谢红枫一叶)

    给浏览器暴露了许多新的接口。。。

    加了很多新的效果。。。

    问的人其实并不明白他想问的真正问题,回答的人貌似明白,但又好像少了点什么。牛逼的能力、新的接口、炫酷的效果,首先回答的人自己就是晕晕乎乎。什么是HTML、什么是CSS、什么是DOM、什么是JavaScript,大部分的前端开发每天都在用这些,但很少会有人去思考一下他们之间的关系。

    首先,HTML的全称是超文本标记语言,是一种标记形式的计算机语言。将这种标记语言给专门的解析器,就能够解析出一定的界面效果。浏览器就是专门解析这种标记语言的解析器。我们说他最终的效果是在屏幕上展示出特定的界面,那么浏览器肯定要把一个个的标记转换成内部的一种数据结构,这种数据结构便是DOM元素。比如,一个<a>标签在浏览器内部的世界中就是一个HTMLAnchorElement类型的一个实例。

    一个HTML文件就好比用超文本标记语言写的一篇文章,文章通常是有结构的,在浏览器眼里它就是DOM。DOM描述了一系列层次化的节点树。(但这时候的DOM还是存在于浏览器内部是C++语言编写的)

     

    随着历史的发展,当人们不在满足简单的显示文本,对于某些文本需要特殊强调或者给添加特殊格式的需求,慢慢的冒了出来。面对人们需要控制显示效果的需求,最先想到的也最简单的方式就是加标记。加一些样式控制的标记。这时候就出现了像<font>、<center>这种样式控制的标记。但是这样一来,所有的标记就会分为两大类:一种是说我是什么,一种是说我怎么显示。这还不是大问题,标记简单,但是浏览器要解析标记可就不那么简单了。想一想,这样干的话DOM也就要分成两大类,一类属于描述元素的DOM节点,一类属于描述显示效果的DOM节点。一个DOM节点可能代表一个元素,也可能是代表一种显示效果。怎么看都觉得别扭呀。

    最后人们决定废弃样式标签,给元素标签添加一个style特性,style特性控制元素的样式(最初的样式声明语法肯定很简单)。原来的样式标签的特性,现在变成了样式特性的语法,样式标记变成了样式特性。这样逻辑上就清晰多了。那么问题来了:

    • 一篇文章如果修辞过多,必然会引起读者的反感。如果把元素和显示效果都放在一个文件中,必然不利于阅读。
    • 如果有10个元素都需要一个效果,是不是要把一个style重复写十遍呢
    • 父元素的设置效果对子元素有没有影响,让不让拼爹
    • 。。。。。。。。。

    类似的问题肯定有很多,所以出来了CSS,层叠样式表,带来了css规则、css选择器、css声明、css属性等,这样以来就解决了以上痛点。标记语言这层解决了,但是浏览器就不能干坐着玩耍了,必然得提供支持。所以浏览器来解析一个静态html文件时,遍历整个html文档生成DOM树,当所有样式资源加载完毕后,浏览器开始构建呈现树。呈现树就是根据一系列css声明,经历了层叠之后,来确定一个个个DOM元素应该怎么绘制。这时候其实页面上还没有显示任何界面,渲染树也是浏览器内存里面的一种数据结构。渲染树完成之后,开始进行布局,这就好比已经知道一个矩形的宽高,现在要在画布量一量该画在哪,具体占多大地方。这个过程完了之后就是绘制的过程,然后我们便有了我们看到的显示界面了。

    给标记加点效果的问题解决了,历史的车轮又开始前进了。慢慢的人们不再满足简单的显示效果,人们希望来点交互。那个时候写HTML的大部分并不懂软件开发,开玩笑嘛,我一写活动页的你让我用C++?C++干这事的确是高射炮打蚊子——大材小用。那正规军不屑干的事就交给游击队吧,这时候网景公司开发出了JavaScript语言,那时候的JavaScript根本没有现在这么火,一土鳖脚本语言,哪像现在这么牛逼哄哄统一宇宙。

    JavaScript本是运行在浏览器的语言,HTML文本是静态的,不可能让JavaScript修改静态文件,但可以跟浏览器内部打交道。可是这个时候的DOM并不是今天的DOM,他们是C++对象,要么把JavaScript转换成C++指令操作这些C++对象,要么把这些C++对象包装成JavaScript原生对象。历史选择了后者,这时候也就标志着现代DOM的正式诞生。不过历史有时候会出现倒退,历史上总会出现几个奇葩,比如IE,IE奇葩他全家,包括Edge!

    马克思是个江湖骗子,但恩格斯是个好同志。自然辩证法与历史唯物主义是好东西。从历史的角度我们可以看到。CSS、DOM、JavaScript的出现于发展最终的源头都在HTML,超文本标记语言。人们对web的需求最终都汇集在HTML上。所以只要历史产生新的需求,最终的变化都首先发生在HTML规范上。

    当交互性不能在满足人们需求时,web迎来了新的需求:webapp。要迎合新的需求,首先要改变的就是HTML规范,这个时候已有的HTML4.0,已经无法满足人们日益增长的需求,所以HTML5迎着历史的需求,经过八年的艰苦努力,终于在2014年正式定稿!HTML5肯定是要加入新标签,然对于传统HTML而言,HTML5算是一个叛逆。所有之前的版本对于JavaScript接口的描述都不过三言两语,主要篇幅都用于定义标记,与JavaScript相关内容一概交由DOM规范去定义。而HTML5规范,则围绕着如何使用新增标记定义了大量JavaScript API(所以其中有一些API是与DOM重叠,定义了浏览器应该支持的DOM扩展,由此可以看到HTML5也必定不是HTML的最终版)。

     

    后记—— 本文只是一个旁观者以线性的方式来翻阅HTML的发展史,但历史更像是晴空上突然的晴天霹雳,一声过后,有人哀嚎遍野,有人高歌入云。以此纪念曾红极一时的Silverlight、Flex,以此纪念广大一线开发者活到老学到老的不懈精神、曾经耗费的精力、曾经逝去的青春。

    1 赞 1 收藏 评论

    图片 1

    1. 继承分类

    先来个整体印象。如图所示,JS中继承可以按照是否使用object函数(在下文中会提到),将继承分成两部分(Object.create是ES5新增的方法,用来规范化这个函数)。

    其中,原型链继承和原型式继承有一样的优缺点,构造函数继承与寄生式继承也相互对应。寄生组合继承基于Object.create, 同时优化了组合继承,成为了完美的继承方式。ES6 Class Extends的结果与寄生组合继承基本一致,但是实现方案又略有不同。

    下面马上进入正题。

    图片 2

    问题描述

    我们先来看下我想要描述的问题。首先我准备了三张宽度不同的图片,让他们垂直排列在页面中,除了去除图片本身在垂直方向上产生的间距,不做其他任何样式处理,这种情况我们通常在博文中经常看到,在写博文的时候经常用到,具体效果请看:图片宽度自适应(1)。简单看下我们的页面结构:

    JavaScript

    <img src="imgs/560x200.jpg" alt=""><br> <img src="imgs/440x200.jpg" alt=""><br> <img src="imgs/300x200.jpg" alt="">

    1
    2
    3
    <img src="imgs/560x200.jpg" alt=""><br>
    <img src="imgs/440x200.jpg" alt=""><br>
    <img src="imgs/300x200.jpg" alt="">

    为了方便查看效果,我们直接调整浏览器宽度来测试。测试效果如下gif图所示:

    图片 3

    我们不难发现,在我们改变窗口可视区域的时候,图片宽度并不会随之变化,以至于在小屏幕中我们只能开到图片的一部分,这是很多人所不乐见的,因为这极有可能会导致重要信息丢失。那么这个问题如何解决?

    2. 继承方式

    上图上半区的原型链继承,构造函数继承,组合继承,网上内容比较多,本文不作详细描述,只指出重点。这里给出了我认为最容易理解的一篇《JS中的继承(上)》。如果对上半区的内容不熟悉,可以先看这篇文章,再回来继续阅读;如果已经比较熟悉,这部分可以快速略过。另,上半区大量借用了yq前端的一篇继承文章[1]。

    简单尝试

    为了保证信息显示完整,保证图片随可视区域宽度变化而宽度自适应,我直接给图片标签设置了宽度100%,具体效果请看:图片宽度自适应(2)。

    和示例一一样,我们还是手动改变可视区域宽度来观看图片的表现:

    图片 4

    现在看来图片是可以根据可视区域宽度自适应了,但是问题来了:首先,所有图片不论原始大小宽窄一律以可是区域宽度为标准了,齐刷刷的一刀切,毫无美感;其次,当较宽显示区域显示较窄图片时,图片出现严重失真,甚至失去识别度。好吧,窄屏的问题解决了,宽屏的问题有来了,不知道这是要闹哪样!但是问题出来了,我们总要想办法去解决啊,那怎么办呢?

    2.1 原型式继承

    核心:将父类的实例作为子类的原型

    SubType.prototype = new SuperType() // 所有涉及到原型链继承的继承方式都要修改子类构造函数的指向,否则子类实例的构造函数会指向SuperType。 SubType.prototype.constructor = SubType;

    1
    2
    3
    SubType.prototype = new SuperType()
    // 所有涉及到原型链继承的继承方式都要修改子类构造函数的指向,否则子类实例的构造函数会指向SuperType。
    SubType.prototype.constructor = SubType;

    优点:父类方法可以复用

    缺点:

    • 父类的引用属性会被所有子类实例共享
    • 子类构建实例时不能向父类传递参数

    兵来将挡,水来土掩

    是问题,总有解决的办法,只是成本高低的问题。对于上面这个问题我思考了许久,刚开始我想使用width: 100%;max-width: 图片宽度; 来处理,但是,我发现图片宽度并不统一,max-width需要针对每一个宽度去设置,那根本不可行,无疑是自找麻烦,因为实际应用中,我们完全无法预知用户将使用多大宽度的图片。所以似乎单从控制图片样式已经找不到什么解决办法了,但是我开始关注 width:100%; 的问题。

    我们知道,在CSS中,宽度的百分比是是相对于父级容器宽度的。如果我们能有办法控制图片标签的父容器的宽度,那问题是不是就解决了呢?

    首先,为了让图片标签有可控的父元素,我们先对代码结构做一点点调整:

    JavaScript

    <div class="img-wrap"> <img src="imgs/560x200.jpg" alt=""> </div> <div class="img-wrap"> <img src="imgs/440x200.jpg" alt=""> </div> <div class="img-wrap"> <img src="imgs/300x200.jpg" alt=""> </div>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <div class="img-wrap">
        <img src="imgs/560x200.jpg" alt="">
    </div>
    <div class="img-wrap">
        <img src="imgs/440x200.jpg" alt="">
    </div>
    <div class="img-wrap">
        <img src="imgs/300x200.jpg" alt="">
    </div>

    好了,接下来就是如何控制img-wrap元素的宽度的问题了。我首先想到的是浮动(float),因为我们知道浮动元素的宽度是随内容变化的,所以我先给img-wrap设置了如下样式:

    JavaScript

    .img-wrap {float: left;}

    1
    .img-wrap {float: left;}

    但是,问题又来了,浮动元素会破坏原有的布局,如果不做清除浮动处理,会导致后面的内容紧跟在浮动元素之后。所以为了保证不影响其他内容,我们还得在img-wrap外面加一个容器来控制浮动与否:

    JavaScript

    <div class="row"> <div class="img-wrap"> <img src="imgs/560x200.jpg" alt=""> </div> </div> <div class="row"> <div class="img-wrap"> <img src="imgs/440x200.jpg" alt=""> </div> </div> <div class="row"> <div class="img-wrap"> <img src="imgs/300x200.jpg" alt=""> </div> </div>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <div class="row">
        <div class="img-wrap">
            <img src="imgs/560x200.jpg" alt="">
        </div>
    </div>
    <div class="row">
        <div class="img-wrap">
            <img src="imgs/440x200.jpg" alt="">
        </div>
    </div>
    <div class="row">
        <div class="img-wrap">
            <img src="imgs/300x200.jpg" alt="">
        </div>
    </div>

    好吧,现在我们在来看看,被折腾成什么样子了,图片宽度自适应(3):

    图片 5

    哈哈,好像是我想要的效果了。但是,作为一个有点强迫症的开发者,虽然达到了我想要的效果,但加了那么多层嵌套标签,总让我感觉不舒服。于是,我继续折腾,终于我恍然大悟, display:inline-block 的元素宽度也是随内容变化的,而且图片默认样式恰巧也表现为inline-block的效果,是否可以从这里下手呢?

    JavaScript

    <div class="img-wrap"> <img src="imgs/560x200.jpg" alt=""> </div> <div class="img-wrap"> <img src="imgs/440x200.jpg" alt=""> </div> <div class="img-wrap"> <img src="imgs/300x200.jpg" alt=""> </div>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <div class="img-wrap">
        <img src="imgs/560x200.jpg" alt="">
    </div>
    <div class="img-wrap">
        <img src="imgs/440x200.jpg" alt="">
    </div>
    <div class="img-wrap">
        <img src="imgs/300x200.jpg" alt="">
    </div>

    结构再度回归到只有一层嵌套,然而css样式却需要调整一下:

    JavaScript

    .img-wrap {display: inline-block;}

    1
    .img-wrap {display: inline-block;}

    当我,再次进行测试的时候,心情舒畅多了,你们感受下:图片宽度自适应(4)。

    最后,补上完整的css代码:

    CSS

    JavaScript

    .img-wrap { display: inline-block; } .img-wrap img { width: 100%; vertical-align: middle; }

    1
    2
    3
    4
    5
    6
    7
    .img-wrap {
      display: inline-block;
    }
    .img-wrap img {
        width: 100%;
        vertical-align: middle;
    }

    2 赞 10 收藏 3 评论

    图片 6

    本文由奥门新浦京网址发布于Wed前段,转载请注明出处:一篇文章理解JS继承,浅谈图片宽度自适应解决方

    关键词:

上一篇:缓存原理解析,精晓SVG坐标系和转换

下一篇:没有了