IPhone X 适配

关于底部

~'' 是控制忽略编译,不然css-loader在解析的时候会报错

@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
  .bottom-bar {
    bottom: calc(~'1.2267rem +  constant(safe-area-inset-bottom)');
    bottom: calc(~'1.2267rem +  env(safe-area-inset-bottom)');
  }
}

env() 和 constant()

iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:

  • safe-area-inset-left:安全区域距离左边边界距离
  • safe-area-inset-right:安全区域距离右边边界距离
  • safe-area-inset-top:安全区域距离顶部边界距离
  • safe-area-inset-bottom:安全区域距离底部边界距离

这里我们只需要关注 safe-area-inset-bottom 这个变量,因为它对应的就是小黑条的高度(横竖屏时值不一样)。

注意:当 viewport-fit=contain 时 env() 是不起作用的,必须要配合 viewport-fit=cover 使用。对于不支持env() 的浏览器,浏览器将会忽略它。

在这之前,笔者使用的是 constant(),后来,官方文档加了这么一段注释(坑):

The env() function shipped in iOS 11 with the name constant(). Beginning with Safari Technology Preview 41 and the iOS 11.2 beta, constant() has been removed and replaced with env(). You can use the CSS fallback mechanism to support both versions, if necessary, but should prefer env() going forward.

这就意味着,之前使用的 constant() 在 iOS11.2 之后就不能使用的,但我们还是需要做向后兼容,像这样:

padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */

注意:env() 跟 constant() 需要同时存在,而且顺序不能换。
更详细说明,参考文档:Designing Websites for iPhone X

iOS滚动定位问题

iOS12非浏览器滚动默认没有弹性问题

Q:增加弹性样式,-webkit-overflow-scrolling: touch;

思考题:到底都有哪些ios容器会有这个问题

如果容器高度变化,从有滚动条变成没有滚动条,里面的元素定位会继承有滚动条时的定位,而导致位置错误

Q:让当前容器初始化的时候就一定会出现滚动条可以避免这个问题,比如设置height: 101%;另外这个问题还要注意一下,如果你是rem布局,不要在height这里用calc(100% + 1px),因为rem有亚像素问题,一像素可能解决不了这个问题,非要优化的话建议+3px。

按比例显示盒模型

固定盒子长宽比
通过设置高度为0 ; padding-bottom:%可以根据宽度设定盒子的比例
如果不知道上面的理论是什么,可以通过去传送门看看这个属性的详细说明。
% 定义基于父元素宽度的百分比下内边距。此值不会如预期地那样工作于所有的浏览器中。
显然有兼容性问题~不过触摸端我还没有看到不好用的所以,移动端开发可以尽量用。

批处理压缩css和js for nodejs

同事推荐的压缩css和js的方法,是运行在nodejs的基础上的,所以你要先安装一个nodejs。

在有nodejs的基础上,进入命令行模式分别运行

npm install clean-css -g

npm install uglifyjs -g

clean-css是压缩css的,uglifyjs是压缩js的。
然后新建两个批处理文件。
@echo off
:: 设置压缩css文件的根目录,脚本会自动按树层次查找和压缩所有的css
SET OUTFOLDER= 压缩后的目标目录
echo 正在深度复制文件
xcopy 准备压缩的目录*.* "%OUTFOLDER%" /s /e && echo 复制成功 || echo 复制失败,请检查文件是否存在!
echo 复制完成
:: 设置压缩的路径
chdir /d %OUTFOLDER%
echo 正在查找CSS 文件
for /r . %%b in (*.css) do (
@echo 正在压缩 %%~b ...
cleancss -o %%~fb %%~fb
)
echo CSS压缩完成
echo 完成!

@echo off
:: 设置压缩JS文件的根目录,脚本会自动按树层次查找和压缩所有的JS
SET OUTFOLDER = 压缩后的目标目录
echo 正在深度复制文件
xcopy 准备压缩的目录*.* "%OUTFOLDER%" /s /e && echo 复制成功 || echo 复制失败,请检查文件是否存在!
echo 复制完成
:: 设置压缩的路径
chdir /d %OUTFOLDER%
echo 正在查找JS文件
for /r . %%a in (*.js) do (
@echo 正在压缩 %%~a ...
uglifyjs %%~fa -o %%~fa
)
echo JS压缩完成
echo 完成!

