Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于xml属性为图像创建div覆盖_Javascript_Jquery_Html_Css_Xml - Fatal编程技术网

Javascript 基于xml属性为图像创建div覆盖

Javascript 基于xml属性为图像创建div覆盖,javascript,jquery,html,css,xml,Javascript,Jquery,Html,Css,Xml,我想创建一个div覆盖,设置为5%不透明度,这将在图像中的每一行文本周围创建一个对角线边界框。我有绘制边界框所需的四个点中的每个点的坐标,这些点被编码为XML元素中的属性,XML元素包含单独行的文本作为其数据。在我看来,因为我有四个角的x,y坐标,我应该能够创建覆盖层——但我不知道标记div的正确语法是什么。有人建议我使用CSS的转换函数(这是我最初提出这个问题时的正确调用)但这听起来像是我基本上要写八个独立的css片段,每行一个——这可能会变得混乱,因为可能有118张这样的图片,我要为它们编写

我想创建一个div覆盖,设置为5%不透明度,这将在图像中的每一行文本周围创建一个对角线边界框。我有绘制边界框所需的四个点中的每个点的坐标,这些点被编码为XML元素中的属性,XML元素包含单独行的文本作为其数据。在我看来,因为我有四个角的x,y坐标,我应该能够创建覆盖层——但我不知道标记div的正确语法是什么。有人建议我使用CSS的转换函数(这是我最初提出这个问题时的正确调用)但这听起来像是我基本上要写八个独立的css片段,每行一个——这可能会变得混乱,因为可能有118张这样的图片,我要为它们编写自定义的css片段

我是否错误地认为这可以通过编程实现,如果不是,有人能告诉我一些实现方法吗

是的,可以使用简单的html标记:

<div class="image_box" data-cords="20,50,210,50,50,250,240,250">I am the text inside the div, I can be in several lines. It is important for text stay vertical and it is important the text to follow boundary box.</div>

可以使用jQuery
css()
method等脚本设置css。
$.fn.skewText = function () {
    return this.each(function (i) {
        var thisText = $(this);
        var coords = thisText.data('cords').split(',');
        /* Calculate degree */
        var deg = Math.tan((coords[5] - coords[1]) / (coords[4] - coords[0])) * 57.2957795;
        /* Skew pixels for calculations */
        var skewVal = coords[4] - coords[0];
        /* Calculate position */
        var cssWidth = (coords[2] - coords[0] - skewVal) + 'px';
        var cssHeight = (coords[5] - coords[1]) + 'px';
        var cssTop = coords[1] + 'px';
        var cssLeft = (coords[0] * 1 + skewVal) + 'px'; /* Add a half of skew */
        /* Wrapp and apply styles */
        thisText.wrapInner('<div class="skew_padding" />').wrapInner('<div class="skew_text" />');
        var skewText = thisText.find('.skew_text');
        skewText.css({
            'transform': 'skew(' + deg + 'deg)',
                'top': cssTop,
                'left': cssLeft,
                'width': cssWidth,
                'height': cssHeight,
                'background': 'none rgba(0,0,0,.5)'
        });
        /* Now skew back each letter inside */
        var skewPadding = skewText.find('.skew_padding');
        var letters = skewPadding.text().split(' ');
        var newText = '<span>' + letters.join('</span> <span>') + '</span>';
        skewPadding.html(newText);
        skewPadding.find('span').css({
            'display': 'inline-block',
                'transform': 'skew(' + (-deg) + 'deg)'
        });
    });
};
$('[data-cords]').skewText();
.image_box {
    position: relative;
    width: 300px;
    height: 300px;
    background: yellow;
}
.skew_text {
    position: absolute;
}
.skew_padding {
    padding: 10px;
}