【八股】HTML+CSS

127 阅读6分钟

HTML5新特性

新增标签 语义化标签header footer section article nav aside + 多媒体标签 audio video

标签语义化的好处:

  1. HTML结构清晰 代码可读性好
  2. 便于搜索引擎优化SEO
  3. 便于无障碍阅读

CSS3新特性

。。todo

css优先级和权重

!important > 行内样式 > id > class/伪类 > 标签/伪元素 > *通配符/继承

从0开始,一个行内样式+1000,一个id+100,一个属性选择器/class或者伪类+10,一个元素名,或者伪元素+1

1px问题 && 如何画0.5px的线?

DPR(devicePixelRatio) 设备像素比,设备的物理像素和css像素的比值。 就是要画更细的线 比如0.5px的

(以横线为例) 1.transform做

.hr.scale-half {
    height: 1px;
    transform: scaleY(0.5);
    transform-origin: 50% 100%;
}

如果是画边框的话 要配合伪元素 不然整个dom都缩小了

.border-1px{
position: relative;
    &::before {
        content:"";
        display:block;
        position:absolute;
        left:0;
        top:0;
        width:200%;
        height:200%;
        border:1px solid red;
        transform:scale(0.5,0.5)
        transform-origin:0 0 ;
        box-sizing:border-box;
    }
}

box-sizing:border-box;

transform变形:不引起回流和重绘

包括 translate scale skew rotate matrix

transform-origin:(x,y)变形的基点

默认是中心点 50% 50%

2.线性渐变linear-gradient

创建一个线性渐变的图片 默认从上到下渐变

background-image: linear-gradient(direction, color-stop1, color-stop2, ...);
/* 从下到上,从蓝色开始渐变、到高度40%位置是绿色渐变开始、最后以红色结束 */ 
linear-gradient(0deg, blue, green 40%, red);
.hr.gradient { 
    height: 1px; 
    background: linear-gradient(0deg, #fff, #000); //从下到上从白渐变到黑
}

3.box-shadow(部分支持)

box-shadow: offset-x offset-y blur spread color position;

.hr.boxshadow {
    height: 1px;
    background: none;
    box-shadow: 0 0.5px 0 #000;
}

伪元素和伪类选择器

伪元素新增了一个真实的DOM元素 如:after :hover 伪元素可以用::来表示也可以用:表示

伪类是选择DOM的一种状态 如:hover :active

px rem em vm vh %

px 像素 固定单位 由分辨率决定 比如常常听到的电脑像素是1024x768的,表示的是水平方向是1024个像素点,垂直方向是768个像素点

rem 相对于根元素html的font-size的倍数 1rem=根元素的字体大小

em 相对于父元素font-size大小的倍数

vm 相对于可视窗口的宽度 1vm是可视窗口的宽度的1%

vh 相对于可视窗口的高度 1vh是可视窗口的高度的1%

% 是相对于父元素的大小设定的比率,position:absolute;的元素是相对于已经定位的父元素,position:fixed;的元素是相对可视窗口

rem适配方案 淘宝的flexible.js

核心代码:

var docEl = document.documentElement; // 根元素,即<html></html>
function setRemUnit () {
  var rem = docEl.clientWidth / 10; 
  // 设置根元素的font-size,也就是1rem的大小(设置为1/10视图宽度)
  docEl.style.fontSize = rem + 'px';
}
setRemUnit();
window.addEventListener('resize', setRemUnit);

bug是宽度太大的设备 字体会放的太大

改进一下 readingApp的适配是

document.addEventListener('DOMContentLoaded',()=>{
  const html = document.documentElement
  let rem = (window.innerWidth / 10) > 50 ? 50 : window.innerWidth / 10 //最大是50
  html.style.fontSize = rem + 'px'
})

补充:document.documentElement.clientWidth和window.innerWidth是相等的 都是目前视口的宽度 reseize的时候改变

BFC + 边距塌陷问题

边距塌陷:

1、父子元素 2、相邻兄弟元素 3、没有padding和border的空元素

解决方法:给重叠元素创建BFC

1、父子给父添加overflow hidden 2、给相邻兄弟包一个div添加overflowhidden

Block Formatting Context 块级格式化上下文 一块独立的渲染区域,BFC的子元素与世隔绝,不会影响到外部其他元素。

父级元素添加以下任意样式触发BFC

overflow: hidden;
display: flex;
display: inline-block;
position: absolute或fixed

解决的问题:

1.清除浮动

2.垂直方向的margin重叠

清除浮动

浮动导致的问题是 子元素浮动脱标 父元素的塌陷

1.用伪类 父元素设置:before :after 伪类元素

.clearfix:after,.clearfix:before{ 
    content: ""; 
    display: block; 
    clear: both; 
}

2.给父元素overflow:hidden来触发BFC

两种盒子模型

content-box 内容盒模型(标椎盒子模型)

width = content宽度

border-box 边框盒模型(IE怪异盒模型)

width =content+padding+border

块级盒子水平居中

1.子绝父相+margin

父设relative子设absolute, top left设50%,margin-top和margin-left设自身的一半的负

2.子绝父相+transform

父设relative子设absolute, top left设50%,子的transform属性设为translate(-50%,-50%)

3.弹性布局

display:flex;
justify-content:center;
align-items:center;

雪碧图/精灵图

减少发请求次数 把小的背景图片整合到一张大图里

通过控制background-position x y(一般都是往上往左移动 所以取负值)

/*测量盒子大小*/
width: 100px;  
height: 112px; 
/*测量盒子位置*/
backgroud: url(images/index.png) no-repeat -327px -142px; 

定位和浮动

定位:position

static

relative 不脱离文档流(标准流) 保留原位置

absolute 脱离文档流 相对最近的有定位的父级元素定位

fixed 脱离文档流 看做特殊的absolute 相对可视窗口定位

sticky 不脱离文档流 必须有top、left、right、bottom任一才有效 fixed+relative 一般配合页面滚动使用 默认情况下它表现就和relative定位一样,但是当页面滚动区域大于你的目标区域(即sticky对应的元素区域)时,它的表现和fixed定位一样。(top等设的是阈值)

浮动:float

float和position区别 都脱离标准流

绝对和固定定位的元素会压住后面标准流的元素 但浮动元素后面的标准流中的元素会围绕浮动元素

浮动要搭配父元素 父元素控制文档流上下排列 浮动控制内部子元素左右 (定位和浮动后 行内元素可以设宽高)

圣杯双飞翼

中间内容最先加载,左右栏固定宽,中间自适应

三个div main left right外面包个div父元素

给父设displayflex

flex-direction默认是row justify-content默认是flex-start不用设

然后给main设order -1 排列到最左边

left和right 设 flex 0 0 固定宽度

main设flex 1

弹性布局实现

www.ruanyifeng.com/blog/2015/0…

父的属性 flex-direction column/row(default)/reverse

flex-wrap no-wrap wrap reverse

flex-flow flex-direction和flex-wrap的合写

justify-content flex-start(default)/end/center/spacearound spacebetween

align-items flex-start flex-end center stretch(default) baseline

align-content 换行的时候 有多根主轴 怎么对齐

子的属性 order 越小的排列越靠前

flex: flex-grow flex-shrink flex-basis (default 0 1 auto)

直接写flex 1 或者flex 0 0 固定值

align-self 默认继承父元素的align-items属性 可以自己设置

less