目录的格式应该是 C:\abc\
只要你写的路径是绝对路径批处理文件可以放在任意你喜欢的位置。
如果有需要,你也可以写到一起。

CSS3 Media Queries

转载自:W3CPLUS

Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码:

  <link href="css/reset.css" rel="stylesheet" type="text/css" media="screen" />
  <link href="css/style.css" rel="stylesheet" type="text/css" media="all" />
  <link href="css/print.css" rel="stylesheet" type="text/css" media="print" />

或者这样的形式:

  <style type="text/css" media="screen">
    @import url("css/style.css");
  </style>

不知道大家留意没有,其中两种方式引入CSS样式都有一个共同的属性“media”,而这个“media”就是用来指定特定的媒体类型,在HTML4和CSS2中充许你使用“media”来指定特定的媒体类型,如屏幕(screen)和打印(print)的样式表,当然还有其他的,比如说“TV”,“handheld”等,其中“all”表示的是支持所有媒体介质。有关于更多的Media类型,可以点击这里

上面简单说了一下HTML4和CSS2的“Media Queries”,而今天的主要是来学习CSS3中的”Media
Queries”的更多使用方法和相关知识,下面我们开始进入今天的主题。CSS3中的Media
Queries增加了更多的媒体查询,同时你可以添加不同的媒体类型的表达式用来检查媒体是否符合某些条件,如果媒体符合相应的条件,那么就会调用对应的
样式表。换句简单的说,“在CSS3中我们可以设置不同类型的媒体条件,并根据对应的条件,给相应符合条件的媒体调用相对应的样式表”。现在最常见的一个
例子,你可以同时给PC机的大屏幕和移动设备设置不同的样式表。这功能是非常强大的,他可以让你定制不同的分辨率和设备,并在不改变内容的情况下,让你制
作的web页面在不同的分辨率和设备下都能显示正常,并且不会因此而丢失样式。

首先来看一个简单的实例:

  <link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css" />

上面的media语句表示的是:当页页宽度小于或等于600px,调用small.css样式表来渲染你的Web页面。首先来看media的语句中包含的内容:

1、screen:这个不用说大家都知道,指的是一种媒体类型;

2、and:被称为关键词,与其相似的还有not,only,稍后会介绍;

3、(max-width:600px):这个就是媒体特性,说得通俗一点就是媒体条件。

前面这个简单的实例引出两个概念性的东西,一个就是媒体类型(Media Type)媒体特性(Media Query),首先一起来理解一下这两个概念:

一、媒体类型(Media Type)

媒体类型(Media
Type)在css2中是一个常见的属性,也是一个非常有用的属性,可以通过媒体类型对不同的设备指定不同的样式,在css2中我们常碰到的就是
all(全部),screen(屏幕),print(页面打印或打邱预览模式),其实在媒体类型不止这三种,w3c总共列出了10种媒体类型

页面中引入媒体类型方法也有多种:

1、link方法引入

   <link rel="stylesheet" type="text/css" href="../css/print.css" media="print" />

2、xml方式引入

  <?xml-stylesheet rel="stylesheet" media="screen" href="css/style.css" ?>

3、@import方式引入

@import引入有两种方式,一种是在样式文件中通过@import调用别一个样式文件;另一种方法是
在<head></head>中的<style>…</style>中引入,单这种使用方法在
ie6-7都不被支持 如

样式文件中调用另一个样式文件:

   @import url("css/reset.css") screen;
   @import url("css/print.css") print;

在<head></head>中的<style>…</style>中调用:

  <head>
    <style type="text/css">
@import url("css/style.css") all;
    </style>
  </head>

4、@media引入

这种引入方式和@import是一样的,也有两种方式:

样式文件中使用:

   @media screen{
     选择器{
属性:属性值;
     }
   }

在<head>>/head>中的<style>…</style>中调用:

  <head>
    <style type="text/css">
@media screen{
           选择器{
     属性:属性值;
   }
}
    </style>
  </head>

以上几种方法都有其各自的利弊,在实际应用中我建议使用第一种和第四种,因为这两种方法是在项目制作中是常用的方法,对于他们的具体区别,我就不说了,想了解的大家可以去找度娘或G爸,他们能帮你解决。

二、媒体特性(Media Query)

