如何使用 css 包含在 html 中出现和消失的方块
how to include blocks that appear and disappear in html using css
我在讲座中使用 bookdown (html) 而不是幻灯片。我真的很想创建 appear/disappear 的块来包含问题的解决方案。
大概我可以通过 css 来完成。但我现在不知道如何做到这一点,并且还包括我的 css 而不会弄乱 bookdown css
示例:
问题:bla bla bla ?
解决方案uncover
当我点击 uncover 时,我可以显示我的 R 代码和输出。
那太好了:)
你可以通过 knitr hooks 实现你想要的。当你为code chunk设置一个hook选项时(本例uncover = TRUE
),会触发相应的hook函数uncover
,hook可以在生成的html代码前后写入一些东西从块输出。
在下面的代码中,我首先定义了一个Javascript函数function uncover(id)
,它可以通过id发现某些html元素。我让钩子 uncover
生成一个 html 按钮,它在块输出之前调用 Javascript 函数,并用具有特定 id 和 [=17 的 div
包装输出=]none`。您可以对下面的代码进行修改以适应您的需要,但思路是这样的。
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
uncover <- function(before, options, envir) {
if (before) {
id <- options$id
button_string <- paste0("<button onclick=\"uncover('",
id,
"')\">Uncover</button>")
div_string <- paste0("<div id = '", id,
"', style = 'display:none'>")
paste0(button_string, "\n", div_string)
}
else {
"</div>"
}
}
knitr::knit_hooks$set(uncover = uncover)
```
<script>
function uncover(id) {
var x = document.getElementById(id);
x.style.display = 'block';
}
</script>
```{r, uncover = TRUE, id = "script"}
1 + 1
```
编辑于 2020 年 5 月 3 日
目前,knitr 或 pandoc 或工具链中的其他东西拒绝将不可见的 markdown 元素转换为有效的 HTML,因此上述解决方案无法完美运行。一种解决方案是首先使所有内容可见,但提供一个按钮来隐藏它们,如下所示:
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
uncover <- function(before, options, envir) {
if (before) {
id <- options$id
button_string <- paste0("<button onclick=\"uncover('",
id,
"')\">Uncover</button>")
div_string <- paste0("<div id = '", id,
"' class = 'cover'>")
paste0(button_string, "\n", div_string)
}
else {
"</div>"
}
}
knitr::knit_hooks$set(uncover = uncover)
```
```{r, uncover = TRUE, id = "script"}
1 + 1
```
<script>
function uncover(id) {
var x = document.getElementById(id);
x.style.display = 'block';
}
function cover() {
var xs = document.getElementsByClassName('cover');
for(count = 0; count < xs.length; count++) {
xs[count].style.display = 'none';
}
}
</script>
<button onclick="cover()">Cover all</button>
我在讲座中使用 bookdown (html) 而不是幻灯片。我真的很想创建 appear/disappear 的块来包含问题的解决方案。 大概我可以通过 css 来完成。但我现在不知道如何做到这一点,并且还包括我的 css 而不会弄乱 bookdown css
示例:
问题:bla bla bla ?
解决方案uncover
当我点击 uncover 时,我可以显示我的 R 代码和输出。 那太好了:)
你可以通过 knitr hooks 实现你想要的。当你为code chunk设置一个hook选项时(本例uncover = TRUE
),会触发相应的hook函数uncover
,hook可以在生成的html代码前后写入一些东西从块输出。
在下面的代码中,我首先定义了一个Javascript函数function uncover(id)
,它可以通过id发现某些html元素。我让钩子 uncover
生成一个 html 按钮,它在块输出之前调用 Javascript 函数,并用具有特定 id 和 [=17 的 div
包装输出=]none`。您可以对下面的代码进行修改以适应您的需要,但思路是这样的。
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
uncover <- function(before, options, envir) {
if (before) {
id <- options$id
button_string <- paste0("<button onclick=\"uncover('",
id,
"')\">Uncover</button>")
div_string <- paste0("<div id = '", id,
"', style = 'display:none'>")
paste0(button_string, "\n", div_string)
}
else {
"</div>"
}
}
knitr::knit_hooks$set(uncover = uncover)
```
<script>
function uncover(id) {
var x = document.getElementById(id);
x.style.display = 'block';
}
</script>
```{r, uncover = TRUE, id = "script"}
1 + 1
```
编辑于 2020 年 5 月 3 日 目前,knitr 或 pandoc 或工具链中的其他东西拒绝将不可见的 markdown 元素转换为有效的 HTML,因此上述解决方案无法完美运行。一种解决方案是首先使所有内容可见,但提供一个按钮来隐藏它们,如下所示:
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
uncover <- function(before, options, envir) {
if (before) {
id <- options$id
button_string <- paste0("<button onclick=\"uncover('",
id,
"')\">Uncover</button>")
div_string <- paste0("<div id = '", id,
"' class = 'cover'>")
paste0(button_string, "\n", div_string)
}
else {
"</div>"
}
}
knitr::knit_hooks$set(uncover = uncover)
```
```{r, uncover = TRUE, id = "script"}
1 + 1
```
<script>
function uncover(id) {
var x = document.getElementById(id);
x.style.display = 'block';
}
function cover() {
var xs = document.getElementsByClassName('cover');
for(count = 0; count < xs.length; count++) {
xs[count].style.display = 'none';
}
}
</script>
<button onclick="cover()">Cover all</button>