CSS的布局整理
手机微信端样式学习: WeUI
check微信接口 Wechat JS-SDK
Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性(比如实现垂直居中)。设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。
其6大属性flex-direction,flex-wrap,flex-flow,justify-content,align-items,align-content。
display: -webkit-box;
display: -webkit-flex; /* Safari */
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
1. 块状元素中放入一个img元素导致高度会多出几个像素(约4px)
改变前: 改变后:
<div id = "img"> <img src=""/> </div> #img{ width: 100% ; min-height: 40px; border : 1px solid red ; /* 为了方便观察,此处给div加了1px的边框 */ } #img img{ width: 100% ; }
解决方法: 将img变为块状元素
#img img{ width: 100%; display: block; }
2. 左右布局, 左边一直在一个地方, 无论右边如何变
<div class="spacing"> <span class="spacing-left"></span> <span class="spacing-right">测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span> </div> .spacing { padding: 17px 14px; font-size: 14px; display: flex; } //左边一定要有个宽度 .spacing .spacing-left { background-image: url("imgurl"); height: 17px; width: 17px; background-size: 17px; background-repeat: no-repeat; background-position-y: center; margin-right: 9px; margin-top: 1px; } .spacing .spacing-right { flex: 1; text-align: justify; //用于让文字的宽度100% }
3. 无论左边高度如何变, 图标一直在中间
<div class="test"> <div class="title">测试</div> <div class="content">测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</div> <i class="arrow"></i> </div> .test { position: relative; padding-right: 20px; } .test .title { color: #222; font-weight: 700; margin-bottom: 10px; font-size: 14px; } .test .content { font-size: 11px; color: #bbb; } .arrow { background-image: url('imgUrl'); background-repeat: no-repeat; background-position-y: center; background-size: 7.5px 13.5px; position: absolute; right: 0; top: 0; height: 100%; width: 7.5px; }
4. 提交按钮一直在页面的最下边, 不随滚动条改变
<div class="footer"> <a class="footer-text" href="javascript:;"> <span class="img"></span> 提交 </a> </div> .footer { margin-top: 57px; } .footer .footer-text { font-size: 17px; position: fixed; bottom: 0; width: 100%; background-color: #eec73f; text-align: center; color: #fff; line-height: 55px; text-decoration: none; } .footer .img { height: 18px; width: 18px; background-size: 18px; background-repeat: no-repeat; background-position-y: center; margin-right: 7px; margin-bottom: -3.5px; display: inline-block; background-image: url("imgUrl"); }
5. 无论右边高度如何遍, 左边永远在正中间, 将2的spacing加上一个align-items:
<div class="spacing"> <span class="spacing-left"></span> <span class="spacing-right">测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span> </div> .spacing { padding: 17px 14px; font-size: 14px; display: flex; align-items: center } //左边一定要有个宽度 .spacing .spacing-left { background-image: url("imgurl"); height: 17px; width: 17px; background-size: 17px; background-repeat: no-repeat; background-position-y: center; margin-right: 9px; margin-top: 1px; } .spacing .spacing-right { flex: 1; text-align: justify; //用于让文字的宽度100% }
6. 标签样式, 随宽度变化
<i class="tag">标题</i> .tag { display: inline-block; //宽度自适应 color: #fff; background-color: #eec73f; font-size: 11px; border-radius: 2px; padding: 3.75px; font-style: normal; }
7. 移动端自适应方案:<script src="http://g.tbcdn.cn/mtb/lib-flexible/{{version}}/??flexible_css.js,flexible.js"></script>
出自 https://github.com/amfe/lib-flexible
1) 使用方法
建议对于js做内联处理,在所有资源加载之前执行这个js。
执行这个js后,会在html(也就是document.documentElement)上增加一个data-dpr属性,以及font-size样式。
之后页面中的元素,都可以用rem单位来设置。html上的font-size就是rem的基准像素。
2) 把视觉稿中的px转换成rem
首先,目前视觉稿大小分为640,750以及,1125这三种。当前方案会把这3类视觉稿分成100份来看待(为了以后兼容vh,vw单位)。每一份被称为一个单位a。
同时,1rem单位认定为10a。拿750的视觉稿举例:
1a = 7.5px
1rem = 75px
例如240px * 120px的元素,最后转换为3.2rem * 1.6rem。
3) 字体不使用rem的方法
字体的大小不推荐用rem作为单位。所以对于字体的设置,仍旧使用px作为单位,并配合用data-dpr属性来区分不同dpr下的的大小。
例如:
div {
width: 1rem;
height: 0.4rem;
font-size: 12px; // 默认写上dpr为1的fontSize
}
[data-dpr="2"] div {
font-size: 24px;
}
[data-dpr="3"] div {
font-size: 36px;
}
4) 手动配置dpr
引入执行js之前,可以通过输出meta标签方式来手动设置dpr。语法如下:
<meta name="flexible" content="initial-dpr=2,maximum-dpr=3" />
其中initial-dpr会把dpr强制设置为给定的值,maximum-dpr会比较系统的dpr和给定的dpr,取最小值。注意:这两个参数只能选其一。
5) 手动设置rem基准值的方法
例如:
html {font-size: 60px!important;}
8. 栅格布局.引入bootstrap
container, 根据屏幕大小宽度为: None(手机), 750px(平板), 970px(桌面), 1170px(大桌面)
将.container 修改为 .container-fluid,就可以将固定宽度的栅格布局转换为 100% 宽度的布局。
分类col-xs-X, .col-sm-X, .col-md-X, .col-lg-X, .col-md-offset-X(.col-X-offset-X), 每个row里面的col大于12.会另起一行
超小屏幕和中等屏幕设备使用.col-xs-X 和 .col-md-X。如:<div class="col-xs-12 col-md-8"></div>
平板设备使用 .col-sm-X
列偏移使用.col-md-offset-X, 为当前元素增加了左侧的边距
<div class="row"> <div class="col-md-6"></div> <div class="col-md-6"></div> </div>
9. img src为空时多了边框的解决方案
1) 加个默认的图片
<img src="图片" onerror="errorFun(this)"> <script> function errorFun(a){ a.onerror=null; a.src='默认图片'; console.log('图片出错的时候调用默认的图片'); } </script>
2) 将img包在一个div中
<div class="test"> <img src="" class="img"> </div> .test { height: 67px; width: 67px; border-radius: 50%; margin: auto; overflow: hidden; } .img { height: calc(67px + 2px); width: calc(67px + 2px); border-radius: 50%; margin: -1px; }
3) 将img标签换位div的backgrund
<div class="test"></div> .test { background: url('图片'); height: 67px; width: 67px; background-size: 67px; border-radius: 50%; position: absolute; left: 50%; margin-left: -33.5px; }
10. css实现箭头, 凹箭头
图一:图二:
图三:
图一代码
<div class="pre"></div> .pre { border-style: dashed solid dashed dashed; height: 0; line-height: 0; font-size: 0; overflow: hidden; background: blue; display: inline-block; width: 50px; } .pre { border-width: 14px; border-color: transparent #fff transparent transparent; }
图二,图三:
<div class="button">GO</div> <button class="button back">Back</button> .button, .back { width: 130px; background: linear-gradient(to bottom, #4eb5e5 0%,#389ed5 100%); border: none; border-radius: 5px; position: relative; border-bottom: 4px solid #2b8bc6; color: #fbfbfb; text-shadow: 1px 1px 1px rgba(0,0,0,.4); font-size: 15px; text-align: left; text-indent: 5px; cursor: pointer; margin: 0 auto; margin-bottom: 20px; } .button { height: 36px; line-height: 36px; } .button:after { content: ""; border-top: 20px solid #187dbc; border-bottom: 20px solid #187dbc; border-left: 16px solid transparent; border-right: 20px solid #187dbc; position: absolute; opacity: 0.6; right: 0; top: 0; border-radius: 0 5px 5px 0; } .back { height: 40px; text-align: right; padding-right: 12px; } .back:after { content: ""; width: 0; border-top: 20px solid #187dbc; border-bottom: 20px solid #187dbc; border-right: 16px solid transparent; border-left: 20px solid #187dbc; position: absolute; opacity: 0.6; left: 0; top: 0; border-radius: 5px 0 0 5px; }
11. input 在ios环境下,input选中出现灰色背景
input { border: none; background-color: transparent; padding-left: 15px; font-size: 14px; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-appearance: none; appearance: none; &:focus { border: none; outline: none; background-color: transparent; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-appearance: none; appearance: none; } &:visited { border: none; outline: none; background-color: transparent; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-appearance: none; appearance: none; } }
12.tab样式, 根据文字的长度, tab下的线不一样长
<div class="header"> <ul class="tab-list"> <li class="tab active"><span >Tab1</span></li> <li class="tab"><span>Tab2</span></li> </ul> </div> .header { position: fixed; top: 0; height: 44px; width: 100%; z-index: 10; .tab-list { font-size: 14px; color: #555; border-bottom: 1px solid #ddd; display: -moz-box; display: -webkit-box; display: -ms-box; display: -o-box; display: box; list-style: none; padding-left: 0; margin-top: 0; background-color: #fff; } .tab { -webkit-box-flex: 1; -ms-box-flex: 1; -o-box-flex: 1; box-flex: 1; text-align: center; } span { display: inline-block; line-height: 44px; } .active { span { border-bottom: 4px solid; color: red; } } }
13.用CSS控制最多显示多少行, sass
.multi-text-overflow(@rows) { text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: @rows; -webkit-box-orient: vertical; overflow: hidden; vertical-align: middle; }
14. 未知宽度的水平居中
<a class="pre-sale-box ng-scope" href="javascript:void(0)"> <span class="span-one">原价购买</span> <span class="span-two ng-binding">¥1234567891.11</span> </a> .pre-sale-box{ position: relative; background-color: #FFD8D8; border: 1px solid #F23030; color: #F23030; width: 148px; height: 48px; margin: 0; margin-right: 20px; float: left; & .span-one{ position: absolute; top:3px; left:50%; font-size: 16px; color: #F23030; margin-left:-32px; font-weight:900; } & .span-two{ position: absolute; top:25px; font-size: 16px; color: #333333; left:50%; transform:translateX(-50%); -webkit-transform:translateX(-50%); -moz-transform:translateX(-50%); -ms-transform:translateX(-50%); -o-transform:translateX(-50%); } }