css进阶

flex布局

1.行内块状都可设为flex
2.设为flex布局后,子元素float,clear,vertical-align失效
3.设置在容器的属性:

flex-direction:  项目水平还是垂直排列
flex-wrap:水平(换行方式)
justify-content: 水平(左右居中贴边环绕?)
align-items: 垂直(上下居中拉扯?)
align-content:垂直(上下居中贴边环绕?)多行
flex-flow:flex-direction和flex-wrap简写,用处不大

4,设置在子元素的属性: 

order: 权重(越大排列越靠后)
align-self:覆盖align-items,子元素自己的垂直方式
flex-grow:放大比例(空间多余)
flex-shrink:缩小比例(空间不够)
flex-basis:占据固定空间(计算空间多余或不够之前就固定了)
flex:以上三个的缩写

5,应用场景
将第一张图使用flex布局成第二个图 
            

 代码:

<div class="back">
  <span class="point"></span>
  <span class="point"></span>
</div>

<style>
 .back{
width:100px;
height:100px;
background:red;
display:flex;
justify-content:space-between; //水平方向贴边
}
.point{
width:20px;
height:20px;
background:black;
border-radius:10px;
display:block;
}
.point:nth-of-type(2){
align-self:flex-end; //子元素自身,垂直方向,贴下边缘
}
</style>

BFC

BFC就是块级格式化上下文。就是一个隔离容器,在这个容器里面的布局不会影响到外部的元素。

BFC规则
1,内部元素从顶部垂直排列
2,内部元素贴边
3,内部相邻元素margin重叠
4,内部float元素高度也被包含
5,外部不与float重叠

产生BFC条件

float            除了none以外 
overflow     除了visible 以外(hidden,auto,scroll )
display       (flex,inline-block,inline-flex,table-cell,table-caption)
position      (absolute,fixed)
html
不常见:contain,多列容器,fieldset元素

补充:
假如是display:flex(第一条规则flex的优先级大于BFC规则,也就是BFC内部元素水平排列) 
针对第三条BFC规则,其实任何相邻块级元素的margin都会重叠
针对第二条规则,其实大部分的元素都贴边

BFC使用场景(作用):
1,避免外边距重叠(创造BFC:  将两个元素分别包裹在div中,这个div设置overflow:hidden)
2,清除浮动(父元素包裹子元素,子元素float:left,父元素高度坍塌,此时令父元素overflow:hidden,可以清除浮动,高度被子元素撑起来)
3,阻止浮动元素的覆盖(两个兄弟元素,第二个元素设置float:left,第一个元素被第二个覆盖,此时给第一个元素设置overflow:hidden,就可以不被覆盖)
4,两栏自适应布局

一个实例:div里包含img和p,希望图片在左,文字在右

<div>
    <img />
    <p>
</div>

 目前状态:                     