前面有简单的提到,Media Query是CSS3 对Media Type的增强版,其实可以将Media Query看成Media Type(判断条件)+CSS(符合条件的样式规则),常用的特性w3c共列出来13种。具体的可以参阅:Media features。为了更能理解Media Query,我们在次回到前面的实例上:

  <link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css" />

转换成css中的写法为:

  @media screen and (max-width: 600px) {
    选择器 {
      属性:属性值;
    }
  }

其实就是把small.css文件中的样式放在了@media srceen and (max-width;600px){…}的大括号之中。在语句上面的语句结构中,可以看出Media query和css的属性集合很相似,主要区别在:

1、Media query只接受单个的逻辑表达式作为其值,或者没有值;

2、css属性用于声明如何表现页页的信息;而Media Query是一个用于判断输出设备是否满足某种条件的表达式;

3、Media Query其中的大部分接受min/max前缀,用来表示其逻辑关系,表示应用于大于等于或者小于等于某个值的情况

4、CSS属性要求必须有属性值,Media Query可以没有值,因为其表达式返回的只有真或假两种

常用的Media Query如下表所示:

兼容的浏览器:

下面我们一起来看看Media Queries的具体使用方式

一、最大宽度Max Width

  <link rel="stylesheet" media="screen and (max-width:600px)" href="small.css" type="text/css" />

上面表示的是:当屏幕小于或等于600px时,将采用small.css样式来渲染Web页面。

二、最小宽度Min Width

   <link rel="stylesheet" media="screen and (min-width:900px)" href="big.css" type="text/css"  />

上面表示的是:当屏幕大于或等于900px时,将采用big.css样式来渲染Web页面。

三、多个Media Queries使用

   <link rel="stylesheet" media="screen and (min-width:600px) and (max-width:900px)" href="style.css" type="text/css" />

Media Query可以结合多个媒体查询,换句话说,一个Media
Query可以包含0到多个表达式,表达式又可以包含0到多个关键字,以及一种Media
Type。正如上面的其表示的是当屏幕在600px-900px之间时采用style.css样式来渲染web页面。

四、设备屏幕的输出宽度Device Width

   <link rel="stylesheet" media="screen and (max-device-width: 480px)" href="iphone.css" type="text/css" />

上面的代码指的是iphone.css样式适用于最大设备宽度为480px,比如说iPhone上的显示,这里的max-device-width所指的是设备的实际分辨率,也就是指可视面积分辨率

五、iPhone4

   <link rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio: 2)" type="text/css" href="iphone4.css" />

上面的样式是专门针对iPhone4的移动设备写的。

六、iPad

  <link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css" type="text/css" /> 
  <link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css"  type="text/css" />

在大数情况下,移动设备iPad上的Safari和在iPhone上的是相同的,只是他们不同之处是iPad声明了不同的方向,比如说上面的例子,
在纵向(portrait)时采用portrait.css来渲染页面;在横向(landscape)时采用landscape.css来渲染页面。

七、android

  /*240px的宽度*/
  <link rel="stylesheet" media="only screen and (max-device-width:240px)" href="android240.css" type="text/css" />
  /*360px的宽度*/
  <link rel="stylesheet" media="only screen and (min-device-width:241px) and (max-device-width:360px)" href="android360.css" type="text/css" />
  /*480px的宽度*/
  <link rel="stylesheet" media="only screen and (min-device-width:361px) and (max-device-width:480px)" href="android480.css" type="text/css" />

我们可以使用media query为android手机在不同分辨率提供特定样式,这样就可以解决屏幕分辨率的不同给android手机的页面重构问题。

八、not关键字

  <link rel="stylesheet" media="not print and (max-width: 1200px)" href="print.css" type="text/css" />

not关键字是用来排除某种制定的媒体类型,换句话来说就是用于排除符合表达式的设备。

九、only关键字

  <link rel="stylesheet" media="only screen and (max-device-width:240px)" href="android240.css" type="text/css" />

only用来定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器。其实only很多时候是用来对那些不支持Media
Query但却支持Media Type的设备隐藏样式表的。其主要有:支持媒体特性(Media
Queries)的设备,正常调用样式,此时就当only不存在;对于不支持媒体特性(Media Queries)但又支持媒体类型(Media
Type)的设备,这样就会不读了样式,因为其先读only而不是screen;另外不支持Media
Qqueries的浏览器,不论是否支持only,样式都不会被采用。

十、其他

