当前位置: 首页 > 科技观察

CSS容易让人迷惑的几个经典问题

时间:2023-03-18 12:31:46 科技观察

.header1{opacity:.6;}.header2{background-color:rgba(0,0,0,0.45);}.handle-opacity{position:absolute;width:100%;height:100%;background-color:rgba(255,255,255,0.45);header{background-color:rgba(0,0,0,0.45);}}本文摘自我今年工作中遇到的几个比较好的CSS问题(不一定复杂,但我觉得都值得一提),这些CSS问题就可以了平时很少遇到,即使遇到也未必知道解决方法,即使知道解决方法也未必知道生成原理,还准备了2道JS题(整理了很久之前的JS问题文章,此处不再更新)。本文会持续更新,希望对朋友们有所帮助。期待您的喜欢,谢谢。一、CSS篇1.1元素默认蓝色边框input标签元素(如button、text、areatext)的一些事件(如click、focus等)在很多浏览器中默认会有蓝色边框,比如放一个普通的button设置背景和边框为无后,触发点击后的样式如下:这是由元素默认的轮廓生成的。这是浏览器的一种保护机制,起到元素高亮的作用。干脆杀了它。方法如下://方法一:outline:none/medium;//方法二:outline-width:01.2背景透明,文字不透明。我们通常使用不透明度使背景透明。所有浏览器都支持此属性。可以大胆使用,透明度从0.0(完全透明)到1.0(完全不透明),但是这个方法会使其所有子元素透明。这时候如果只希望背景透明,其他不透明,可以使用rgba对背景进行处理:background-color:rgba(red,green,blue,alpha)其中alpha是设置透明度,值介于0和1之间。此方法在除IE9及以下的其他浏览器中可用。我们来看看效果:同样的,我们也可以用这个方法让整个背景透明,即多写一个div作为模态层进行透明处理,可以明显看出上面的文字是不透明的:上面效果代码如下://html

你会微笑让我走相册

/div>

你会微笑着放手,说你不会哭着让我出新专辑

/div>

你会微笑让我走新专辑