img{
float:left;   //脱离文档流,父级高度坍塌
}
div{
overflow:hidden;  //产生BFC,(内部渲染不影响外部)清除了浮动,父级div高度为img高度(解决坍塌)
}
p{
oveflow:hidden; //产生BFC,自己的渲染不影响外部(img),p的宽度为div-img,而不是div(解决宽度)

 盒子模型

1,如何使得一个盒子无论width如何变化,它的实际宽度都是固定的?

使用box-sizing: border-box;  则该元素的border和padding不会额外增加宽度,而是借用width宽度绘制。

拖动事件

核心属性: draggable="true"

核心事件:
2,ondragstart
3,ondragover
4,ondrop

核心方法:
1, e.dataTransfer.setData
2,e.preventDefault(默认是不允许drop,这边屏蔽一下)
3,e.dataTransfer.getData

<html>
<style>
.start,.end{
  width:200px;
  height:200px;
  border:1px solid red;
  }
  .move{
  width:50px;
  height:50px;
  background:red;
  }
</style>
<body>

 <div class="start"  >
 	<div class="move" draggable="true" ondragstart="start(event)" id="start0"></div>
 </div>
 <div class="end" ondrop="drop(event)"  ondragover="allowdrop(event)" id="end0"></div>
</body>
<script>
function start(e){
e.dataTransfer.setData("text", e.target.id);
}
function allowdrop(e){
e.preventDefault();
}
function drop(e){
var id=e.dataTransfer.getData("text")
 var item=document.getElementById(id);
 e.target.appendChild(item);
}
</script>
</html>

position

static:用于取消继承
relative:相对于自身原来位置定位(占据文档流)
absolute:父级是relative,absolute,则相对于父级定位,否则相对于body定位(不占文档流)
fixed:相对于浏览器定位

图片懒加载

懒加载:图片列表太长,还没进入屏幕的时候不给src,进入屏幕的时候才给src,并发起请求。

核心思想:获取图片到可视区域的距离,假如小于0,则为src赋值

获取图片到可视区域的距离:clientHeight,offsetTop,scrollTop

代码:

<body>
    <img data-src="./images/1.jpg" alt="">
    <img data-src="./images/2.jpg" alt="">
    <img data-src="./images/3.jpg" alt="">
</body>
<script>
        var imgs = document.querySelectorAll('img');

        function getTop(e) {
            var T = e.offsetTop;
            while(e = e.offsetParent) {
                T += e.offsetTop;
            }
            return T;
        }

        function lazyLoad(imgs) {
            var H = document.documentElement.clientHeight;//获取可视区域高度
            var S = document.documentElement.scrollTop || document.body.scrollTop;
            for (var i = 0; i < imgs.length; i++) {
                if (H + S > getTop(imgs[i])) {
                    imgs[i].src = imgs[i].getAttribute('data-src');
                }
            }
        }

        window.onload = window.onscroll = function () {  
            lazyLoad(imgs);
        }
</script>

px rem em

 rem是相对于html的font-size属性的单位。

em是相对于当前元素的font-size,如果当前元素没有设置font-size,则相对于浏览器默认font-size(18px),(注意:当前元素没有设置但是可以继承父级的也算是有这个font-size属性)。

场景实例

1,使用css实现一个箭头

<div class="arrow" ></div>
<style>
.arrow{
width:0;
height:0;
border:0;
border-left:10px solid red;
}
</style>

2,实现垂直居中的几个方法假如是大div里套着小div,样式如下:

假设初始化是这样的,大div套小div

 方法一:position+transform

.inner{ 
 /*这么写*/
 margin:auto;
 position:relative;
 top:50%;
 transform:translateY(-50%);
  /*或者这么写*/
  position:relative;
  top:50%;
  left:50%;
  transform:translate(-50%,-50%);
}

 方法二:flex

.outer{
display:flex;
justify-content:center;
align-items:center;
}

 方法三: table-cell+inline-block

.outer{
 display: table-cell;
 vertical-align: middle;
 text-align: center;
}
.inner{
 display:inline-block;
}

方法四:position+calc

.inner{
position:relative;
top:calc(50% - 50px);
left:calc(50% - 50px);
}

3,实现一端固定,一端自适应

方法一:calc

.left{
width:100px;
}
.right{
width:calc(100%-100px)
}

方法二:flex:1

.father{
display:flex;
}
.left{
width:100px;
}
.right{
flex:1;
}

方法三:float

.left{
width:100px;
float:left;
}
.right{
height:50px;
}

方法四:absolute+right:0

.father{
position:relative;
}
.left{
width:50px;
}
.right{
position:absolute;
top:0;
left:50px;
right:0
}

方法五:table+table-cell

.father{
display:table;
}
.left{
display:table-cell;
width:50px;
}
.right{
display:table-cell;
}

方法六:grid+grid-template-columns

.father{
display:grid;
grid-template-columns:50px auto;
}

4,实现一条高度为0.5px的线?

:before,scale(0.5)

5,获取第三个p元素

.father p:nth-child(3){
background:red;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值