Web 技术共存

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费额度!

作为初学者,理解学习的不同语言之间如何相互作用可能会让人感到困惑。 我认为我们可以将各种语言配对,看看它们在哪里交叉和通信。

HTML 和 CSS

您需要 HTML 才能使用 CSS,因为 HTML 调用 CSS。 在 HTML 文档中,您可能会看到一些类似这样的 HTML

<link rel="stylesheet" href="style.css">

这是一个调用某些 CSS 的 HTML 元素(<link>),然后这些 CSS 将应用于 HTML。 或者您可能会看到一个这样的“样式块”

<!-- this <style> tag is HTML -->
<style>
  /* The stuff in here is CSS */
  .message {
     padding: 20px;
     background: lightyellow;
     border: 1px solid yellow;
  }
</style>

HTML 和 CSS 之间的典型连接是通过选择器。 HTML 元素可能具有 ID 或类,它本身的作用不大,但 CSS 可以通过它来查找并对其进行样式设置。 比如

<div class="module message">
  <h2 class="positive">
    Good afternoon!
  <h2>
  <p>
    You look nice today.
  </p>
</div>
.module { /* will apply to <div class="module message"> */
  padding: 20px;
  background: rgba(0, 0, 0, 0.2);
}
.message { /* will apply to <div class="module message"> */
  border: 1px solid yellow;
}
.positive { /* will apply to <h2 class="positive"> */
  color: lightblue;
  font-weight: bold;
}

CSS 甚至可以直接应用于 HTML 中的元素。 在这种情况下,没有选择器,只有属性和值

<div style="padding: 10px; background: red; color: white;">
  Emergency!
</div>

通常不建议以这种方式使用 CSS,因为它没有充分利用 HTML 和 CSS 共同发挥出色作用的地方:分离内容和样式。

HTML 和 JavaScript

您需要 HTML 来调用 JavaScript。 在 HTML 文档中,您可能会看到

<script src="script.js"></script>

这是一个调用 JavaScript 文件的 HTML 元素(<script>),然后该文件将在该文档中运行。 或者您可能会看到一个没有源代码的脚本标签,一个内联脚本块

<!-- the <script> tag is HTML -->
<script>
  // The stuff in here is JavaScript
  var header = document.getElementById("main-header");
</script>

您还可能会在 HTML 元素上看到直接的 JavaScript,如下所示

<button onclick="doSomething();"></button>

通常不建议这样“内联”使用 JavaScript,因为它效率不高,并且没有分离内容和交互的关注点。

HTML 和 JavaScript 之间的另一种关系是 JavaScript 可以控制 DOM。 DOM 本质上是浏览器读取 HTML 后将其转换为的内容。 您可以在 此处阅读更多相关信息

JavaScript 可以创建新的 HTML 并将其插入页面

// Create new element
var modal = document.createElement('div');

// Set attributes and content
modal.id = "modal";
modal.innerHTML = "\
  <h1>Important Message</h1>\
  <p>You're cool.</p>";

// Put in the <body>
document.documentElement.appendChild(modal);

JavaScript 也可以从页面中删除元素

var reference = document.getElementById("goner");
reference.parentNode.removeChild(reference);

JavaScript 还可以更改现有元素的内容

var reference = document.querySelectorAll("#modal > h1");
reference[0].innerHTML = "This title has been changed by JS!";

JavaScript 和 CSS

JavaScript 可以获取有关元素样式的信息

<div style="color: red;" id="test">test</div>
<script>
  var div = document.getElementById("test");
  console.log(div.style.color);
  // red

  // and/or *set* it like:
  div.style.padding = "10px";
</script>

但这仅适用于元素的内联style属性(或以这种方式设置的样式)。 JavaScript 还可以获取元素上的所有样式,即使这些样式来自其他地方的 CSS 也是如此

<style>
  .test {
     margin: 30px;
  }
<style>

<div class="test"></div>

<script>
  var div = document.querySelectorAll(".test")[0];

  var styles = getComputedStyle(div);

  console.log(styles.margin);
  // 30px
</script>

更常见的是,因为 JavaScript 是我们处理网站交互的主要方式,所以我们使用它来控制其他元素。 这是一个简单的示例,它演示了一个按钮,当单击时,它会切换您是否可以看到另一个元素

<button class="button">Toggle Another Element</button>

<div id="message">Message</div>
var button = document.querySelectorAll(".button")[0];
var message = document.querySelectorAll("#message")[0];

button.addEventListener("click", function() {
  if (message.style.display == "block") {
    message.style.display = "none";
  } else {
    message.style.display = "block";
  }
});

也许更常见(并且通常被认为是负责任的)是仅操作元素的类名,而不是直接操作样式。 然后让 CSS 处理样式(包括它是否可见)。 无论如何,最终会更容易