/header>
.header1{opacity:.6;}.header2{background-color:rgba(0,0,0,0.45);}.handle-opacity{position:absolute;width:100%;height:100%;background-color:rgba(255,255,255,0.45);header{background-color:rgba(0,0,0,0.45);}}1.3的div内置了img元素,而且还有alwa底部有一个缺口。用div包裹一个img,img不能完全覆盖div空间,底部总会有一点缝隙。出现这种现象的原因是img是一个内联元素,浏览器为降序字符(如:g、y、j、p、q)留了一些空间。这些字符会比其他字符占用更多的底部空间(具体和当前字体大小有关),这条规则会影响内联元素img标签(它默认垂直对齐是基于基线的,即vertical-align:baseline),同样的内联元素也会和外部元素留出这样的安全距离。上图右侧是添加文字的效果,更加说明了一切。现在我们知道这个现象主要是两个因素造成的:下游的字符串保护机制和img是内联元素,所以解决方案从这两个地方入手,整理如下:divsetfont-size:0orline-height:0,行高为0;img设置vertical-align:topormiddle/,使其不再与默认基线对齐;mg设置display:block,使其成为块级元素。综上所述,个人认为方法3最好,不推荐方法1。1.4元素自动填充背景色。这种场景经常出现在输入等形式中。当你第一次看到它的时候真的很奇怪。输入框有背景(黄色或灰蓝色)。这个问题是由于添加:-webkit-autofillprivate伪属性默认自动填充input、select、textarea等引起的。比较好的方案是让样式覆盖,代码如下:input:-webkit-autofill{box-shadow:000px1000pxwhiteinset!important;}select:-webkit-autofill{box-shadow:000px1000pxwhiteinset!important;}textarea:-webkit-autofill{box-shadow:000px1000pxwhiteinset!important;}比较马虎的做法是设置禁止自动填充,但是千万不要那样做...1.5transform的基值导致字体模糊Transform作为CSS3最引以为豪的属性,已经成为了一个当前前端开发中必不可少的方法。但是它有一个渲染问题,就是当元素设置了transform,并且它的值为base或者decimal,并且它的整体高度也有base时,它的内部文字会变得模糊,如图:上图模糊,下图已修正。具体原因可能是transform变换会在浏览器上创建一个单独的绘画层并重新渲染。在渲染过程中,周围的文字也会被处理。如果文字的高度是奇数,可能是有半个像素的计算量,浏览器会优化这半个像素的渲染,所以边缘会显得模糊。解决方法是:不要为transform属性值设置base和hour值;调整整体元素高度而不是基础。1.6:last-child和:last-of-type是CSS常用的伪类选择器。:last-child经常被使用,但有时在极端情况下,会意外失败,让人摸不着头脑。例子如下:3个img标签包裹在card中,当前需求是最后一张图片的边框变成粉红色,代码如下://html
//css.card{>img{width:150px;margin-right:10px;&:last-child{border:5pxsolidpink;}}}同样可以用:last-of-type:.card{>img{width:150px;margin-right:10px;&:last-of-type{border:5pxsolidpink;}}}效果如下:现在给img添加一个span,发现:last-child无效://htmlnextis...
//css.card{>img{width:150px;margin-right:10px;&:last-child{border:5pxsolidpink;}}}这时候:last-of-type还是可以的:现在得出结论::last-child选择一组兄弟元素中的最后一个元素,最后一个元素必须是声明的指定元素(注2条件);:last-of-type选择可以看出,在一组兄弟元素中最后指定类型的元素,:last-of-type更加严谨,不容易产生意想不到的bug。我推荐使用它。:nth-last-child(n)和:nth-last-of-type(n)也是同理2.在DOM的这一部分,我将描述一些在DOM操作中容易被忽视的问题。2.1IOS日期显示问题经常做H5移动端开发的朋友一定对这个问题不陌生,就是在某些IOS版本(IOS5及以下)中,对以“-”分隔的字符串时间格式的解析是不正确的。成功了,比如我们写了这么一个鸡肋的时间格式适配器:=0&&date.getMonth()<=8)?`0${date.getMonth()+1}`:`${date.getMonth()+1}`;letD=(date.getDate()>=0&&date.getDate()<=9)?`0${date.getDate()}`:`${date.getDate()}`;return`Y-M-D`}这时候如果iphone是IOS5及以下,通过在“2019-12-31”会显示NaN-NaN-NaN,其他IOS版本和Android系统都可以。针对以上问题,需要进行兼容适配,即将以“-”分隔的事件字符串替换为“/”。对于同一个适配器,添加一段代码:functionDateFormat(date){if(!date)returnull;if(typeofdate==='string'&&date.indexOf('T')!=-1&&date.indexOf('+')!=-1){datedate=date.replace(/-/g,'/').replace('T','').substring(0,date.indexOf('.'))}date=newDate(日期);letY=date.getFullYear();letM=(date.getMonth()>=0&&date.getMonth()<=8)?`0${date.getMonth()+1}`:`${date.getMonth()+1}`;letD=(date.getDate()>=0&&date.getDate()<=9)?`0${date.getDate()}`:`${date.getDate()}`;return`Y-M-D`}2.2ENTER键刷新当前页面。这真是一个奇怪的问题。在一个表单中执行回车键提交后,如果你打开一个新的页面显示提交结果,你会发现当前的表单页面也被刷新了。这种体验当然是非常糟糕的。经验证,出现该问题的条件是:当Form中只有一个input时,此时执行回车键会自动提交表单并刷新页面。解决方法也很粗暴,就是在输入框附近写一个隐藏标签,这样就有2个输入,避免了默认刷新的bug,例子如下:
终于在2020年的前夕,发表了一篇快文,结束了我2019年的旅程。本文将持续更新。如有不同意见和疑问,欢迎留言指出。我期待你的喜欢。最后祝大家2020年好运。