谁有圣linu冥刻学园受胎编cg存档的tv啊,不是cg图

松间月明的喜欢 | LOFTER(乐乎) - 让兴趣,更有趣
LOFTER for ipad —— 让兴趣,更有趣
松间月明 的喜欢
&nbsp&nbsp被喜欢
&nbsp&nbsp被喜欢
{list posts as post}
{if post.type==1 || post.type == 5}
{if !!post.title}${post.title|escape}{/if}
{if !!post.digest}${post.digest}{/if}
{if post.type==2}
{if post.type == 3}
{if !!post.image}
{if post.type == 4}
{if !!post.image}
{if !!photo.labels && photo.labels.length>0}
{var wrapwidth = photo.ow < 500?photo.ow:500}
{list photo.labels as labs}
{var lbtxtwidth = Math.floor(wrapwidth*(labs.ort==1?labs.x:(100-labs.x))/100)-62}
{if lbtxtwidth>12}
{if !!labs.icon}
{list photos as photo}
{if photo_index==0}{break}{/if}
品牌${make||'-'}
型号${model||'-'}
焦距${focalLength||'-'}
光圈${apertureValue||'-'}
快门速度${exposureTime||'-'}
ISO${isoSpeedRatings||'-'}
曝光补偿${exposureBiasValue||'-'}
镜头${lens||'-'}
{if data.msgRank == 1}{/if}
{if data.askSetting == 1}{/if}
{if defined('posts')&&posts.length>0}
{list posts as post}
{if post_index < 3}
{if post.type == 1 || post.type == 5}
{if !!post.title}${post.title|escape}{/if}
{if !!post.digest}${post.digest}{/if}
{if post.type == 2}
{if post.type == 3}
{if post.type == 4}
{if post.type == 6}
{if drlist.length>0}
更多相似达人:
{list drlist as dr}{if drlist.length === 3 && dr_index === 0}、{/if}{if drlist.length === 3 && dr_index === 1}、{/if}{if drlist.length === 2 && dr_index === 0}、{/if}{/list}
暂无相似达人,
{if defined('posts')&&posts.length>0}
{list posts as post}
{if post.type == 2}
{if post.type == 3}
{if post.type == 4}
{if post.type == 6}
this.p={ dwrMethod:'queryLikePosts',fpost:'d6ea2_c61d933',userId:,blogListLength:29};linux(78)
Linux的虚拟内存管理有几个关键概念:
Linux 虚拟地址空间如何分布?malloc和free是如何分配和释放内存?如何查看堆内内存的碎片情况?既然堆内内存brk和sbrk不能直接释放,为什么不全部使用 mmap 来分配,munmap直接释放呢 ?
Linux&的虚拟内存管理有几个关键概念:&
1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址;&
2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址;&
3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。&
一、Linux 虚拟地址空间如何分布?&
Linux 使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为:&
1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) )&
2、数据段:保存全局变量、静态变量的空间;&
3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。&
4、文件映射区域:如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。&
5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。&
6、内核虚拟空间:用户代码不可见的内存区域,由内核管理(页表就存放在内核虚拟空间)。&
下图是 32 位系统典型的虚拟地址空间分布(来自《深入理解计算机系统》)。
32&位系统有4G 的地址空间::
其中 0xxbfffffff 是用户空间,0xcxffffffff 是内核空间,包括内核代码和数据、与进程相关的数据结构(如页表、内核栈)等。另外,%esp 执行栈顶,往低地址方向变化;brk/sbrk 函数控制堆顶_edata往高地址方向变化。
64位系统结果怎样呢? 64 位系统是否拥有 2^64 的地址空间吗?&
事实上, 64 位系统的虚拟地址空间划分发生了改变:&
1、地址空间大小不是2^32,也不是2^64,而一般是2^48。
因为并不需要 2^64 这么大的寻址空间,过大空间只会导致资源的浪费。64位Linux一般使用48位来表示虚拟地址空间,40位表示物理地址,&
这可通过#cat& /proc/cpuinfo 来查看:&
2、其中,0x07fffffffffff 表示用户空间, 0xFFFF~ 0xFFFFFFFFFFFFFFFF 表示内核空间,共提供 256TB(2^48) 的寻址空间。&
这两个区间的特点是,第 47 位与 48~63 位相同,若这些位为 0 表示用户空间,否则表示内核空间。&
3、用户空间由低地址到高地址仍然是只读段、数据段、堆、文件映射区域和栈;
二、malloc和free是如何分配和释放内存?
如何查看进程发生缺页中断的次数?
用# ps -o majflt,minflt -C program 命令查看
majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
这两个数&#20540;表示一个进程自启动以来所发生的缺页中断的次数。
可以用命令ps -o majflt minflt -C program来查看进程的majflt, minflt的&#20540;,这两个&#20540;都是累加&#20540;,从进程启动开始累加。在对高性能要求的程序做压力测试的时候,我们可以多关注一下这两个&#20540;。&
如果一个进程使用了mmap将很大的数据文件映射到进程的虚拟地址空间,我们需要重点关注majflt的&#20540;,因为相比minflt,majflt对于性能的损害是致命的,随机读一次磁盘的耗时数量级在几个毫秒,而minflt只有在大量的时候才会对性能产生影响。
发成缺页中断后,执行了那些操作?
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:&
1、检查要访问的虚拟地址是否合法&
2、查找/分配一个物理页&
3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)&
4、建立映射关系(虚拟地址到物理地址)&
重新执行发生缺页中断的那条指令&
如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。
内存分配的原理
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
1、brk是将数据段(.data)的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。
下面以一个例子来说明内存分配的原理:
情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),如下图:
1、进程启动的时候,其(虚拟)内存空间的初始布局如图1所示。
其中,mmap内存映射文件是在堆和栈的中间(例如libc-2.2.93.so,其它数据文件等),为了简单起见,省略了内存映射文件。
_edata指针(glibc里面定义)指向数据段的最高地址。&
2、进程调用A=malloc(30K)以后,内存空间如图2:
&&&&& malloc函数会调用brk系统调用,将_edata指针往高地址推30K,就完成虚拟内存分配。
你可能会问:只要把_edata&#43;30K就完成内存分配了?
事实是这样的,_edata&#43;30K只是完成虚拟地址的分配,A这块内存现在还是没有物理页与之对应的,等到进程第一次读写A这块内存的时候,发生缺页中断,这个时候,内核才分配A这块内存对应的物理页。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。&
3、进程调用B=malloc(40K)以后,内存空间如图3。
情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0),如下图:
4、进程调用C=malloc(200K)以后,内存空间如图4:
默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。
这样子做主要是因为::
brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。
当然,还有其它的好处,也有坏处,再具体下去,有兴趣的同学可以去看glibc里面malloc的代码了。&
5、进程调用D=malloc(100K)以后,内存空间如图5;&
6、进程调用free(C)以后,C对应的虚拟内存和物理内存一起释放。
7、进程调用free(B)以后,如图7所示:
&&&&&&& B对应的虚拟内存和物理内存都没有释放,因为只有一个_edata指针,如果往回推,那么D这块内存怎么办呢?
当然,B这块内存,是可以重用的,如果这个时候再来一个40K的请求,那么malloc很可能就把B这块内存返回回去了。&
8、进程调用free(D)以后,如图8所示:
&&&&&&& B和D连接起来,变成一块140K的空闲内存。
9、默认情况下:
当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩,变成图9所示。
说完内存分配的原理,那么被测模块在内核态cpu消耗高的原因就很清楚了:每次请求来都malloc一块2M的内存,默认情况下,malloc调用 mmap分配内存,请求结束的时候,调用munmap释放内存。假设每个请求需要6个物理页,那么每个请求就会产生6个缺页中断,在2000的压力下,每 秒就产生了10000多次缺页中断,这些缺页中断不需要读取磁盘解决,所以叫做minflt;缺页中断在内核态执行,因此进程的内核态cpu消耗很大。缺 页中断分散在整个请求的处理过程中,所以表现为分配语句耗时(10us)相对于整条请求的处理时间(1000us)比重很小。&
将动态内存改为静态分配,或者启动的时候,用malloc为每个线程分配,然后保存在threaddata里面。但是,由于这个模块的特殊性,静态分配,或者启动时候分配都不可行。另外,Linux下默认栈的大小限制是10M,如果在栈上分配几M的内存,有风险。&
禁止malloc调用mmap分配内存,禁止内存紧缩。&
在进程启动时候,加入以下两行代码:&
mallopt(M_MMAP_MAX, 0); // 禁止malloc调用mmap分配内存&
mallopt(M_TRIM_THRESHOLD, -1); // 禁止内存紧缩&
效果:加入这两行代码以后,用ps命令观察,压力稳定以后,majlt和minflt都为0。进程的系统态cpu从20降到10。
三、如何查看堆内内存的碎片情况 ?
glibc 提供了以下结构和接口来查看堆内内存和 mmap 的使用情况。&
struct mallinfo {&
&&&&&&&&&&&& /* non-mmapped space allocated from system */&
&&&&&&&&& /* number of free chunks */&
&&&&&&&&&& /* number of fastbin blocks */&
&&&&&&&&&&&&& /* number of mmapped regions */&
&&&&&&&&&&& /* space in mmapped regions */&
&&&&&&&& /* maximum total allocated space */&
&&&&&&&&& /* space available in freed fastbin blocks */&
&&&&&&&& /* total allocated space */&
&&&&&&&&& /* total free space */&
&&&&&&& /* top-most, releasable (via malloc_trim) space */&
/*返回heap(main_arena)的内存使用情况,以 mallinfo 结构返回 */&
struct mallinfo mallinfo();
/*&将heap和mmap的使用情况输出到stderr*/&
void malloc_stats();
可通过以下例子来验证mallinfo和malloc_stats输出结果。&
#include &stdlib.h&&
#include &stdio.h&&
#include &string.h&&
#include &unistd.h&&
#include &sys/mman.h&&
#include &malloc.h&
size_t& heap_malloc_total, heap_free_total,mmap_total, mmap_
void print_info()&
&&& struct mallinfo mi = mallinfo();&
printf(&count by itself:\n&);&
&&& printf(&\theap_malloc_total=%lu heap_free_total=%lu heap_in_use=%lu\n\tmmap_total=%lu mmap_count=%lu\n&,&
&&&&&&&&&&&&& heap_malloc_total*1024, heap_free_total*1024, heap_malloc_total*1024-heap_free_total*1024,&
&&&&&&&&&&&&& mmap_total*1024, mmap_count);&
printf(&count by mallinfo:\n&);&
printf(&\theap_malloc_total=%lu heap_free_total=%lu heap_in_use=%lu\n\tmmap_total=%lu mmap_count=%lu\n&,&
&&&&&&&&&&&& mi.arena, mi.fordblks, mi.uordblks,&
&&&&&&&&&&&& mi.hblkhd, mi.hblks);&
printf(&from malloc_stats:\n&);&
malloc_stats();&
#define ARRAY_SIZE 200&
int main(int argc, char** argv)&
&&& char** ptr_arr[ARRAY_SIZE];&
&&& for( i = 0; i & ARRAY_SIZE; i&#43;&#43;)&
&&&&&&&&&&& ptr_arr[i] = malloc(i * 1024);&&
&&&&&&&&&&& if ( i & 128)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //glibc默认128k以上使用mmap&
&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&& heap_malloc_total &#43;=&
&&&&&&&&&&& }&
&&&&&&&&&&& else&
&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&& mmap_total &#43;=&
&&&&&&&&&&&&&&&&&& mmap_count&#43;&#43;;&
&&&&&&&&&&& }&
&&& print_info();
&&& for( i = 0; i & ARRAY_SIZE; i&#43;&#43;)&
&&&&&&&&&& if ( i % 2 == 0)&
&&&&&&&&&&&&&&&&
&&&&&&&&&& free(ptr_arr[i]);
&&&&&&&&&& if ( i & 128)&
&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&& heap_free_total &#43;=&
&&&&&&&&&& }&
&&&&&&&&&& else&
&&&&&&&&&& {&
&&&&&&&&&&&&&&&&& mmap_total -=&
&&&&&&&&&&&&&&&&& mmap_count--;&
&&&&&&&&&& }&
&&& printf(&\nafter free\n&);&
&&& print_info();
&&& return 1;&
该例子第一个循环为指针数组每个成员分配索引位置 (KB) 大小的内存块,并通过 128 为分界分别对 heap 和 mmap 内存分配情况进行计数;&
第二个循环是 free 索引下标为奇数的项,同时更新计数情况。通过程序的计数与mallinfo/malloc_stats 接口得到结果进行对比,并通过 print_info打印到终端。
下面是一个执行结果:&
count by itself:&
&&&&&&& heap_malloc_total=8323072 heap_free_total=0 heap_in_use=8323072&
&&&&&&& mmap_total= mmap_count=72&
count by mallinfo:&
&&&&&&& heap_malloc_total=8327168 heap_free_total=2032 heap_in_use=8325136&
&&&&&&& mmap_total= mmap_count=72
from malloc_stats:&
system bytes&&&& =&&& 8327168&
in use bytes&&&& =&&& 8325136&
Total (incl. mmap):&
system bytes&&&& =&& &
in use bytes&&&& =&& &
max mmap regions =&&&&&&&& 72&
max mmap bytes&& =&&
after free&
count by itself:&
&&&&&&& heap_malloc_total=8323072 heap_free_total=4194304 heap_in_use=4128768&
&&&&&&& mmap_total=6008832 mmap_count=36
count by mallinfo:&
&&&&&&& heap_malloc_total=8327168 heap_free_total=4197360 heap_in_use=4129808&
&&&&&&& mmap_total=6119424 mmap_count=36
from malloc_stats:&
system bytes&&&& =&&& 8327168&
in use bytes&&&& =&&& 4129808&
Total (incl. mmap):&
system bytes&&&& =&& &
in use bytes&&&& =&& &
max mmap regions =&&&&&&&& 72&
max mmap bytes&& =&&
由上可知,程序统计和mallinfo 得到的信息基本吻合,其中 heap_free_total 表示堆内已释放的内存碎片总和。&
如果想知道堆内究竟有多少碎片,可通过 mallinfo 结构中的 fsmblks 、smblks 、ordblks &#20540;得到,这些&#20540;表示不同大小区间的碎片总个数,这些区间分别是 0~80 字节,80~512 字节,512~128k。如果 fsmblks 、 smblks 的&#20540;过大,那碎片问题可能比较严重了。&
不过,&mallinfo 结构有一个很致命的问题,就是其成员定义全部都是 int ,在 64 位环境中,其结构中的 uordblks/fordblks/arena/usmblks 很容易就会导致溢出,应该是历史遗留问题,使用时要注意!
四、既然堆内内存brk和sbrk不能直接释放,为什么不全部使用 mmap 来分配,munmap直接释放呢?&
既然堆内碎片不能直接释放,导致疑&#20284;“内存泄露”问题,为什么 malloc 不全部使用 mmap 来实现呢(mmap分配的内存可以会通过 munmap 进行 free ,实现真正释放)?而是仅仅对于大于 128k 的大块内存才使用 mmap ?
其实,进程向 OS 申请和释放地址空间的接口 sbrk/mmap/munmap 都是系统调用,频繁调用系统调用都比较消耗系统资源的。并且, mmap 申请的内存被 munmap 后,重新申请会产生更多的缺页中断。例如使用 mmap 分配 1M 空间,第一次调用产生了大量缺页中断 (1M/4K 次 ) ,当munmap 后再次分配 1M 空间,会再次产生大量缺页中断。缺页中断是内核行为,会导致内核态CPU消耗较大。另外,如果使用
mmap 分配小内存,会导致地址空间的分片更多,内核的管理负担更大。&
同时堆是一个连续空间,并且堆内碎片由于没有归还 OS ,如果可重用碎片,再次访问该内存很可能不需产生任何系统调用和缺页中断,这将大大降低 CPU 的消耗。 因此, glibc 的 malloc 实现中,充分考虑了 sbrk 和 mmap 行为上的差异及优缺点,默认分配大块内存 (128k) 才使用 mmap 获得地址空间,也可通过 mallopt(M_MMAP_THRESHOLD, &SIZE&) 来修改这个临界&#20540;。
五、如何查看进程的缺页中断信息?&
可通过以下命令查看缺页中断信息&
ps -o majflt,minflt -C &program_name&&
ps -o majflt,minflt -p &pid&&
其中:: majflt 代表 major fault ,指大错误;
&&&&&&&&&& minflt 代表 minor fault ,指小错误。
这两个数&#20540;表示一个进程自启动以来所发生的缺页中断的次数。&
其中 majflt 与 minflt 的不同是::
&&&&&&& majflt 表示需要读写磁盘,可能是内存对应页面在磁盘中需要load 到物理内存中,也可能是此时物理内存不足,需要淘汰部分物理页面至磁盘中。
六、除了 glibc 的 malloc/free ,还有其他第三方实现吗?
其实,很多人开始诟病 glibc 内存管理的实现,特别是高并发性能低下和内存碎片化问题都比较严重,因此,陆续出现一些第三方工具来替换 glibc 的实现,最著名的当属 google 的tcmalloc和facebook 的jemalloc 。&
网上有很多资源,可以自己查(只用使用第三方库,代码不用修改,就可以使用第三方库中的malloc)。
参考资料:&
《深入理解计算机系统》第 10 章&
http://www.man7.org/linux/man-pages/man3/mallinfo.3.html
原文地址:
测试程序代码
#include &malloc.h&
#include &string.h&
#include &stdlib.h&
#include &iostream&
static void
display_mallinfo(void)
mi = mallinfo();
printf(&Total non-mmapped bytes (arena):
%d\n&, mi.arena);
printf(&# of free chunks (ordblks):
%d\n&, mi.ordblks);
printf(&# of free fastbin blocks (smblks):
%d\n&, mi.smblks);
printf(&# of mapped regions (hblks):
%d\n&, mi.hblks);
printf(&Bytes in mapped regions (hblkhd):
%d\n&, mi.hblkhd);
printf(&Max. total allocated space (usmblks):
%d\n&, mi.usmblks);
printf(&Free bytes held in fastbins (fsmblks): %d\n&, mi.fsmblks);
printf(&Total allocated space (uordblks):
%d\n&, mi.uordblks);
printf(&Total free space (fordblks):
%d\n&, mi.fordblks);
printf(&Topmost releasable block (keepcost):
%d\n&, mi.keepcost);
main(int argc, char *argv[])
#define MAX_ALLOCS 2000000
char *alloc[MAX_ALLOCS];
int numBlocks, j, freeBegin, freeEnd, freeS
size_t blockS
if (argc & 3 || strcmp(argv[1], &--help&) == 0)
printf(&%s num-blocks block-size [free-step [start-free &
&[end-free]]]\n&, argv[0]);
numBlocks = atoi(argv[1]);
blockSize = atoi(argv[2]);
freeStep = (argc & 3) ? atoi(argv[3]) : 1;
freeBegin = (argc & 4) ? atoi(argv[4]) : 0;
freeEnd = (argc & 5) ? atoi(argv[5]) : numB
printf(&============== Before allocating blocks ==============\n&);
display_mallinfo();
for (j = 0; j & numB j&#43;&#43;) {
if (numBlocks &= MAX_ALLOCS)
std::cout&&&Too many allocations&&&std::
alloc[j] = (char *)malloc(blockSize);
if (alloc[j] == NULL)
std::cout&&&malloc&&&std::
printf(&\n============== After allocating blocks ==============\n&);
display_mallinfo();
for (j = freeB j & freeE j &#43;= freeStep)
free(alloc[j]);
printf(&\n============== After freeing blocks ==============\n&);
display_mallinfo();
exit(EXIT_SUCCESS);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:76830次
积分:1267
积分:1267
排名:千里之外
原创:29篇
转载:149篇
(4)(6)(7)(11)(7)(4)(6)(3)(17)(16)(16)(7)(13)(2)(2)(5)(2)(8)(5)(6)(2)(3)(2)(7)(2)(1)(3)(6)(2)(1)(2)(1)&p&其实「神逻辑」大多数都可以归咎于一些基础的&b&逻辑谬误(Logic Fallacy)&/b&和&b&错误认知(Incorrect Perception)&/b&上,我真诚地认为,如果人人都对这些基础的逻辑谬误和错误认知有所了解的话,那么互联网上无谓的争吵就会少很多。&/p&&p&我来给大家梳理一下,还加上&b&僵化思考(Rigid Thinking)&/b&这种问题,所以分成三类:&/p&&ul&&li&&b&逻辑谬误(Logic Fallacy)&/b&&/li&&li&&b&错误认知(Incorrect Perception)&/b&&/li&&li&&b&僵化思考(Rigid Thinking)&/b&&/li&&/ul&&h2&首先来说说常见的逻辑谬误:&/h2&&p&&b&1. 稻草人争论(Straw Man Argument)&/b&&/p&&p&稻草人争论简单来说就是自己树了假的靶子来打,夸张对方的观点,使其显得极端而荒谬。&/p&&p&举个例子,比如 A 和 B 对话,&/p&&p&A :虽然你是个穆斯林,我觉得你不应该反对我在寝室吃土耳其烤肉饭。&/p&&p&B:你的意思是要坚持破坏民族团结,挑起民族之间争端吗?&/p&&p&A:……&/p&&p&&b&2. 滑坡谬误(Slippery Slope)&/b&&/p&&p&这个大家比较熟悉,是指不合理的使用一连串因果关系将可能性转化为必然性,以达到某种意淫的结论。&/p&&p&举个例子,比如 A 和 B 对话,&/p&&p&A:同性之间恋爱不是错。&/p&&p&B:如果同性之间可以恋爱,那以后人和动物之间,人和物品之间的恋爱是不是都应该被许可了?&/p&&p&A:……&/p&&p&&b&3. 「不是真正的苏格兰人」(No True Scotsman)&/b&&/p&&p&这个谬误来源于洗地常用的「不是真正的……」句式,意思就是改变或限定范围以重新定义,以适应辩论者的需要。&/p&&p&举个例子,比如 A 和 B 对话,&/p&&p&A:MSL 中有恐怖分子&/p&&p&B:那不是真正的 MSL,真正的 MSL 是爱好和平的&/p&&p&A:……&/p&&p&&b&4. 论证负担(Burden of Proof)&/b&&/p&&p&简单来说就是「谁反对谁举证」,是「谁主张谁举证」的对立,通过增加对方的论证负担,提高己方论点的可信度。&/p&&p&举个例子,比如 A 和 B 对话,&/p&&p&A:知乎是个黄网&/p&&p&B:知乎是一个学习知识、五讲四美、都是中产阶级的网站&/p&&p&A:你证明一下知乎不是黄网!(隐含意思:你证明不了,那么就默认知乎是黄网)&/p&&h2&再来看看常见的认知错误:&/h2&&p&&b&1. 对比有误(Measure by contrast)&/b&&/p&&p&比如,一件物品的挂牌价是1000块,打折后500块,真实价值100块,你可能觉得买这个省了很多钱。但实际上你真正应该对比的是他的真实价值。&/p&&p&这就是我们在双11以及各种促销活动上当的原因。&/p&&p&&b&2. 赌徒谬误(Gambler's Fallacy)&/b&&/p&&p&赌徒谬误指的是以为看似有因果的事情,其实是随机发生的。错误地以为过去发生过,就会提高未来发生的概率。&/p&&p&比如,买过去中过奖的彩票号码,并不能提高你下一次中奖的概率。&/p&&p&&b&3.人们偏爱简单的道理(Tendency to prefer simplicity)&/b&&/p&&p&其实生活中这种问题太多了,举个例子,比如说「好吃不过饺子」,比饺子好吃的多了去了,但是这句话还是时而被当做论据。再比如「姜还是老的辣」、「不听老人言,吃亏在眼前」、「成功人士不上知乎」,这些论断,都是有漏洞的,但是它朗朗上口的,并且日常生活能够容忍这种论断的误差,所以就有些人就会认为它是站得住脚的了。&/p&&h2&最后再说说僵化思维:&/h2&&p&&b&1. 刻板印象(Stereotype)&/b&&/p&&p&这个大家都懂,外国人对中国人的刻板印象是书呆子、长辫、马褂、小眼睛、瘦弱,中国人对墨西哥的刻板印象是毒品、对泰国是人妖、对沙特是原谅色原谅色、对加勒比是海盗,你说这些印象真的站得住脚吗,肯定站不住。&/p&&p&但是表达刻板印象在单一群体里容易引起认同,进一步强化了刻板印象,导致这么一个显而易见的错误,在单一群体里就是能反反复复的犯错(当然,这有其他原因,涉及到其他学科的问题,与纯逻辑无关,就不提了)。&/p&&p&&b&2.图示思维(Schema)&/b&&/p&&p&图示思维指的是我们对外部世界的新知识内化为自己的知识单元后,就会一直受此影响,很难跳出来的情况。&/p&&p&比如,你第一次去高档餐厅,看到别人都是用手抓饭吃,去了七八次以后,还是一直看到所有人都用手抓饭吃,这时候你可能就认为——在高档餐厅,用手吃才正常,用刀叉反而是 Low 了。&/p&&p&这时候,你就形成了一个「图示」——在一个场景,该如何 behave 的画面。&/p&&p&那么你下一次再去高档餐厅,那就会自动开始用手抓饭吃,即使周围空无一人。&/p&&p&而且有人跟你说这样很傻的时候,你还会觉得他贼踏马 Low,估计高级餐厅都没去过。&/p&&p&&/p&
其实「神逻辑」大多数都可以归咎于一些基础的逻辑谬误(Logic Fallacy)和错误认知(Incorrect Perception)上,我真诚地认为,如果人人都对这些基础的逻辑谬误和错误认知有所了解的话,那么互联网上无谓的争吵就会少很多。我来给大家梳理一下,还加上僵化…
正好写了一篇实现文章:&br&&br&&b&校园网无路由器无显示器情况下使用树莓派&/b&&br&&br&&img src=&/b60de72abbead_b.png& data-rawwidth=&688& data-rawheight=&361& class=&origin_image zh-lightbox-thumb& width=&688& data-original=&/b60de72abbead_r.png&&&br&如标题所言,我们的处境很艰难。&br&&br&想玩树莓派,但是没有额外的显示器。&br&还是在校园网的环境下,无法通过路由器查看树莓派IP地址。&br&&br&## **解决方案**&br&&br&不过办法总比困难多。&br&&br&我们可以使用[SSH](&a href=&///?target=https%3A//zh.wikipedia.org/wiki/Secure_Shell& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&zh.wikipedia.org/wiki/S&/span&&span class=&invisible&&ecure_Shell&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)登录之后,再使用[VNC](&a href=&///?target=https%3A//zh.wikipedia.org/wiki/VNC& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&zh.wikipedia.org/wiki/V&/span&&span class=&invisible&&NC&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)操纵树莓派。&br&&br&## **怎么获取IP地址?**&br&&br&想要通过SSH登录,你需要知道树莓派的IP地址。&br&树莓派默认是开启[DHCP](&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%258A%25A8%25E6%E4%25B8%25BB%25E6%259C%25BA%25E8%25AE%25BE%25E7%25BD%25AE%25E5%258D%258F%25E8%25AE%25AE& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&zh.wikipedia.org/wiki/%&/span&&span class=&invisible&&E5%8A%A8%E6%80%81%E4%B8%BB%E6%9C%BA%E8%AE%BE%E7%BD%AE%E5%8D%8F%E8%AE%AE&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)的,也就是说它会自动分配动态地址。&br&&br&如果你有路由器,那么很简单,登录路由器配置网址即可。但是,有时候学校没有办法用路由器。&br&&br&假设你的电脑可以连上无线网络。&br&&br&### 第一步:查找&br&运行命令,输入&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&arp -a
&/code&&/pre&&/div&&br&&br&将网线一端连接树莓派,另一端连接电脑。&br&&br&再次输入&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&arp -a
&/code&&/pre&&/div&&br&&br&对比两次结果,多出来IP地址的即是树莓派的IP地址。&br&&br&&br&&img src=&/8bedf94f2e_b.jpg& data-rawwidth=&919& data-rawheight=&748& class=&origin_image zh-lightbox-thumb& width=&919& data-original=&/8bedf94f2e_r.jpg&&&br&&br&###第二步:连接&br&&br&打开Putty(可在网络上下载,该软件开源)。&br&&br&输入刚才的IP地址,可以将其Save,方便下次使用。&br&回车连接。&br&&br&&br&&br&&img src=&/c5fa0add0a5c9ae08746_b.jpg& data-rawwidth=&964& data-rawheight=&686& class=&origin_image zh-lightbox-thumb& width=&964& data-original=&/c5fa0add0a5c9ae08746_r.jpg&&&br&连接成功之后,输入用户名,默认为pi,回车。&br&再输入密码,默认为raspberry,回车。&br&即登录成功。&br&&br&&img src=&/e1b863bbbce6ba8ad2a6e16413dbf5b0_b.jpg& data-rawwidth=&661& data-rawheight=&418& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&/e1b863bbbce6ba8ad2a6e16413dbf5b0_r.jpg&&&br&&br&## 怎么进行VNC连接?&br&&br&### 第一步 网络共享&br&&br&将电脑网络共享给树莓派。&br&进入设置,搜索更改适配器设置,进入。&br&选择无线网连接,右击属性,点击共享Tab,勾选“运行其他网络用户通过此计算机的Internet连接来连接”,点击确定。&br&&br&### 第二步 安装VNC Server&br&在树莓派上安装VNC Server:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&sudo apt-get install tightvncserver
&/code&&/pre&&/div&&br&&br&&br&&img src=&/efdfe34ffedcad79e2338b_b.jpg& data-rawwidth=&661& data-rawheight=&418& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&/efdfe34ffedcad79e2338b_r.jpg&&&br&&br&安装成功之后设置两次密码。我已经安装过了,所以没有输入。&br&&br&启动树莓派VNC Server&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&vncserver :1 -geometry 800x600
&/code&&/pre&&/div&&br&&br&vncserver 和 :1之间有空格,不然就会像我 下面那样。&br&&br&&br&&img src=&/e7cd55f7ea27cd6695464_b.jpg& data-rawwidth=&661& data-rawheight=&418& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&/e7cd55f7ea27cd6695464_r.jpg&&&br&&br&Tips:&br&&br&如果VNC Server密码忘了怎么办?&br&输入&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&vncpasswd
&/code&&/pre&&/div&&br&&br&来进行重置:&br&&br&(请忽略我之前的错误尝试)&br&&br&&br&&img src=&/72fe6f57fdec52c500fccf2ebbca97d5_b.jpg& data-rawwidth=&661& data-rawheight=&418& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&/72fe6f57fdec52c500fccf2ebbca97d5_r.jpg&&&br&&br&### 第三步 启动VNC Viwer&br&&br&如果你电脑没有安装VNC Viewer需要先安装,[下载地址](&a href=&///?target=http%3A//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RealVNC(R) remote access & control software for desktop and mobile&i class=&icon-external&&&/i&&/a&)。&br&&br&输入树莓派IP加设置vnc server时的对于号(比如刚才是:1)&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&192.168.2.2:1
&/code&&/pre&&/div&&br&&br&点击Connect,输入vncserver密码。&br&&br&OK,大功告成。&br&&br&&br&&br&&img src=&/c4d1c7a576f4b4ec72930bc_b.jpg& data-rawwidth=&802& data-rawheight=&632& class=&origin_image zh-lightbox-thumb& width=&802& data-original=&/c4d1c7a576f4b4ec72930bc_r.jpg&&&br&&br&&img src=&/3dc0de1c470ed9c20eed2a3_b.jpg& data-rawwidth=&802& data-rawheight=&632& class=&origin_image zh-lightbox-thumb& width=&802& data-original=&/3dc0de1c470ed9c20eed2a3_r.jpg&&&br&## 进阶 如何自动开启VNC Server?&br&&br&原理是写一个脚本,在root时自动执行。&br&&br&在终端中登录:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&& sudo su
&/code&&/pre&&/div&&br&&br&进入目录:/etc/init.d/:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&cd ./etc/init.d/
&/code&&/pre&&/div&&br&&br&在此目录下新建一个文件:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&
#! /bin/sh
# /etc/init.d/vncboot
### BEGIN INIT INFO
# Provides: vncboot
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
HOME=/home/pi
export USER HOME
case &$1& in
echo &Starting VNC Server&
#Insert your favoured settings for a VNC session
su - $USER -c &/usr/bin/vncserver :1 -geometry 100x800 &
echo &Stopping VNC Server&
/usr/bin/vncserver -kill :1
echo &Usage: /etc/init.d/vncboot {start|stop}&
&/code&&/pre&&/div&&br&保存。&br&&br&使该文件可执行:&br&&br&
chmod 755 filename&br&&br&最后:&br&&br&&br&&div class=&highlight&&&pre&&code class=&language-python3&&&span class=&n&&update&/span&&span class=&o&&-&/span&&span class=&n&&rc&/span&&span class=&o&&.&/span&&span class=&n&&d&/span& &span class=&o&&-&/span&&span class=&n&&f&/span& &span class=&n&&lightdm&/span& &span class=&n&&remove&/span&
&span class=&n&&update&/span&&span class=&o&&-&/span&&span class=&n&&rc&/span&&span class=&o&&.&/span&&span class=&n&&d&/span& &span class=&n&&vncboot&/span& &span class=&n&&defaults&/span&
&/code&&/pre&&/div&&br&返回:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&update-rc.d: using dependency based boot sequencing
&/code&&/pre&&/div&&br&&br&说明成功了。&br&&br&重启你的树莓派,VNC Server就会自动运行了。&br&&br&愉快的开始玩吧。&br&&br&&br&&blockquote&作者「AzureYu&a href=&///?target=http%3A///-connectRaspberryPi& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&校园网无路由器无显示器情况下使用树莓派&i class=&icon-external&&&/i&&/a&」&br&文章声明:自由转载-非商用-非衍生-保持署名 | BY-NC-SA&/blockquote&
正好写了一篇实现文章: 校园网无路由器无显示器情况下使用树莓派 如标题所言,我们的处境很艰难。 想玩树莓派,但是没有额外的显示器。 还是在校园网的环境下,无法通过路由器查看树莓派IP地址。 ## **解决方案** 不过办法总比困难多。 我们可以使用[SSH](…
&p&&/p&&p&&b&1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素?&/b&&/p&&blockquote&行内元素:和有他元素都在一行上,高度、行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他行内元素;其中img是行元素&br&块级元素:总是在新行上开始,高度、行高及外边距和内边距都可控制,可以容纳内敛元素和其他元素;&br&行元素转换为块级元素方式:display:block;&/blockquote&&p&&br&&/p&&p&&b&2.将多个元素设置为同一行?清除浮动有几种方式?&/b&&/p&&blockquote&将多个元素设置为同一行:float,inline-block&br&清除浮动的方式:方法一:添加新的元素 、应用 clear:both;&br& 方法二:父级div定义 overflow: hidden;&br&方法三:利用:after和:before来在元素内部插入两个元素块,从面达到清除浮动的效果。&br&.clear{zoom:1;}&br&.clear:after{content:””;clear:display:height:0;overflow:visibility:}&/blockquote&&p&&br&&/p&&p&&b&3.怪异盒模型box-sizing?弹性盒模型|盒布局?&/b&&/p&&blockquote&在标准模式下的盒模型:盒子总宽度/高度=width/height+padding+border+margin&br&在怪异模式下的盒模型下,盒子的总宽度和高度是包含内边距padding和边框border宽度在内的,盒子总宽度/高度=width/height + margin = 内容区宽度/高度 + padding + border +&br&box-sizing有两个值一个是content-box,另一个是border-box。&br&当设置为box-sizing:content-box时,将采用标准模式解析计算;&br&当设置为box-sizing:border-box时,将采用怪异模式解析计算。&/blockquote&&p&&br&&/p&&p&&b&4.简述几个css hack?&/b&&/p&&blockquote&(1) 图片间隙 &br&在div中插入图片,图片会将div下方撑大3px。hack1:将&div&与&img&写在同一行。hack2:给&img&添加display:block;&br&dt
li 中的图片间隙。hack:给&img&添加display:block;&br&(2) 默认高度,IE6以下版本中,部分块元素,拥有默认高度(低于18px)&br&hack1:给元素添加:font-size:0;&br&hack2:声明:overflow:hidden;&br&表单行高不一致&br&hack1:给表单添加声明:float:left;height: ;border: 0;&br&鼠标指针&br&hack:若统一某一元素鼠标指针为手型:cursor:pointer;&br&当li内的a转化块元素时,给a设置float,IE里面会出现阶梯状&br&hack1:给a加display:inline-block;&br&hack2:给li加float:left;&/blockquote&&p&&br&&/p&&p&&b&5.href和src区别? title和alt&/b&&/p&&blockquote&href (Hypertext Reference)指定网络资源的位置(超文本引用),从而在当前元素或者当前文档和由当前属性定义的需要的锚点或资源之间定义一个链接或者关系,在 link和a 等元素上使用。&br&src (Source)属性仅仅嵌入当前资源到当前文档元素定义的位置,是页面必不可少的一部分,是引入。在 img、script、iframe 等元素上使用。&br&title:既是html标签,又是html属性,title作为属性时,用来为元素提供额外说明信息.&br&alt:alt是html标签的属性,alt属性则是用来指定替换文字,只能用在img、area和input元素中(包括applet元素),用于网页中图片无法正常显示时给用户提供文字说明使其了解图像信息.&/blockquote&&p&&br&&/p&&p&&b&6.transform?animation?区别?animation-duration&/b&&/p&&blockquote&Transform:它和width、left一样,定义了元素很多静态样式实现变形、旋转、缩放、移位及透视等功能,通过一系列功能的组合我们可以实现很炫酷的静态效果(非动画)。 &br&Animation:作用于元素本身而不是样式属性,属于关键帧动画的范畴,它本身被用来替代一些纯粹表现的javascript代码而实现动画,可以通过keyframe显式控制当前帧的属性值.&br&animation-duration:规定完成动画所花费的时间,以秒或毫秒计。&/blockquote&&p&&br&&/p&&p&&b&7.nth-of-type | nth-child? &/b&&/p&&blockquote&举例说明: &br&&ul& &p&111&/p& &span&222&/span& &li&1&/li& &li&2&/li& &li&3&/li& &/ul& &br&li:nth-of-type(2):表示ul下的第二个li元素
&br&li:nth-child(2):表示既是li元素又是在ul下的第二个元素(找不到)。 &br&建议一般使用nth-of-type,不容易出问题。 &/blockquote&&p&&br&&/p&&p&&b&8. :before 和 ::before 区别? &/b&&/p&&blockquote&单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素。 对于CSS2之前已有的伪元素,比如:before,单冒号和双冒号的写法::before作用是一样的。 &/blockquote&&p&&br&&/p&&p&&b&9.如何让一个div 上下左右居中? &/b&&/p&&p&答:有三种方法。 &/p&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&err&&方法&/span&&span class=&nt&&1&/span&&span class=&err&&:&/span& &span class=&nc&&.div1&/span&&span class=&p&&{&/span& &span class=&nb&&width&/span&&span class=&o&&:&/span&&span class=&m&&400px&/span&&span class=&p&&;&/span&
&span class=&nb&&height&/span&&span class=&o&&:&/span&&span class=&m&&400px&/span&&span class=&p&&;&/span&
&span class=&nb&&border&/span&&span class=&o&&:&/span&&span class=&m&&#CCC&/span& &span class=&m&&1px&/span& &span class=&nb&&solid&/span&&span class=&p&&;&/span&
&span class=&nb&&background&/span&&span class=&o&&:&/span&&span class=&m&&#99f&/span&&span class=&p&&;&/span&
&span class=&nb&&position&/span&&span class=&o&&:&/span&&span class=&nb&&absolute&/span&&span class=&p&&;&/span&
&span class=&nb&&left&/span&&span class=&o&&:&/span&&span class=&m&&50%&/span&&span class=&p&&;&/span&
&span class=&nb&&top&/span&&span class=&o&&:&/span&&span class=&m&&50%&/span&&span class=&p&&;&/span&
&span class=&n&&transform&/span&&span class=&o&&:&/span& &span class=&n&&translate&/span&&span class=&p&&(&/span&&span class=&m&&-50%&/span&&span class=&o&&,-&/span&&span class=&m&&50%&/span&&span class=&p&&);&/span& &span class=&p&&}&/span&
&span class=&o&&&&/span&&span class=&nt&&div&/span& &span class=&nt&&class&/span&&span class=&o&&=&/span&&span class=&s2&&&div1&&/span&&span class=&o&&&&/&/span&&span class=&nt&&div&/span&&span class=&o&&&&/span&
&span class=&err&&方法&/span&&span class=&nt&&2&/span&&span class=&err&&:&/span& &span class=&nc&&.div2&/span&&span class=&p&&{&/span& &span class=&nb&&width&/span&&span class=&o&&:&/span&&span class=&m&&400px&/span&&span class=&p&&;&/span&
&span class=&nb&&height&/span&&span class=&o&&:&/span&&span class=&m&&400px&/span&&span class=&p&&;&/span&
&span class=&nb&&border&/span&&span class=&o&&:&/span&&span class=&m&&#CCC&/span& &span class=&m&&1px&/span& &span class=&nb&&solid&/span&&span class=&p&&;&/span&
&span class=&nb&&background&/span&&span class=&o&&:&/span&&span class=&m&&#99f&/span&&span class=&p&&;&/span&
&span class=&nb&&position&/span&&span class=&o&&:&/span& &span class=&nb&&absolute&/span&&span class=&p&&;&/span&
&span class=&nb&&left&/span&&span class=&o&&:&/span&&span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&nb&&top&/span&&span class=&o&&:&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&nb&&bottom&/span&&span class=&o&&:&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&nb&&right&/span&&span class=&o&&:&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&nb&&margin&/span&&span class=&o&&:&/span& &span class=&nb&&auto&/span&&span class=&p&&;&/span& &span class=&p&&}&/span&
&span class=&o&&&&/span&&span class=&nt&&div&/span& &span class=&nt&&class&/span&&span class=&o&&=&/span&&span class=&s2&&&div2&&/span&&span class=&o&&&&/&/span&&span class=&nt&&div&/span&&span class=&o&&&&/span&
&span class=&err&&方法&/span&&span class=&nt&&3&/span&&span class=&err&&:&/span& &span class=&nc&&.div3&/span&&span class=&p&&{&/span& &span class=&nb&&width&/span&&span class=&o&&:&/span&&span class=&m&&400px&/span&&span class=&p&&;&/span&
&span class=&nb&&height&/span&&span class=&o&&:&/span&&span class=&m&&400px&/span&&span class=&p&&;&/span&
&span class=&nb&&border&/span&&span class=&o&&:&/span&&span class=&m&&#CCC&/span& &span class=&m&&1px&/span& &span class=&nb&&solid&/span&&span class=&p&&;&/span&
&span class=&nb&&background&/span&&span class=&o&&:&/span&&span class=&m&&#9f9&/span&&span class=&p&&;&/span&
&span class=&nb&&position&/span&&span class=&o&&:&/span& &span class=&nb&&absolute&/span&&span class=&p&&;&/span&
&span class=&nb&&left&/span&&span class=&o&&:&/span& &span class=&m&&50%&/span&&span class=&p&&;&/span&
&span class=&nb&&top&/span&&span class=&o&&:&/span&&span class=&m&&50%&/span&&span class=&p&&;&/span&
&span class=&nb&&margin-left&/span&&span class=&o&&:-&/span&&span class=&m&&200px&/span&&span class=&p&&;&/span&
&span class=&nb&&margin-top&/span&&span class=&o&&:&/span& &span class=&m&&-200px&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&o&&&&/span&&span class=&nt&&div&/span& &span class=&nt&&class&/span&&span class=&o&&=&/span&&span class=&s2&&&div3&&/span&&span class=&o&&&&/&/span&&span class=&nt&&div&/span&&span class=&o&&&&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&&b&10.css2.0 和css3.0 &/b&&/p&&blockquote&答:css3加强了css2的功能,增加了新的属性和新的标签,并且删除了一些冗余的标签,在布局方面减少了代码量。以前比较复杂的布局现在一个属性就搞定了(columns之类的属性)。在效果方面加入了更多的效果(圆角,动画之类的),还有在盒子模型和列表模块都进行了改进。不过CSS3兼容性不好,只有一些高级版本的浏览器支持。 &/blockquote&&p&&br&&/p&&p&&b&11.弹性盒子模型?flex|box区别?&/b&&/p&&blockquote&(1) 引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的条目进行排列、对齐和分配空白空间。&br&&br&即便容器中条目的尺寸未知或是动态变化的,弹性盒布局模型也能正常的工作。在该布局模型中,容器会根据布局的需要,调整其中包含的条目的尺寸和顺序来最好地填充所有可用的空间。&br&&br&当容器的尺寸由于屏幕大小或窗口尺寸发生变化时,其中包含的条目也会被动态地调整。比如当容器尺寸变大时,其中包含的条目会被拉伸以占满多余的空白空间;当容器尺寸变小时,条目会被缩小以防止超出容器的范围。弹性盒布局是与方向无关的。&br&&br&在传统的布局方式中,block 布局是把块在垂直方向从上到下依次排列的;&br&而 inline 布局则是在水平方向来排列。弹性盒布局并没有这样内在的方向限制,可以由开发人员自由操作。 &br&&br&(2) flex和box的区别: display:box 是老规范,要兼顾古董机子就加上它; 父级元素有display:属性之后。他的子元素里面加上box-flex属性。可以让子元素按照父元素的宽度进行一定比例的分占空间。 flex是最新的,董机老机子不支持的;&br&&br&父元素设置display:flex后,子元素宽度会随父元素宽度的改变而改变,而display:box不会。 Android UC浏览器只支持display: box语法;而iOS UC浏览器则支持两种方式。&/blockquote&&p&&br&&/p&&p&&b&12.viewport 所有属性 ?&/b&&/p&&blockquote&(1)width :设置layout viewport的宽度,为一个正整数,或字符串'device-width';&br&(2)initial-scale:设置页面的初始缩放值,为一个数字,可以带小数。&br&(3)minimum-scale:允许用户的最小缩放值,为一个数字,可以带小数。&br&(4)maximum-scale:允许用户的最大缩放值,为一个数字,可以带小数。&br&(5)height:设置layout viewport的高度,这个属性对我们并不重要,很少使用&br&(6)user-scalable:是否允许用户进行缩放,值为‘no’或者‘yes’。&br&安卓中还支持:target-densitydpi,表示目标设备的密度等级,作用是决定css中的1px
代表多少物理像素&br&(7)target-densitydpi:值可以为一个数值或者 high-dpi 、 medium-dpi、 low-dpi、 device-dpi 这几个字符串中的一个&/blockquote&&p&&br&&/p&&p&&b&13.如何理解HTML结构的语义化?&/b&&/p&&blockquote&所谓标签语义化,就是指标签的含义。语义化的主要目的就是让大家直观的认识标签(markup)和属性(attribute)的用途和作用,对搜索引擎友好,有了良好的结构和语义我们的网页内容便自然容易被搜索引擎抓取,这种符合搜索引擎收索规则的做法,网站的推广便可以省下不少的功夫,而且可维护性更高,因为结构清晰,十分易于阅读。这也是搜索引擎优化SEO重要的一步。&/blockquote&&p&&br&&/p&&p&&b&14.伪类选择器和伪元素?c3中引入的伪类选择器有?c3中伪元素有?&/b&&/p&&blockquote&伪类用一个冒号来表示,而伪元素则用两个冒号来表示。&br&&br&伪类选择器:&br&由于状态是动态变化的,所以一个元素达到一个特定状态时,它可能得到一个伪类的样式;当状态改变时,它又会失去这个样式。&br&&br&伪元素选择器:&br&并不是针对真正的元素使用的选择器,而是针对CSS中已经定义好的伪元素使用的选择器;&br&&br&c3中引入的伪类选择器:&br&:root()选择器,根选择器,匹配元素E所在文档的根元素。在HTML文档中,根元素始终是&html&。:root选择器等同于&html&元素。&br&&br&:not()选择器称为否定选择器,和jQuery中的:not选择器一模一样,可以选择除某个元素之外的所有元素。&br&&br&:empty()选择器表示的就是空。用来选择没有任何内容的元素,这里没有内容指的是一点内容都没有,哪怕是一个空格。&br&&br&:target()选择器来对页面某个target元素(该元素的id被当做页面中的超链接来使用)指定样式,该样式只在用户点击了页面中的超链接,并且跳转到target元素后起作用。&br&&br&:first-child()选择器表示的是选择父元素的第一个子元素的元素E。简单点理解就是选择元素中的第一个子元素,记住是子元素,而不是后代元素。&br&&br&:nth-child()选择某个元素的一个或多个特定的子元素。&br&&br&:nth-last-child()从某父元素的最后一个子元素开始计算,来选择特定的元素&br&&br&:nth-of-type(n)选择器和:nth-child(n)选择器非常类似,不同的是它只计算父元素中指定的某种类型的子元素。&br&&br&:only-child表示的是一个元素是它的父元素的唯一一个子元素。&br&&br&:first-line为某个元素的第一行文字使用样式。&br&&br&:first-letter 为某个元素中的文字的首字母或第一个字使用样式。&br&&br&:before
在某个元素之前插入一些内容。&br&&br&:after
在某个元素之后插入一些内容。 &br&&br&c3中伪元素:&br&::first-line选择元素的第一行,比如说改变每个段落的第一行文本的样式&br&::before和::after这两个主要用来给元素的前面或后面插入内容,这两个常用&content&配合使用,见过最多的就是清除浮动&br&::selection用来改变浏览网页选中文的默认效果&/blockquote&&p&&br&&/p&&p&&b&15.html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? &/b&&/p&&blockquote&* HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。
&br&* 拖拽释放(Drag and drop) API
语义化更好的内容标签(header,nav,footer,aside,article,section) 音频、视频API(audio,video) 画布(Canvas) API
地理(Geolocation) API
本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
&br&sessionStorage 的数据在浏览器关闭后自动删除
表单控件,calendar、date、time、email、url、search
新的技术webworker, websocket, Geolocation &br&* 移除的元素 纯表现的元素:basefont,big,center,font, s,strike,tt,u;
&br&对可用性产生负面影响的元素:frame,frameset,noframes;&br&支持HTML5新标签:
&br&* IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添加标签默认的样式:
&br&* 当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架 &!--[if lt IE 9]& &script&
src=&&a href=&/?target=http%3A///svn/trunk/html5.js& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&/svn/trunk/html5.js&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&&/script&
&![endif]--& &br&* 如何区分: DOCTYPE声明\新增的结构元素\功能元素&/blockquote&&p&&br&&/p&&p&&b&16.placeholder?如何在ie8上兼容placeholder这个效果&/b&&/p&&blockquote&方法一:&br&首先判断浏览器是否支持placeholder属性,如果不支持的话,就遍历所有input输入框,获取placeholder属性的值填充进输入框作为提示信息,同时字体设置成灰色。&br&&br&当输入框获得焦点( focus )同时输入框内文字等于设置的提示信息时,就把输入框内清空;&br&&br&当输入框失去焦点( blur )同时输入框内文字为空时,再把获取的placeholder属性的值填充&br&进输入框作为提示信息,同时字体设置成灰色;&br&&br&当输入框内有输入( keydown )时,此时输入框内的提示信息已经由focus事件清除,此时只需要把字体再恢复成黑色即可&br&&br&此方法的缺点是,不适用于加载完DOM时即获得焦点的输入框,因为在用户的角度,加载完页面时看到的获得焦点的那个输入框,它的提示文字是看不到的。&/blockquote&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&nx&&HTML&/span&&span class=&err&&:&/span&
&span class=&o&&&&/span&&span class=&nx&&input&/span& &span class=&nx&&type&/span&&span class=&o&&=&/span&&span class=&s2&&&text&&/span& &span class=&nx&&id&/span&&span class=&o&&=&/span&&span class=&s2&&&uname&&/span& &span class=&nx&&name&/span&&span class=&o&&=&/span&&span class=&s2&&&uname&&/span& &span class=&nx&&placeholder&/span&&span class=&o&&=&/span&&span class=&s2&&&请输入用户名&&/span&&span class=&o&&/&&/span&
&span class=&nx&&CSS&/span&&span class=&err&&:&/span&
&span class=&p&&.&/span&&span class=&nx&&phcolor&/span&&span class=&p&&{&/span& &span class=&nx&&color&/span&&span class=&o&&:&/span&&span class=&err&&#&/span&&span class=&mi&&999&/span&&span class=&p&&;}&/span&
&span class=&nx&&JS&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&c1&&//判断浏览器是否支持placeholder属性&/span&
&span class=&nx&&supportPlaceholder&/span&&span class=&o&&=&/span&&span class=&s1&&'placeholder'&/span&&span class=&k&&in&/span& &span class=&nb&&document&/span&&span class=&p&&.&/span&&span class=&nx&&createElement&/span&&span class=&p&&(&/span&&span class=&s1&&'input'&/span&&span class=&p&&),&/span&
&span class=&nx&&placeholder&/span&&span class=&o&&=&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&input&/span&&span class=&p&&){&/span&
&span class=&kd&&var&/span& &span class=&nx&&text&/span& &span class=&o&&=&/span& &span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&attr&/span&&span class=&p&&(&/span&&span class=&s1&&'placeholder'&/span&&span class=&p&&),&/span&
&span class=&nx&&defaultValue&/span& &span class=&o&&=&/span& &span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&defaultValue&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&nx&&defaultValue&/span&&span class=&p&&){&/span&
&span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&val&/span&&span class=&p&&(&/span&&span class=&nx&&text&/span&&span class=&p&&).&/span&&span class=&nx&&addClass&/span&&span class=&p&&(&/span&&span class=&s2&&&phcolor&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&focus&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&val&/span&&span class=&p&&()&/span& &span class=&o&&==&/span& &span class=&nx&&text&/span&&span class=&p&&){&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&).&/span&&span class=&nx&&val&/span&&span class=&p&&(&/span&&span class=&s2&&&&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&});&/span&
&span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&blur&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&val&/span&&span class=&p&&()&/span& &span class=&o&&==&/span& &span class=&s2&&&&&/span&&span class=&p&&){&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&).&/span&&span class=&nx&&val&/span&&span class=&p&&(&/span&&span class=&nx&&text&/span&&span class=&p&&).&/span&&span class=&nx&&addClass&/span&&span class=&p&&(&/span&&span class=&s2&&&phcolor&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&});&/span&
&span class=&c1&&//输入的字符不为灰色&/span&
&span class=&nx&&input&/span&&span class=&p&&.&/span&&span class=&nx&&keydown&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&).&/span&&span class=&nx&&removeClass&/span&&span class=&p&&(&/span&&span class=&s2&&&phcolor&&/span&&span class=&p&&);&/span&
&span class=&p&&});&/span&
&span class=&p&&};&/span&
&span class=&c1&&//当浏览器不支持placeholder属性时,调用placeholder函数&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&nx&&supportPlaceholder&/span&&span class=&p&&){&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s1&&'input'&/span&&span class=&p&&).&/span&&span class=&nx&&each&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&nx&&text&/span& &span class=&o&&=&/span& &span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&).&/span&&span class=&nx&&attr&/span&&span class=&p&&(&/span&&span class=&s2&&&placeholder&&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&).&/span&&span class=&nx&&attr&/span&&span class=&p&&(&/span&&span class=&s2&&&type&&/span&&span class=&p&&)&/span& &span class=&o&&==&/span& &span class=&s2&&&text&&/span&&span class=&p&&){&/span&
&span class=&nx&&placeholder&/span&&span class=&p&&(&/span&&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&span class=&p&&});&/span&
&span class=&p&&}&/span&
&span class=&p&&});&/span&
&/code&&/pre&&/div&&blockquote&方法二:&br&此方法的思路是做一张含有提示文字的图片作为input输入框的背景图,初始时获得焦点同时加载背景图;&br&当输入框不为空时,去掉背景图;&br&当输入框为空时,加载背景图;&br&当用户键盘按键且输入框不为空( 输入字符 )时,去掉背景图;&br&当用户键盘按键且输入框为空( 删除字符 )时,加载背景图。&br&此方法的缺点是:需要为每一个提示文字不同的input制作背景图片,并且设置input的样式。&/blockquote&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&nx&&CSS&/span&&span class=&err&&:&/span&
&span class=&p&&.&/span&&span class=&nx&&phbg&/span&&span class=&p&&{&/span& &span class=&nx&&background&/span&&span class=&o&&:&/span&&span class=&nx&&url&/span&&span class=&p&&(&/span&&span class=&nx&&img&/span&&span class=&o&&/&/span&&span class=&nx&&bg&/span&&span class=&p&&.&/span&&span class=&nx&&jpg&/span&&span class=&p&&)&/span& &span class=&mi&&0&/span& &span class=&mi&&0&/span& &span class=&nx&&no&/span&&span class=&o&&-&/span&&span class=&nx&&repeat&/span&&span class=&p&&;}&/span&
&span class=&nx&&JS&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&c1&&//判断浏览器是否支持placeholder属性&/span&
&span class=&nx&&supportPlaceholder&/span&&span class=&o&&=&/span&&span class=&s1&&'placeholder'&/span& &span class=&k&&in&/span& &span class=&nb&&document&/span&&span class=&p&&.&/span&&span class=&nx&&createElement&/span&&span class=&p&&(&/span&&span class=&s1&&'input'&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&nx&&supportPlaceholder&/span&&span class=&p&&){&/span&
&span class=&c1&&//初始状态添加背景图片&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&attr&/span&&span class=&p&&(&/span&&span class=&s2&&&class&&/span&&span class=&p&&,&/span&&span class=&s2&&&phbg&&/span&&span class=&p&&);&/span&
&span class=&c1&&//初始状态获得焦点&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&focus&/span&&span class=&p&&;&/span&
&span class=&kd&&function&/span& &span class=&nx&&destyle&/span&&span class=&p&&(){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&val&/span&&span class=&p&&()&/span& &span class=&o&&!=&/span& &span class=&s2&&&&&/span&&span class=&p&&){&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&removeClass&/span&&span class=&p&&(&/span&&span class=&s2&&&phbg&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span&&span class=&p&&{&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&attr&/span&&span class=&p&&(&/span&&span class=&s2&&&class&&/span&&span class=&p&&,&/span&&span class=&s2&&&phbg&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&c1&&//当输入框为空时,添加背景图片;有值时去掉背景图片&/span&
&span class=&nx&&destyle&/span&&span class=&p&&();&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&keyup&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&c1&&//当输入框有按键输入同时输入框不为空时,去掉背景图片;有按键输入同时为空时(删除字符),添加背景图片&/span&
&span class=&nx&&destyle&/span&&span class=&p&&();&/span&
&span class=&p&&});&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&keydown&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&
&span class=&c1&&//keydown事件可以在按键按下的第一时间去掉背景图片&/span&
&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&s2&&&#uname&&/span&&span class=&p&&).&/span&&span class=&nx&&removeClass&/span&&span class=&p&&(&/span&&span class=&s2&&&phbg&&/span&&span class=&p&&);&/span&
&span class=&p&&});&/span&
&span class=&p&&}&/span&
&span class=&p&&});&/span&
&/code&&/pre&&/div&&blockquote&方法三:&br&使用插件:Placeholders.js&/blockquote&&p&&br&&/p&&p&&b&17.常见兼容性问题?&/b&&/p&&blockquote&* png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.也可以引用一段脚本处理。&br&&br&* 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。&br&&br&* IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。&br&&br&* 浮动ie产生的双倍距离(IE6双边距问题:在IE6下,如果对元素设置了浮动,同时又设置了margin-left或margin-right,margin值会加倍。)
#box{ float: width:10 margin:0 0 0 100}
这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入 ——_display:将其转化为行内属性。(_这个符号只有ie6会识别)&br&&br&*
渐进识别的方式,从总体中逐渐排除局部。
首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。
接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。
&br&css// .bb{ background-color:#f1ee18; .background-color:#00deff\9;
+background-color:#a200
_background-color:#1e0bd1;
IE下,可以使用获取常规属性的方法来获取自定义属性,
也可以使用getAttribute()获取自定义属性;
Firefox下,只能使用getAttribute()获取自定义属性.
解决方法:统一通过getAttribute()获取自定义属性。&br&&br&* IE下,event对象有x,y属性,但是没有pageX,pageY属性;
Firefox下,event对象有pageX,pageY属性,但是没有x,y属性. * 解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。&br&&br&* Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示,
可通过加入 CSS 属性 -webkit-text-size-adjust: 解决。&br&&br&* 超链接访问过后hover样式就不出现了 被点击访问过的超链接样式不在具有hover和active了解决方法是改变CSS属性的排列顺序: L-V-H-A :
a:link {} a:visited {} a:hover {} a:active {}&br&&br&* 怪异模式问题:漏写DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中会触发怪异模式。为避免怪异模式给我们带来不必要的麻烦,最好养成书写DTD声明的好习惯。现在可以使用[html5](&a href=&/?target=http%3A//www.w3.org/TR/html5/single-page.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&w3.org/TR/html5/single-&/span&&span class=&invisible&&page.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)推荐的写法:`&doctype html&`&br&&br&* 上下margin重合问题&br&ie和ff都存在,相邻的两个div的margin-left和margin-right不会重合,但是margin-top和margin-bottom却会发生重合。&br&解决方法,养成良好的代码编写习惯,同时采用margin-top或者同时采用margin-bottom。&br&&br&* ie6对png图片格式支持不好(引用一段脚本处理)&/blockquote&&p&&br&&/p&&p&&b&18.简述前端优化的方式 旧的雅虎34条|h5新添加的方式&/b&&/p&&blockquote&1、尽量减少HTTP请求次数&br&2、减少DNS查找次数&br&3、避免跳转&br&4、可缓存的AJAX&br&5、推迟加载内容&br&6、预加载&br&7、减少DOM元素数量&br&8、根据域名划分页面内容&br&9、使iframe的数量最小&br&10、不要出现404错误&br&11、使用内容分发网络&br&12、为文件头指定Expires或Cache-Control
13、Gzip压缩文件内容&br&14、配置ETag&br&15、尽早刷新输出缓冲&br&16、使用GET来完成AJAX请求&br&17、把样式表置于顶部&br&18、避免使用CSS表达式(Expression)&br&19、使用外部JavaScript和CSS&br&20、削减JavaScript和CSS&br&21、用&link&代替@import&br&22、避免使用滤镜&br&23、把脚本置于页面底部&br&24、剔除重复脚本&/blockquote&&p&&br&&/p&&p&&b&19.jquery版本?1.11兼容?&/b&&/p&&blockquote&Query 2.x系列和 jQuery 1.x拥有同样的API,但是不再支持IE6、7、8。&br&推荐使用 1.x version,除非你确定IE6、7、8用户不再访问网站。&br&jquery1.11属于1.x 版本,其兼容IE6、7、8,所以也支持IE9.&/blockquote&&p&&br&&/p&&p&&b&20.块级?行内?空元素?&/b&&/p&&blockquote&行内元素:和有他元素都在一行上,高度、行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他行内元素&br&块级元素:总是在新行上开始,高度、行高及外边距和内边距都可控制,可以容纳内敛元素和其他元素;&br&空元素:在HTML元素中,没有内容的 HTML 元素被称为空元素。空元素是在开始标签中关闭的。&br& 就是没有关闭标签的空元素。&/blockquote&&p&&br&&/p&&p&&b&21.media属性?screen?All?max-width?min-width?&/b&&/p&&blockquote&media 属性规定被链接文档将显示在什么设备上。media 属性用于为不同的媒介类型规定不同的样式。Screen计算机默认屏幕,all适用于所有设备,max-width超过最大宽度就不执行,min-width必须大于最小宽度才执行。&/blockquote&&p&&br&&/p&&p&&b&22.meta标签的name属性值?&/b&&/p&&blockquote&name 属性主要用于描述网页,与之对应的属性值为content,content中的内容主要是便于搜索引擎机器人查找信息和分类信息用的。&br&meta标签的name属性语法格式是:<meta name=&参数& content=&具体的参数值&>。&br&其中name属性主要有以下几种参数:&br&A 、Keywords(关键字)说明:keywords用来告诉搜索引擎你网页的关键字是什么。&br&B 、description(网站内容描述) 说明:description用来告诉搜索引擎你的网站主要内容.&br&C 、robots(机器人向导)说明:robots用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。&br&content的参数有all,none,index,noindex,follow,nofollow,默认是all。&br&举例:<meta name=&robots& content=&none&>D 、author(作者) &/blockquote&&p&&br&&/p&&p&&b&23.一般做手机页面切图有几种方式?&/b&&/p&&blockquote&响应式布局,弹性布局display:flex,利用js编写设定比例,给根元素设定像素,使用rem为单位。&/blockquote&&p&&br&&/p&&p&&b&24.px/em/rem有什么区别? 为什么通常给font-size 设置的字体为62.5% &/b&&/p&&blockquote&相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。&br&1、em的值并不是固定的;&br&2、em会继承父级元素的字体大小。使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。&br&rem是相对于浏览器进行缩放的。1rem默认是16px,在响应式布局中,一个个除来转换成rem,太麻烦,所以重置rem&br&body{font-size=62.5%
} 此时1rem = 10若是12px则是1.2rem.&/blockquote&&p&&br&&/p&&p&&b&25.sass和scss有什么区别?sass一般怎么样编译的&/b&&/p&&blockquote&文件扩展名不同,Sass 是以“.sass”后缀为扩展名,而 SCSS 是以“.scss”后缀为扩展名;语法书写方式不同,Sass 是以严格的缩进式语法规则来书写,不带大括号({})和分号(;),而 SCSS 的语法书写和我们的 CSS 语法书写方式非常类似。&/blockquote&&p&&br&&/p&&p&&b&26.如果对css进行优化如何处理?&/b&&/p&&blockquote&压缩打包,图片整合,避免使用Hack,解决兼容问题,使用简写,让CSS能保证日后的维护。&/blockquote&&p&&br&&/p&&p&&b&27.如何对css文件进行压缩合并? gulp ?&/b&&/p&&blockquote&使用gulp, 首页全局安装gulp。&br&1、npm install --global gulp &br&2、其次局部安装gulp。npm install gulp --save-dev&br&3、在项目根目录下创建一个名为 gulpfile.js 的文件&br&var gulp = require('gulp');&br&gulp.task('default', function() {&br&// 将你的默认的任务代码放在这});&br&4、运行gulp。(默认的名为 default 的任务(task)将会被运行,想要单独执行特定的任务(task),请输入 gulp &task& &othertask&)&br&gulp&br&合并和压缩JS、CSS文件&br&压缩JS,CSS文件需要引用如下组件:&br&gulp-minify-css: 压缩css&/blockquote&&p&&br&&/p&&p&&b&28.组件? 模块化编程?&/b&&/p&&blockquote&组件化编程: 将js css html包装一起提供方法和效果;&br&模块化化: 将相同的功能抽取出来 存放在一个位置进行编程&/blockquote&&p&&br&&/p&&p&&b&29.图片和文字在同一行显示?&/b&&/p&&blockquote&1 在css中给div添加上“vertical-align:middle”属性。 &br&2 分别把图片和文字放入不同的div中,然后用“margin”属性进行定位,就可以使他们显示在同一行。&br&3 把图片设置为背景图片。&/blockquote&&p&&br&&/p&&p&&b&30.禁止事件冒泡&/b&&/p&&blockquote&event.stopPropagation()&/blockquote&&p&&br&&/p&&p&&b&31.禁止默认事件&/b&&/p&&blockquote&event.preventDefault()&/blockquote&&p&&br&&/p&&p&&b&32.a标签中 active hover link visited 正确的设置顺序是什么?&/b&&/p&&blockquote&a标签的link、visited、hover、active是有一定顺序的&br&a:link
&br&a:visited
&br&a:hover &br&a:active
&/blockquote&&p&&br&&/p&&p&&b&33.a标签中 如何禁用href 跳转页面 或 定位链接 &/b&&/p&&blockquote&e.preventDefault();&br&href=&javascript:void(0);&/blockquote&&p&&br&&/p&&p&&b&34.手机端上 图片长时间点击会选中图片,如何处理?&/b&&/p&&blockquote&onselect=function() {&br&return false&br&}&/blockquote&&p&&br&&/p&&p&&b&35.video标签的几个个属性方法&/b&&/p&&blockquote&src:视频的URL
poster:视频封面,没有播放时显示的图片
preload:预加载
autoplay:自动播放
loop:循环播放
controls:浏览器自带的控制条
width:视频宽度
height:视频高度&/blockquote&&p&&br&&/p&&p&&b&36.常见的视频编码格式有几种?视频格式有几种?&/b&&/p&&blockquote&视频格式:MPEG-1、MPEG-2和MPEG4 、AVI 、RM、ASF和WMV格式 &br&视频编码格式:H.264、MPEG-4、MPEG-2、WMA-HD以及VC-1&/blockquote&&p&&br&&/p&&p&&b&37.canvas在标签上设置宽高 和在style中设置宽高有什么区别?&/b&&/p&&blockquote&canvas标签的width和height是画布实际宽度和高度,绘制的图形都是在这个上面。而style的width和height是canvas在浏览器中被渲染的高度和宽度。如果canvas的width和height没指定或值不正确,就被设置成默认值 。&/blockquote&&p&&br&&/p&&p&&b&38.border-image?box-sizing?&/b&&/p&&blockquote&Border-image : 图形化边框&br&Box-sizing : 属性允许您以特定的方式定义匹配某个区域的特定元素。&br&语法 :box-sizing:content-box | border-box&br&Content-box : padding和border不被包含在定义的width和height之内。对象的实际宽度等于设置的width值和border、padding之和,即 ( Element width = width + border + padding) 此属性表现为标准模式下的盒模型 .&br&Border-box : padding和border被包含在定义的width和height之内。对象的实际宽度就等于设置的width值,即使定义有border和padding也不会改变对象的实际宽度,即 ( Element width = width ) 此属性表现为怪异模式下的盒模型。&/blockquote&&p&&br&&/p&&p&&b&39.渐进增强和优雅降级&/b&&/p&&blockquote&渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。&br&优雅降级 graceful degradation:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。&br&区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。&br&降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。&br&“优雅降级”观点&br&“优雅降级”观点认为应该针对那些最高级、最完善的浏览器来设计网站。而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段,并把测试对象限定为主流浏览器(如 IE、Mozilla 等)的前一个版本。&br&在这种设计范例下,旧版的浏览器被认为仅能提供“简陋却无妨 (poor, but passable)” 的浏览体验。你可以做一些小的调整来适应某个特定的浏览器。但由于它们并非我们所关注的焦点,因此除了修复较大的错误之外,其它的差异将被直接忽略。&br&“渐进增强”观点&br&“渐进增强”观点则认为应关注于内容本身。&br&内容是我们建立网站的诱因。有的网站展示它,有的则收集它,有的寻求,有的操作,还有的网站甚至会包含以上的种种,但相同点是它们全都涉及到内容。这使得“渐进增强”成为一种更为合理的设计范例。这也是它立即被 Yahoo! 所采纳并用以构建其“分级式浏览器支持 (Graded Browser Support)”策略的原因所在。&br&那么问题来了。现在产品经理看到IE6,7,8网页效果相对高版本现代浏览器少了很多圆角,阴影(CSS3),要求兼容(使用图片背景,放弃CSS3),你会如何说服他?&/blockquote&&p&&br&&/p&&p&&b&40.解释在ie低版本下的怪异盒模型和c3的怪异盒模型 和 弹性盒模型?
&/b& &/p&&blockquote&IE当padding+border的值小于width或者height: &br&盒模型的宽度=margin(左右)+width(width已经包含了padding和border的值) &br&盒模型的高度=margin(上下)+height(height已经包含了padding和border的值)
&br&当padding+border的值大于width或者height: &br&盒模型的宽度=margin(左右)+padding(左右)+border(左右) &br&盒模型的高度=margin(上下)+padding(上下)+border(上下)+19px (加一个默认行高 19px)
所以相当于是padding+border和width或者height比大小,谁大取谁。 &br&以上几种DOCTYPE都是标准的文档类型,无论使用哪种模式完整定义DOCTYPE,都会触发标准模式,而如果DOCTYPE缺失则在ie6,ie7,ie8下将会触发怪异模式(quirks 模式) CSS3box-sizing有两个值一个是content-box,另一个是border-box。
&br&当设置为box-sizing:content-box时,将采用标准模式解析计算,也是默认模式; &br&当设置为box-sizing:border-box时,将采用怪异模式解析计算; &br&Css3弹性盒模型引入了新的盒子模型—弹性盒模型,该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用的空间。使用该模型,可以很轻松的创建自适应浏览器窗口的流动布局或自适应字体大小的弹性布局。 &/blockquote&&p&&br&&/p&&p&&b&41.animation对应的属性 &/b&&/p&&blockquote&写法:animation: name duration timing-function delay iteration- &br&下面是对应的属性的介绍 &br&animation-name
规定需要绑定到选择器的 keyframe 名称。&br&animation-duration
规定完成动画所花费的时间,以秒或毫秒计。 &br&animation-timing-function
规定动画的速度曲线。 &br&animation-delay
规定在动画开始之前的延迟。 &br&animation-iteration-count
规定动画应该播放的次数。 &br&animation-direction
规定是否应该轮流反向播放动画。 &/blockquote&&p&&br&&/p&&p&&b&42.transition?&/b& &/p&&blockquote&css的transition允许css的属性值在一定的时间区间内平滑地过渡。这种效果可以在鼠标单击、获得焦点、被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值 注意区别transform,transform是进行2D转换的 如移动,比例化,反过来,旋转,和拉伸元素。

我要回帖

更多关于 崩坏学园cg去衣图 的文章

 

随机推荐