在Media Query中如果没有明确指定Media Type,那么其默认为all,如:

  <link rel="stylesheet" media="(min-width: 701px) and (max-width: 900px)" href="medium.css" type="text/css" />

另外还有使用逗号(,)被用来表示并列或者表示或,如下

  <link rel="stylesheet" type="text/css" href="style.css" media="handheld and (max-width:480px), screen and (min-width:960px)" />

上面代码中style.css样式被用在宽度小于或等于480px的手持设备上,或者被用于屏幕宽度大于或等于960px的设备上。

关于Media Query的使用这一节就介绍到此,最后总体规纳一下其功能,个人认为就是一句话:Media Queries能在不同的条件下使用不同的样式,使用页面达到不同的渲染效果。下一节将会针对Media Queries介绍几个实例,如果感兴趣的朋友记得观注本站的更新。

 

【转】IE6下DIV容器中双Float元素字符重影bug(IE6重复文字bug)

转载前说明:感谢作者,我终于找到个说法了,之前因为没有相关资料一直是通过改变代码结构来解决该问题的,现在看到这些总结也总算不会无计可施,同样碰到问题的同学有福了。

转载自:http://www.yuzi.me/Share/ie6floatbug.html

ie6floatbug1

IE7 的web标准之道IE历来被web标准的拥护者所诟病,而当FireFox横空出世以后,更多的网页制作者开始关注web标准设计。看着FireFox的 市场占有率不停的上升,微软终于推出了IE7。但IE7是否真的能够力挽狂澜,是否真的能够得到用户的信任,是否真的能够得到网页设计者的认可呢?

估 计很多的朋友都是因为这个华丽的“重复文字”一词进来的,其实这纯粹是一个bug作为。这个bug在国际上比较获得认可的名字叫做——“IE6重复文字 bug”。这是一个非常好玩但是有很令人摸不到头脑的bug。如果,你不知道产生原因的话,将会令人非常头痛。这也是我在现实工作中真正遇到过的情况。

测试一下:复制以下代码放IE6下测试

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml“>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<meta name=”author” content=”Yuzi,煜子,网页设计师网站” />
<meta name=”Copyright” content=”Yuzi,煜子” />
<title>IE6重复文字bug</title>
</head><body><div style=”width:200px; height:100px; padding-left:70px;”><div style=”float:left;”></div>
<!–如果是IE6,你将多看到一个“影”字–>
<div style=”float:left; width:200px;”>IE6下DIV容器中双Float元素字符重影</div>
</div>
</body>

下面是测试页面分别在IE6,IE7,IE8,FireFox(火狐浏览器),Chrome(谷歌浏览器),Oepra以及Safari(苹果浏览器)中显示效果截图

ie6floatbug2

通过截图,你会惊讶的看到在IE6中,多出了一个“影”字。下面来讲讲出现这个“影”字的一些条件(bug重现条件)

一个容器包含2两个具有“float”样式的子容器。

第二个容器的宽度大于父容器的宽度,或者父容器宽度减去第二个容器宽度的值小3(说到3,这里稍微多说一句——IE7还修正了IE6中的一个bug,bug名字就叫做“3像素bug”)

在第二个容器前存在注释(这也是为什么此bug也叫做“IE6注释bug”的原因)

为何会出现重影

bug虽然的的确确的存在,但是为什么会出现这样的bug依然没有统一的定论。不同的高手也是各执一词,谁也说服不了谁。真正的原因也许只有当时的IE6团队才能道出来,但是现在仍然没有官方的说法。下面列出来的这两种说法,只是现在网上认可度比较高的而已。

说法一:

IE6浏览器对<!– –>注释的解释存在bug引起的。“3像素bug”的扩展后遗症。

说法二:

其他的一些说法,如何消灭重影 引起的原因,也许我们可以不知道,但是如何消除却是我们一定要关注的。”重影bug”已经在IE7中得到修正,在FireFox和Opera中也不会出现,所以bug的修正主要是针对IE6的。

针对于上文中讲到的“bug重现条件”,如果要修正bug,只要让任何一个条件满足即可。有些网友对IE6 重影bug做出了一些想法及议论。

解决方法一:

改变结构,不出现【一个容器包含2两个具有“float”样式的子容器】的结构。
此解决方案的评论:疯了!因噎废食的做法。

解决方法二:

