Skip to content

13 CSS 响应式

  • rem 是什么?
  • 响应式布局的常见方案?

rem 是什么?

  • px:像素,绝对长度单位,是相对于显示器屏幕分辨率而言的
  • em:相对于父元素的字体大小
  • rem:相对长度单位,相对于根元素(html)的字体大小的单位,常用于响应式布局
    • 1rem = 1html 字体大小,2rem = 2html 字体大小
    • 优点:可以根据根元素的字体大小,实现响应式布局;适用于移动端和 PC 端
    • 缺点:需要手动设置根元素的字体大小;需要计算根元素的字体大小
  • rpx:微信小程序的响应式单位,根据屏幕宽度进行等比例缩放
  • vh/vw:视口单位,相对于视口(viewport)的宽度和高度,视口单位可以用来实现响应式布局
查看代码
html
<div>
  <label for="fontSizeInput">根元素字体大小(px):</label>
  <input type="number" id="fontSizeInput" value="16" min="10" max="20" step="1" />
  <button id="updateFontSize">更新字体大小</button>
</div>

<div class="container">
  <p class="small-text">这是一段小文本,使用 0.75rem。计算后的 font-size 为<span></span></p>
  <p class="medium-text">这是一段普通文本,使用 1rem。计算后的 font-size 为<span></span></p>
  <p class="large-text">这是一段大文本,使用 1.5rem。计算后的 font-size 为<span></span></p>
  <p class="x-large-text">这是一段超大文本,使用 2rem。计算后的 font-size 为<span></span></p>
</div>
css
html {
  font-size: 16px; /* 基准字体大小 */
}

body {
  font-family: Arial, sans-serif;
  line-height: 1.5;
}

.container {
  padding: 1rem;
  border: 1px solid #ccc;
  margin: 2rem 0;
}

.small-text {
  font-size: 0.75rem; /* 小文本 */
}

.medium-text {
  font-size: 1rem; /* 默认大小文本 */
}

.large-text {
  font-size: 1.5rem; /* 大文本 */
}

.x-large-text {
  font-size: 2rem; /* 超大文本 */
}
js
document.getElementById('updateFontSize').addEventListener('click', function () {
  const fontSizeInput = document.getElementById('fontSizeInput').value
  document.documentElement.style.fontSize = fontSizeInput + 'px'

  updateComputedValues()
})

function updateComputedValues() {
  const elements = document.querySelectorAll('.container p')
  elements.forEach((element) => {
    const elementFontSize = getComputedStyle(element).fontSize
    const span = element.querySelector('span')
    span.innerText = elementFontSize
  })
}

updateComputedValues()

响应式布局的常见方案?

  • 媒体查询 media query: 根据不同的屏幕尺寸,设置不同的样式(例如设置根元素的字体大小,设置不同元素的宽度等)
  • rem 布局:根据根元素的字体大小,实现响应式布局
  • vw/vh 布局:根据视口的宽度和高度,实现响应式布局
查看代码
html
<div>
  <span>当前页面宽度:<span id="currentWidth"></span>px</span>
  <hr />
  <p>媒体查询</p>
  <ul>
    <li>小于等于 576px: 10px</li>
    <li>577px 到 768px: 16px</li>
    <li>769px 到 992px: 22px</li>
    <li>993px 到 1200px: 28px</li>
    <li>大于等于 1201px: 34px</li>
  </ul>
</div>

<div class="container" style="padding: 1rem; border: 1px solid #ccc; margin: 2rem 0;">
  <p style="font-size: 1rem;">这是一段普通文本,使用 1rem。计算后的 font-size 为<span></span></p>
</div>
css
html {
  font-size: 16px; /* 基准字体大小 */
}

/* 媒体查询*/
@media only screen and (max-width: 576px) {
  html {
    font-size: 10px;
  }
}

@media only screen and (min-width: 577px) and (max-width: 768px) {
  html {
    font-size: 16px;
  }
}

@media only screen and (min-width: 769px) and (max-width: 992px) {
  html {
    font-size: 22px;
  }
}

@media only screen and (min-width: 993px) and (max-width: 1200px) {
  html {
    font-size: 28px;
  }
}

@media only screen and (min-width: 1201px) {
  html {
    font-size: 34px;
  }
}
js
function updateDisplay() {
  // 更新当前页面宽度
  const currentWidth = document.documentElement.clientWidth
  document.getElementById('currentWidth').innerText = currentWidth

  // 更新计算后的字体大小
  document.querySelectorAll('.container p').forEach((element) => {
    const elementFontSize = getComputedStyle(element).fontSize
    const span = element.querySelector('span')
    span.innerText = elementFontSize
  })
}

// 当页面加载和调整大小时更新显示
window.addEventListener('load', updateDisplay)
window.addEventListener('resize', updateDisplay)