마이크로CMS에서 출력된 iframe을 스펀지로 처리한 사연입니다.
며칠 전, Nuxt.js+마이크로CMS+Netlify로 블로그를 만들었습니다.
스케줄러:별거 아니지만여기.
그때 마이크로CMS로 묻어둔 아이프람이 스마트폰 화면을 넘어서는 문제에 부딪혔기 때문에 어떻게 해결됐는지 정리해보자.
문제점
마이크로CMS에서 리치 편집기에 iframe을 포함하면 다음 형식으로 출력됩니다.
유튜브
<iframe width=\"480\" height=\"270\" src=\"https://www.youtube.com/embed/41Ia291KIvI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>
( 참고 문장 )대개 직접 지정
width
과height
는 좋지 않을 것 같습니다.그럼, 왜요?
해결편
아래의 기사는 참고가 되었다.
나는 이것과 같은 것을 iframe에 적용했으면 좋겠다고 생각했다.스케줄러:좀 무리하지만...
또한 다음과 같이 asyncData가 수정되었습니다.
async asyncData ({ params, $config, error }) {
try {
const { data } = await axios.get(
$config.apiBaseUrl + `/api/v1/blog/${params.slug}`,
{
headers: { 'X-API-KEY': $config.apiKey }
}
)
const $ = cheerio.load(data.body)
$('pre code').each((_, elm) => {
const result = hljs.highlightAuto($(elm).text())
$(elm).html(result.value)
$(elm).addClass('hljs')
})
$('iframe').each((_, elm) => {
const wrapDiv =
$('<div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;"></div>')
$(elm).wrap(wrapDiv)
$(elm).attr('width', null)
.attr('height', null)
.attr('style', 'border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;')
})
return {
...data,
body: $.html()
}
} catch (err) {
error({
statusCode: err.response.status
})
}
}
보고 싶은 부분$('iframe').each((_, elm) => {...})
입니다.하는 일은 아래와 같다.
width
, height
div, iframe 태그에 추가된 스타일은 주문처럼 나도 완전히 이해하지 못했어...
다만, div 라벨의 스타일에 쓰인padding-bottom의 수치는 상당히 중요하다.
유튜브의 화면 비율을 16:9로 고정하는 값이기 때문에 여기서는 반드시 이 수치를 먼저 설정해야 한다.
(즉, 다른 비율로 변경하려면 여기를 만져야 한다.)
이렇게 하면 유튜브가 안전하게 뜬다!
참고가 됐으면 좋겠어요.
Reference
이 문제에 관하여(마이크로CMS에서 출력된 iframe을 스펀지로 처리한 사연입니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ebiide/articles/322bce3a5270a88bebdc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)