2.基于用户行为的发爬虫:(同一IP短时间内访问的频率)
3.动态网页反爬虫(通过ajax请求数据,或者通过JavaScript生成)
4.对部分数据进行加密处理的(数据是乱码)
对于基本网页的抓取可以自定义headers,添加headers的数据
使用多个代理ip进行抓取或者设置抓取的频率降低一些,
对部分数据进行加密的,可以使用selenium进行截图,使用python自带的pytesseract库进行识别,但是比较慢最直接的方法是找到加密的方法进行逆向推理。
它是将scrapy框架中Scheduler替换为redis数据库,实现队列管理共享。
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。
scrapy是一个爬虫通用框架,但不支持分布式,scrapy-redis是为了更方便的实现scrapy分布式爬虫,而提供了一些以redis为基础的组件
因为redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高
在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态
采取可读性更强的xpath代替正则 强大的统计和log系统 同时在不同的url上爬行 支持shell方式,方便独立调试 写middleware,方便写一些统一的过滤器 通过管道的方式存入数据库
基于python爬虫框架,扩展性比较差,基于twisted框架,运行中exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉
requests 是 polling 方式的,会被网络阻塞,不适合爬取大量数据
从start_urls里面获取第一批url发送请求,请求由请求引擎给调度器入请求对列,获取完毕后,调度器将请求对列交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理,如果提取出需要的数据,则交给管道处理,如果提取出url,则继续执行之前的步骤,直到多列里没有请求,程序结束。
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程
面对海量待抓取网页,只有采用分布式架构,才有可能在较短时间内完成一轮抓取工作。
它的开发效率是比较快而且简单的。
爬虫下载慢主要原因是阻塞等待发往网站的请求和网站返回
1,采用异步与多线程,扩大电脑的cpu利用率;
Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
现在要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?
代码将输出[],不会产生IndexError错误,就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致Bug很难被追踪到。
c. Python2里面继承object的是新式类,没有写父类的是经典类
d. 经典类目前在Python里基本没有应用
第一种方法:使用装饰器
New 是真正创建实例对象的方法,所以重写基类的new 方法,以此保证创建对象的时候只生成一个实例
第三种方法:元类,元类是用于创建类对象的类,类对象创建实例对象时一定要调用call方法,因此在调用call时候保证始终只创建一个实例即可,type是python的元类
遍历在新在列表操作,删除时在原来的列表操作
因为列表总是‘向前移’,所以可以倒序遍历,即使后面的元素被修改了,还没有被遍历的元素和其坐标还是保持不变的
全字母短句 PANGRAM 是包含所有英文字母的句子,比如:A QUICK BROWN FOX JUMPS OVER THE LAZY DOG. 定义并实现一个方法 get_missing_letter, 传入一个字符串采纳数,返回参数字符串变成一个 PANGRAM 中所缺失的字符。应该忽略传入字符串参数中的大小写,返回应该都是小写字符并按字母顺序排序(请忽略所有非 ACSII 字符)
下面示例是用来解释,双引号不需要考虑:
2,当进行修改操作时,可变类型传递的是内存中的地址,也就是说,直接修改内存中的值,并没有开辟新的内存。
3,不可变类型被改变时,并没有改变原内存地址中的值,而是开辟一块新的内存,将原地址中的值复制过去,对这块新开辟的内存中的值进行操作。
is:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址
== : 比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法
函数作用域的LEGB顺序
python在函数里面的查找分为4种,称之为LEGB,也正是按照这是顺序来查找的
方法一: 利用 str
函数
方法二: 利用 ord
函数
方法四: 结合方法二,使用 reduce
,一行解决
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定nums = [2,7,11,15],target=9 因为 nums[0]+nums[1] = 2+7 =9,所以返回[0,1]
该函数的输入是一个仅包含数字的list,输出一个新的list,其中每一个元素要满足以下条件:
2、该元素在原list中是在偶数的位置(index是偶数)
该列表只包含满足以下条件的值,元素为原始列表中偶数切片
让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序,如字符串’’,变成’’
正确答案是[9,9,9,9],而不是[0,3,6,9]产生的原因是Python的闭包的后期绑定导致的,这意味着在闭包中的变量是在内部函数被调用的时候被查找的,因为,最后函数被调用的时候,for循环已经完成, i 的值最后是3,因此每一个返回值的i都是3,所以最后的结果是[9,9,9,9]
"""定义一个字符出现次数的函数"""
类方法: 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,类对象和实例对象都可调用
类实例方法: 是类实例化对象的方法,只有实例对象可以调用,形参为self,指代对象本身;
静态方法: 是一个任意函数,在其上方使用 @staticmethod 进行装饰,可以用对象直接调用,静态方法实际上跟该类没有太大关系
A,变量不必事先声明 B,变量无须先创建和赋值而直接使用
C,变量无须指定类型 D,可以使用del释放资源
内存管理机制: 引用计数、垃圾回收、内存池
引用计数:引用计数是一种非常高效的内存管理手段,当一个Python对象被引用时其引用计数增加1,
当其不再被一个变量引用时则计数减1,当引用计数等于0时对象被删除。弱引用不会增加引用计数
引用计数也是一种垃圾收集机制,而且也是一种最直观、最简单的垃圾收集技术。当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为1,如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。不过如果出现循环引用的话,引用计数机制就不再起有效的作用了。
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
有__del__()
函数的对象间的循环引用是导致内存泄露的主凶。不使用一个对象时使用: del object 来删除一个对象的引用计数就可以有效防止内存泄露问题。
通过Python扩展模块gc 来查看不能回收的对象的详细信息。
可以通过 sys.getrefcount(obj) 来获取对象的引用计数,并根据返回值是否为0来判断是否内存泄露
read 读取整个文件
readlines 读取整个文件到一个迭代器以供我们遍历
散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表
函数重载主要是为了解决两个问题。
另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。
好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。
那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。
好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。
1.函数设计要尽量短小
2.函数声明要做到合理、简单、易于使用
3.函数参数设计应该考虑向下兼容
4.一个函数只做一件事情,尽量保证函数语句粒度的一致性
Python的参数传递有:位置参数、默认参数、可变参数、关键字参数。
函数的传值到底是值传递还是引用传递、要分情况:
不可变参数用值传递:像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变不可变对象。
可变参数是引用传递:比如像列表,字典这样的对象是通过引用传递、和C语言里面的用指针传递数组很相似,可变对象能在函数内部改变。
缺省参数指在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会替代默认参数。
*args是不定长参数,它可以表示输入参数是不确定的,可以是任意多个。
**kwargs是关键字参数,赋值的时候是以键值对的方式,参数可以是任意多对在定义函数的时候
不确定会有多少参数会传入时,就可以使用两个参数
Python中一切皆对象,函数名是函数在内存中的空间,也是一个对象
在编写代码时只写框架思路,具体实现还未编写就可以用pass进行占位,是程序不报错,不会进行任何操作。
答:10对于字符串,数字,传递是相应的值
回调函数是把函数的指针(地址)作为参数传递给另一个函数,将整个函数当作一个对象,赋值给调用的函数。
内建类型:布尔类型,数字,字符串,列表,元组,字典,集合
输出字符串’a’的内建方法
判断一个对象里面是否有name属性或者name方法,返回bool值,有name属性(方法)返回True,否则返回False。
获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后面添加括号().
给对象的属性赋值,若属性不存在,先创建再赋值
设计模式是经过总结,优化的,对我们经常会碰到的一些编程问题的可重用解决方案。一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码,反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板。
常见的是工厂模式和单例模式
单例模式应用的场景一般发现在以下条件下:
资源共享的情况下,避免由于资源操作时导致的性能或损耗等,如日志文件,应用配置。
控制资源的情况下,方便资源之间的互相通信。如线程池等,1,网站的计数器 2,应用配置 3.多线程池 4数据库配置 数据库连接池 5.应用程序的日志应用…
装饰器本质上是一个callable object ,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。
迭代器是遵循迭代协议的对象。用户可以使用 iter() 以从任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一个方法则是创建一个另一种形式的迭代器 —— generator 。要获取下一个元素,则使用成员函数 next()(Python 2)或函数 next() function (Python 3) 。当没有元素时,则引发
生成器(Generator),只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)
区别: 生成器能做到迭代器能做的所有事,而且因为自动创建iter()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常。
yield就是保存当前程序执行状态。你用for循环的时候,每次取一个元素的时候就会计算一次。用yield的函数叫generator,和iterator一样,它的好处是不用一次计算所有元素,而是用一次算一次,可以节省很多空间,generator每次计算需要上一次计算结果,所以用yield,否则一return,上次计算结果就没了
在之前文章的留言中,很多果果朋友想让我谈谈关于人民币的学习,可见孩子在学习人民币的相关知识时,都或多或少的遇到了一些难题。其实不仅家长会有这个困扰,在学校学习中,人民币也是老师教学的一个难点。
关于人民币知识的学习,我们曾做过多次教研,究其原因,无非以下三条:
1.孩子接触人民币少,现在生活中都是电子支付,很多家长已经不使用钱了,孩子的接触自然更少;
2.生活中缺少购物的相关经验,孩子更多是陪同家长购物,或者由家长帮助选购各种用品;
3.现在使用的课本是十几年前编排的,其中涉及到的一些人民币面额,在生活中已经很少使用或者不流通,孩子根本没见过,比如2元、2角等。
在现行的数学课本中,人民币都是作为单独知识展开学习的,但是新课标中,将人民币的学习放入了综合与实践领域,建议以主题活动或项目式学习的形式展开。
这里额外的说明一下,大家经常听到的主题活动、项目式学习、真实情境下的学习、IB课程等,对于我们专业老师来说,它们之间是有区别的,但对于家长来说,没有必要深究,理念是相通的。我平时会习惯性的称它们为项目式学习。
对人民币的要求也不再是简单的认识、换算等,而是设计了主题活动:欢乐购物街,让孩子在实际情境中认识人民币,能进行简单的单位换算,了解的意义,具有勤俭节约的意识,形成初步的金融素养。
这样的变化,对人民币作为纯知识掌握的要求降低了,但是对于人民币的使用却提高了要求,需要孩子在生活中积累更多购物的经验,在使用人民币的过程中,认识人民币,感受货币的作用,体会货币单位的换算,发现商品与货币的关系。
我们家长又可以带孩子做哪些活动,帮助孩子在生活中多积累关于人民币的经验呢?
我们数学学习中有很多知识是习得性技能,人民币就是很典型的一个例子。经常使用,没上过学的人也能熟练掌握,如果只学不用,很快就会生疏。
孩子在生活中,首先要经常见到各种面额的人民币,我们现在使用的是第五套人民币,共8种面额:100元、50元、20元、10元、5元、1元、5角、1角。辨别方法非常简单,孩子只需要认识圆(元)、角两个字,配上前面的数字,就能准确识别。不要通过特点进行辨认。
我知道以前有老师很无聊,喜欢出偏题怪题来彰显自己的试卷有难度,会给出人民币上的某个标志性风景或者出示人民币的颜色,让孩子判断面额,这种题目没有任何价值,实在不必浪费时间。
可以在家中多准备一些不同面额的,零乱放在一起,让孩子做整理钱币的游戏。
游戏:一分钟整理钱包挑战
1.家长展示自己整齐的钱包,其中钱币分类清楚,按照面额大小整齐摆放;
2.取出其中钱币,零乱放于桌面;
3.计时一分钟,孩子在限定时间内完成整理即挑战成功。
在玩这个游戏时,起初可以每种面额的人民币只有一张,让孩子在从大到小摆放的过程中,感受钱币面额的大小,之后可逐渐增加难度,每种面额的钱币都有多张,孩子在整理同类钱币时,也会去深入观察不同面额钱币的特点。
兑换钱币,感受换钱的等值原则
人民币的兑换,一直是孩子学习中的一个难点,原因在于很多孩子是通过背诵口诀进行换算的,小换大除进率,大换小乘进率,这样进行换算,完全脱离了理解,孩子经常会混淆。
其实元角分的转换是小学阶段最早接触的单位换算,原因在于他们都是十进制的,与孩子数数的规则一致,非常好理解。人民币的换算,应该从生活中来。
因为现在已经不使用几分钱了,所以我们更多关注元和角之间的转换。
游戏1:换点小钱(孩子手中只有1角和5角面额的人民币)
1.多准备一些1角、5角和1元的钱币,首先我们要告诉孩子常识,10角=1元。可以用1角的或纸币,边数边说1角、2角、3角、......、10角,然后告诉孩子,这是10角,也是1元,它们是相等的;
2.家长拿1元钱,和孩子手中的几角钱做交换,鼓励孩子尝试两种交换方式,10个1角和1个5角+5个1角;
3.我有2元钱,怎么和你做交换呢?孩子数钱时,鼓励他1元1元的摆放在一起,这个过程让孩子感受2元就是2个1元,也就是2个10角。
家长还可以和孩子兑换3元、4元,但没必要太多,让孩子感受到,兑换几元钱,就是几个10角即可,3元就是3个10角,4元就是4个10角。
1.家长准备100元,兑换孩子手中的零钱,孩子有10元、20元、50元面额的人民币;
2.鼓励孩子尝试用多种换钱方式,如2张50元,50元+2张20元+10元,10张10元等;
3.扩充孩子的零钱,再帮孩子准备充足的1元和5元加入兑换活动,每次兑换的钱数也不断变化,如家长给孩子1张50元和1张5元,共55元,和孩子兑换零钱等。
在这样的交换活动中,孩子会感受到所有的兑换都是等值的,虽然钱币组合的形式发生了改变,但数额大小是不变的。
100元能买什么,感受钱的购买力
孩子知道钱能买东西,但是他们对钱的多少,物品价格的高低是没有感觉的,钱在他们眼中只是抽象的数字而已,这就需要将钱和等值的物品对应起来,让孩子感受钱的价值。
我们还是要走出去,带孩子进行购物活动,很多家长会让孩子在购物时观察商品的价格,结账时帮助计算总钱数等,这都可以帮助孩子加深对人民币的认识,但是对于人民币的购买力,孩子没有直观的感受。
1.以最常见的100元面额为标准,展开不同场所的购物活动;
2.和孩子带100元去超市购物,选购物品,总价不超过100元,回家后,孩子可以用自己的方式记录消费清单,如画图记录、列表格记录等,也可以保存好购物小票;
3.还是以100元为标准,分别去书店、餐馆、游乐场等不同场所消费,并记录消费清单;
4.对比100元在不同的场所,可以购买哪些物品,感受100元的购买力。
这样的活动中,孩子经历购物的全过程,并在回顾对比所购买物品的过程中,感受到100元在不同场所的购买能力,让他们对100元的价值有更深刻的了解。
随着孩子对人民币了解的深入,我们还可以带孩子了解货币的变化以及各国的钱币,这些日常知识的积累,也有助于孩子更好的进行校内学习。
给大家推荐一本介绍货币演变的绘本—《货币简史》,这本书从远古时代以物易物开始介绍,人们以贝壳进行交易,到秦始皇统一货币,宋朝使用交子,一直到我们现在我们使用的纸币和电子货币,都进行了介绍。
在二年级的语文课本中,就有《“贝”的故事》一课,其中提到了古人把贝壳作为钱币,所以用“贝”做偏旁的字大多与钱财有关,很多有经验的老师在讲这节课时,都会带孩子了解钱币的演变;在数学学习中,我们在低年级学习人民币,高年级就要学习汇率的相关知识,其中涉及到了人民币与各国钱币之间的兑换,此时钱的价值就不再体现于数字的大小,而表现在它的购买力上。
生活中,我们每天都在和人民币打交道,但随着电子支付的普及,孩子接触纸币的机会却越来越少,钱对于他们来说愈加抽象,这就需要我们家长多给孩子提供接触钱币的机会,生活中多做相关的兑换活动,多带孩子参与每一次购物活动,积累关于人民币的经验。这样,当孩子在校内学习人民币时,自然而然的将生活经验迁移过来,就能轻松掌握相关知识。
上一篇《 》的留言中,大家对跨学科的好奇并不太多,毕竟咱详细分析过项目式学习,大家从字面意思也能理解到这些名词虽然各异,但方向其实差不多。
大家最关心的问题,其实是已经上了小学的孩子,还会不会受新课标的影响。就像我看完稿子写今天有话说的时候,第一反应也是,这些游戏是针对老课标还是新课标,是不是都适合玩。
我刚从云南回来了,昨天一天打扫卫生收拾屋子,搞到凌晨5点(强迫症整理房间真的是个一言难尽的过程),以至于小周老师风雨无阻的专栏,因为我睡过头没有按时发,对一早等发文的朋友说抱歉了。
这趟云南之行,在疫情之下,真的巨难巨折腾(微博好多看我行程直播的朋友说,看完我们的折腾,最近都不想带娃出远门了),但七七去云南体验自然教育幼儿园这一个多月,罗罗还是有很多启发和收获的,等我梳理一下,把有价值的内容分享给大家。
育儿干货I好物分享I诚意满满
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
原文地址:/syfwhu/p//目录,会判断这个“目录是什么文件类型,或者是目录。)
如果不使用JS来完成,可以加分。(如:纯CSS实现的幻灯片效果)
w3c存在的意义就是让浏览器兼容性问题尽量小,首先是他们对浏览器开发者的约束,然后是对开发者的约束。
件,因此,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。解决方法简单的出 奇,只要在<head>之间加入一个<link>或者<script>元素就可以了。
此标签可告知浏览器文档使用哪种HTML或XHTML规范。该标签可声明三种DTD类型,分别表示严格版本、过渡版本以及基于框架的HTML文档。
Standards(标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页,而Quirks(包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器而设计的网页。
W3C标准推出以后,浏览器都开始采纳新标准,但存在一个问题就是如何保证旧的网页还能继续浏览,在标准出来以前,很多页面都是根据旧的渲染方法编 写的,如果用的标准来渲染,将导致页面显示异常。为保持浏览器渲染的兼容性,使以前的页面能够正常浏览,浏览器都保留了旧的渲染方法(如:微软的IE)。
所有的 XHTML 元素都必须被正确地嵌套,XHTML 必须拥有良好的结构,所有的标签必须小写,并且所有的 XHTML 元素必须被关闭。所有的 XHTML 文档必须拥有 DOCTYPE 声明,并且 html、head、title 和 body 元素必须存在。虽然代码更加的优雅,但缺少容错性,不利于快速开发。
下面这些问题需要考虑:
data-* 属性用于存储页面或应用程序的私有自定义数据。data-* 属性赋予我们在所有 HTML 元素上嵌入自定义 data 属性的能力。存储的(自定义)数据能够被页面的 JavaScript 中利用,以创建更好的用户体验(不进行 Ajax 调用或服务器端数据库查询)。
data-* 属性包括两部分:
览器端存储的数据,其中sessionStorage的概念很特别,引入了一个“浏览器窗口”的概念。sessionStorage是在同源的同窗口(或 tab)中,始终存在的数据。也就是说只要这个浏览器窗口没有关闭,即使刷新页面或进入同源另一页面,数据仍然存在。关闭窗口
因为浏览器的品种很多,每个浏览器的默认样式也是不同的,所以定义一个css reset可以使各浏览器的默认样式统一。
关于浮动我们需要了解,浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。要想使元素浮动,必须为元素设置一个宽度(width)。虽然浮动元素不是文档流之中,但是它浮动后所处的位置依然是在浮动之前的水平方向上。由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样,下面的元素填补原来的位置。有些元素会在浮动元素的下方,但是这些元素的内容并不一定会被浮动的元素所遮盖,对内联元素进行定位时,这些元素会考虑浮动元素的边界,会围绕着浮动元素放置。也可以把浮动元素想象成是被块元素忽略的元素,而内联元素会关注浮动元素的。
此三种方法各有利弊,使用时应择优选择,比较之下第二种方法更为可取。
把span背景设成文字内容,这样又可以保证seo,也有图片的效果在上面。一般都是:alt,title,onerror。
各个浏览器都认识,这里给firefox用;