#message {
  display: none;
}
#message.show {
  display: block;
}
var button = document.querySelectorAll(".button")[0];
var message = document.querySelectorAll("#message")[0];

button.addEventListener("click", function() {
  message.classList.toggle("show");
}, false);

查看 Chris Coyier 在 CodePen 上创建的笔 qidGm。 (@chriscoyier)

HTML 和 PHP

您使用的 HTML 实际上可能位于 PHP 等后端语言中,并被处理并作为 HTML 传递。 想象一下博客的模板

<h1>
  <?php echo $postTitle; ?>
</h1>
<div class="post-content">
  <?php echo $postContent; ?>
</div>

在本文中,我们只是使用 PHP 作为后端语言的示例。 但它也可能很容易是 Ruby 或 Python 或类似的语言。

您会在那里识别出 HTML,但 PHP 混合其中。 这只是输出后端语言可能负责的值的通用示例。 Web 浏览器永远不会看到这样的代码。 在它到达浏览器之前,它看起来就像普通的 HTML

<h1>
  How To Survive A Flight Delay Without Tweeting About It
</h1>
<div class="post-content">
  Step one, grow up.
</div>

作为前端人员,您可能会将 PHP 视为数据库中的信息与 HTML 之间的链接。

另一种可能性是根据您在服务器上知道的信息输出不同的 HTML。

<?php $userLikesCheese = doesUserLikeCheese($user); ?>

<?php if ($userLikesCheese) { ?>
  <div class="modal">
    Congrats on loving cheese, cheese lover!
  </div>
<?php } else { ?>
  <div class="modal">
    Some other way more boring widget.
  </div>
<?php } ?>

PHP 和 JavaScript

说到数据库,您可能需要来自服务器的 JavaScript 信息。

JavaScript 还可以自行向 URL 发出请求。 想象一下,在页面上点击“赞”按钮。 您不会期望这会刷新整个页面。 相反,此操作可能会向服务器上的 PHP 文件发出请求,该文件的工作是保存该信息。

var button = document.querySelectorAll(".button")[0];

button.addEventListener("click", function() {
  var xhr = new XMLHttpRequest();
  xhr.onload = likeSuccess;
  xhr.open("get", "/save_like.php", true);
  xhr.send();
});

function likeSuccess() {
  button.innerHTML = "You Like Stuff!";
}

查看 Chris Coyier 在 CodePen 上创建的笔 gomvI。 (@chriscoyier)

PHP 和 CSS

就像 PHP 文档可以被处理并作为 HTML 提供服务一样,CSS 也可以这样做。 这意味着您可以执行诸如在 CSS 中利用 PHP 变量的功能。 我之前写过这方面的内容,但我认为今天这不是一个特别好的主意。 我建议改为查看 CSS 预处理

另一个连接是使用 PHP 更改类名或属性,然后 CSS 据此采取行动。

<body class="<?php echo $bodyClass; ?>">

  <header>
     Probably a logo and stuff.
  </header>

</body>
header {
  height: 100px;
}

/* header is bigger on homepage */
body.home header {
  height: 200px;
}

当然,事情会变得更加复杂。

这应该是不言而喻的,对吧? 有时候就是这样。 但这些不仅仅是“基础知识”——它们是更复杂事物构建的基础概念。

也许您学习了如何使用 jQuery 发出 Ajax 请求,它看起来与我上面做的不同。 那么,在用 JavaScript 编写的 jQuery 库中的某个地方,它正在执行相同的操作。 它只是在那里添加了一些额外的内容,以确保它在旧版浏览器中也能正常工作,并为您提供便利。

也许您正在使用 Angular,并且您在页面上更改内容的方式是在 HTML 中使用奇怪的{{尖括号}}。 这很巧妙,但在某个地方 Angular 正在使用“原始”JavaScript 执行某些操作。 正在使用.innerHTML或替换节点,谁知道呢。 Angular 的开发人员找到了最好的方法,这就是它所做的。

也许您在工作中使用的 CMS 具有不同的模板系统。 那就太酷了。 我敢打赌,在它到达浏览器之前,它会被转换为 HTML,因为这就是这一切的运作方式。

重点:它们都是相关的。

您可能在某些语言方面比其他语言更擅长。 我们所有人都是。 完全没问题。 但了解它们如何组合在一起非常重要。 这就是我们所有人的工作。

我的灵感来自我自己的困惑,当我听到一些初创公司的员工滔滔不绝地谈论他们的“技术栈”时,我根本不理解所有这些东西如何可能组合在一起构建一个东西。 我仍然感到困惑,但这并不重要。 我理解这些部分如何组合在一起,因此我从未听说过的任何部分肯定只是处理我们所有人都在处理的 Web 技术拼图的相同部分的某种新奇方式。