减小第二个容器的宽度,使父容器宽度减去第二个容器宽度的值大于3,例如将本文示例中第二个子容器的宽度改为197px。
此解决方案的评论:在满足页面布局的前提下可以使用。但是当情况比较复杂的时候,可能实施起来比较困难。

解决方法三:

去掉所有的注释。
此解决方案的评论:最直接的做法,但是“没有注释的代码”,的确不是一个好的代码写作习惯。

解决方法四:

修正注释的写法。将 <!– 这里是注释内容 –>写成<!–[if !IE]>这里是注释内容<![endif]–>
此解决方案的评论:还不错的解决方案,但是并不是每个人都对<!–[if !IE]>这里是注释内容[endif]–>这种注释写法很欣赏。

解决方法五:

在第二个容器后面加一个或者多个<div style=”clear”></div>来解决。
此解决方案的评论:另人感觉很不爽的解决方案,但是的确能解决,影响网页效率。

关于此bug的一些文章资料,其实很早以前就有外国的朋友关注过这个bug,而且在中国也有过一些朋友关注过这个bug。我在写这篇文章的时候,也一定程度上参照了他们的研究成果,在此向研究此问题的前辈们表示感谢。

让IE也支持圆角

转载自:http://cll.socss.cn/archives/259

css3的圆角属性,能为开发者提高开发的效率。可惜主流的ie6 7 8并不支持该属性。下面介绍一种让ie也支持圆角的方法。

1.首先要下载一个压缩包,里面有一个微软的脚本文件(11KB),里面是IE利用VML矢量可标记语言作为画笔绘出圆角。

下载地址:http://cll.socss.cn/wp-content/uploads/2011/07/iecss3.zip

使用方法:

.main{

border: 2px solid #C0C0C0;

-moz-border-radius: 10px;

-webkit-border-radius: 10px;

border-radius: 10px;

position:relative;

z-index:2;

behavior: url(此处为ie-css3.htc文件的绝对路径);

Webkit内核的浏览器支持“-webkit-border-radius:  10px;”属性(10px是圆角半径),可以直接解析出圆角;Firefox浏览器支持“-moz-border-radius:  10px;”属性,也是可以直接解析出圆角;IE系浏览器则需要加上“border-radius: 10px;”的属性。

 

需要注意以下几点:

1、behavior的url里一定要填写ie-css3.htc的绝对路径,因为  IE浏览器找该文件是相对当前html文件路径来找的。

2、一定要有定位属性:position:relative;

3、因为在IE浏览器下这些css3效果的实现是要借助于VML,由VML绘制圆角或是投影效果,所以还需要一个z-index属性。z-index属性最好设置得比较大,如2。

4、如果在IE浏览器下某些模块无法用此渲染,可以试着绝对定位相应的层,即加上“ width: 400px; height:400px;”属性。

ps:因为该方法使用脚本来实现的,实际应用过程中可能会出现很多意想不到的问题,所以在正式商业项目中还是慎用的好。

 

我的使用经验:这个外部文件实际上就是一套js,会根据你的使用情况往页面上加一些代码来辅助实现你需要的效果。

这些代码主要是一个层,有行内样式,是根据你圆角对象相对屏幕的定位而产生的,那么就出现个问题~

如果你的对象的父级有position属性,但是又不在页面原点(0,0),就会产生错位问题,这个要注意一下。

当然你也可以自己去修改ie-css3.htc这个文件里面的js来达到你想要的效果。

 

关于input中type属性的切换

之前的几个项目一直纠结一个问题,就是input的type值可不可以通过什么方法直接切换。以保证密码输入框可以做到英文字符和点点之间自行切换,而不是覆盖一个文本层在上面坐事件或者别的什么方法。

好吧我还是上图吧:

input-type

input-type2

之前发现js里面有一个obj.type的属性可以直接改input里面的type值。

结果昨天测试发现不兼容ie9以下的ie浏览器。顿时泪奔。

所以现在的做法 依然是覆盖一个i额层在这个password上面来解决这个问题。

还有一个方法就是给3个跟password有关的input

<input class=”input1″ type=”text” value=”文字内容”/>

<input class=”input2″ type=”password” value=”密码内容”/>

<input class=”input3″ type=”hidden” value=”用来接收密码,提供给程序”/>

然后无非就是全部隐藏,需要显示文字的时候显示input1,input1获得焦点时隐藏掉input1,显示input2并把焦点光标给input2~剩下的逻辑你懂的。